如何切换Scipy distance_matrix的距离计算方式(欧氏/曼哈顿等)?
切换Scipy distance_matrix的距离计算方式
首先明确:scipy.spatial.distance_matrix默认使用的就是欧氏距离,你觉得没用到可能是误解了。如果要切换其他距离类型,只需要给函数指定metric参数即可,不同距离的设置方式如下:
1. 显式指定欧氏距离
虽然是默认值,也可以显式声明,代码示例:
from scipy.spatial import distance_matrix import pandas as pd # 你的坐标DataFrame df = pd.DataFrame({'x': [50,18,6,30,44,81], 'y': [50,83,21,13,29,68]}) # 显式使用欧氏距离生成距离矩阵 DistMatrix_euclidean = round(pd.DataFrame( distance_matrix(df.values, df.values, metric='euclidean'), index=df.index, columns=df.index ), 1)
2. 曼哈顿距离(城市街区距离)
使用metric='cityblock'参数切换:
# 曼哈顿距离计算 DistMatrix_manhattan = round(pd.DataFrame( distance_matrix(df.values, df.values, metric='cityblock'), index=df.index, columns=df.index ), 1)
3. 马氏距离
马氏距离需要额外传入协方差矩阵的逆矩阵,通过VI参数指定:
import numpy as np # 计算数据集协方差矩阵的逆 cov_inv = np.linalg.inv(df.cov()) # 马氏距离计算 DistMatrix_mahalanobis = round(pd.DataFrame( distance_matrix(df.values, df.values, metric='mahalanobis', VI=cov_inv), index=df.index, columns=df.index ), 1)
其他常用距离选项
除上述类型外,还可指定以下距离:
- 切比雪夫距离:
metric='chebyshev' - 闵可夫斯基距离:
metric='minkowski'(可通过p参数指定阶数,p=2等价于欧氏距离,p=1等价于曼哈顿距离)
内容的提问来源于stack exchange,提问作者Yannis_Tr
相关产品推荐
相关产品推荐

