提问人:guguzinha 提问时间:11/16/2023 最后编辑:Tsyvarevguguzinha 更新时间:11/17/2023 访问量:49
如何从 pandas 数据帧创建内核矩阵?
How to create a kernel matrix from a pandas dataframe?
问:
我有一个 pandas 数据帧,其中行是观测值(数据点),列是特征。我想使用高斯内核从此数据帧创建内核矩阵。因此,我需要计算每个数据点(行)组合的核函数。如何在不使用 for 循环的情况下在 python 中以有效的方式做到这一点?
我尝试使用for循环,但效率极低。我想我可能应该使用 numpy 的广播功能,但我不知道如何使用它。
答:
好的,首先你需要用numpy计算每行的平方长度,为此,将你的数据库转换为NumPy数组,然后像这样计算每行的平方范数
squared_norm = np.sum(X**2, axis=1)
squared_norm X**2 对数组 X 中的每个元素进行平方。np.sum(..., axis=1) 沿行 (axis=1) 对这些平方值求和。squared_norm 中的每个元素都是 X 中相应行的特征的平方和。
然后计算欧几里得距离矩阵的平方
distance_matrix = squared_norm[:, np.newaxis] + squared_norm - 2 * np.dot(X, X.T)
squared_norm[:, np.newaxis] 将squared_norm调整为列向量。 squared_norm(由于广播而产生的行向量)和 squared_norm[:, np.newaxis](列向量)相加。这种加法应用了广播,产生了一个矩阵,其中每个元素 (i, j) 是行 i 和行 j 的平方范数之和。np.dot(X, X.T) 通过其转置计算 X 的矩阵积,从而给出 X 中所有行对之间的点积矩阵。
您需要定义高斯卡内尔副原子 (sigma)
sigma = 1.0 # Adjust this based on your data
应用高斯核
kernel_matrix = np.exp(-distance_matrix / (2 * sigma**2))
这种方法非常有效,并利用 NumPy 的功能进行矢量化操作,使其适用于处理大型数据集,而无需显式 Python 循环。您可以在此处找到其他信息: 链接链接-2 链接-3
上一个:指定矩阵形状
评论
apply()