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

发布于 2021-01-29 16:05:29

我正在使用以下链接创建“欧几里得相似度矩阵”(将其转换为DataFrame)。
https://stats.stackexchange.com/questions/53068/euclidean-distance-score-and-
similarity

http://docs.scipy.org/doc/scipy-0.14.0/reference/generation/scipy.spatial.distance
.euclidean.html

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

没有详尽的迭代如何执行欧几里得相似性度量?

我的天真代码如下:

#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
关注者
0
被浏览
152
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看