python - 构造相似度矩阵的最有效方法

标签 python numpy pandas matrix scipy

我正在使用以下链接创建“欧几里德相似度矩阵”(我将其转换为 DataFrame)。 https://stats.stackexchange.com/questions/53068/euclidean-distance-score-and-similarity http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.distance.euclidean.html

我这样做的方式是一种有效的迭代方法,但当数据集很大时需要一段时间。 pandas pd.DataFrame.corr() 对于 PIL 逊相关性来说非常快速且有用。

如何在不进行穷举迭代的情况下执行欧几里得相似性度量?

下面是我天真的代码:

#Euclidean Similarity

#Create DataFrame
DF_var = pd.DataFrame.from_dict({"s1":[1.2,3.4,10.2],"s2":[1.4,3.1,10.7],"s3":[2.1,3.7,11.3],"s4":[1.5,3.2,10.9]}).T
DF_var.columns = ["g1","g2","g3"]
#      g1   g2    g3
# s1  1.2  3.4  10.2
# s2  1.4  3.1  10.7
# s3  2.1  3.7  11.3
# s4  1.5  3.2  10.9

#Create empty matrix to fill
M_euclid = np.zeros((DF_var.shape[1],DF_var.shape[1]))

#Iterate through DataFrame columns to measure euclidean distance
for i in range(DF_var.shape[1]):
    u = DF_var[DF_var.columns[i]]
    for j in range(DF_var.shape[1]):
        v = DF_var[DF_var.columns[j]]
        #Euclidean distance -> Euclidean similarity
        M_euclid[i,j] = (1/(1+sp.spatial.distance.euclidean(u,v)))
DF_euclid = pd.DataFrame(M_euclid,columns=DF_var.columns,index=DF_var.columns)

#           g1        g2        g3
# g1  1.000000  0.215963  0.051408
# g2  0.215963  1.000000  0.063021
# g3  0.051408  0.063021  1.000000

最佳答案

scipy.spatial.distance 中有两个有用的函数可以用于此目的:pdistsquareform .使用 pdist 将以一维数组的形式提供观察值之间的成对距离,而 squareform 会将其转换为距离矩阵。

一个问题是 pdist 默认使用距离度量,而不是相似度,因此您需要手动指定相似度函数。从您代码中的注释输出来看,您的 DataFrame 也不在 pdist 期望的方向,因此我撤消了您在代码中所做的转置。

import pandas as pd
from scipy.spatial.distance import euclidean, pdist, squareform


def similarity_func(u, v):
    return 1/(1+euclidean(u,v))

DF_var = pd.DataFrame.from_dict({"s1":[1.2,3.4,10.2],"s2":[1.4,3.1,10.7],"s3":[2.1,3.7,11.3],"s4":[1.5,3.2,10.9]})
DF_var.index = ["g1","g2","g3"]

dists = pdist(DF_var, similarity_func)
DF_euclid = pd.DataFrame(squareform(dists), columns=DF_var.index, index=DF_var.index)

关于python - 构造相似度矩阵的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35758612/

相关文章:

python - python pandas 如何在不同列中找到不重复的值?

python - MySQL 查询 - 选择具有 2 个特定 DISTINCT 列值的 2 行

python - 如何在 python 中制作衰减振荡函数?

python - 为 Pandas 系列的 float 分配日期

python - pandas.DataFrame.to_json() 的 'orient' 参数的格式是什么?

python - Matplotlib - x 轴与日期时间之间的间隔不均匀

python - 限制 map 正交投影的纬度延伸

python - interpolate.griddata 只使用一个核心

python - 对大型 scipy 稀疏矩阵进行快速列访问

python - 如何解决 sns.pairplot 错误 Selected KDE bandwidth is 0. Cannot estimate density”?