如何从 pandas 数据帧创建内核矩阵?

How to create a kernel matrix from a pandas dataframe?

提问人:guguzinha 提问时间:11/16/2023 最后编辑:Tsyvarevguguzinha 更新时间:11/17/2023 访问量:49

问:

我有一个 pandas 数据帧,其中行是观测值(数据点),列是特征。我想使用高斯内核从此数据帧创建内核矩阵。因此,我需要计算每个数据点(行)组合的核函数。如何在不使用 for 循环的情况下在 python 中以有效的方式做到这一点?

我尝试使用for循环,但效率极低。我想我可能应该使用 numpy 的广播功能,但我不知道如何使用它。

Python 数据帧 矩阵 高斯

评论

0赞 Owen 11/16/2023
嘿,你应该看看 DataFrame 方法 pandas.pydata.org/docs/reference/api/......apply()
0赞 Community 11/19/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。

答:

0赞 r-log 11/16/2023 #1

好的,首先你需要用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