Python计算各距离

###刘声龙--202001170115--湖南信息学院
from scipy.spatial import distance
import numpy as np
import math
x1 = np.array([3,4,2])
x2 = np.array([5,6,1])
x3 = np.array([2,2,4])
x4 = np.array([6,4,5])
a=[x1,x2,x3,x4]
####欧氏距离
for i in range(3):
    for j in range(i+1,4):
        a1 = np.sqrt(np.square(a[i]-a[j]))
        b=a1.tolist()
        #print(b)
        print('x{}和x{}欧氏距离测试结果是:'.format(i+1,j+1),end='')
        print(round((int(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]))**(1/2),2))
        #print('欧氏距离测试结果是:' + str(dist1))(int(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]))**(1/2)
print()
#####曼哈顿距离
for i in range(3):
    for j in range(i+1,4):
        m1 = np.sum(np.abs(a[i]-a[j]))
        #print('曼哈顿距离测试结果是:' + str(m1))
      &nbs

马氏距离是一种用于计算样本相似度的算法,主要使用在多元统计和分类学习中,它通过考虑各变量之间的相关性来对数据进行测量,因此在处理具有高相关性的数据集时效果非常好[^3]。下面为你介绍两种使用Python计算马氏距离的方法: ### 方法一:使用 `scipy.spatial.distance.mahalanobis` 函数 该方法可以直接调用 `scipy` 库中的 `mahalanobis` 函数来计算马氏距离。示例代码如下: ```python from scipy.spatial import distance import numpy as np from numpy.linalg import inv # 协方差矩阵 SIGMA = np.array([[2, 1], [1, 2]]) # 参考点 q = [0, 0] # 待计算点1 x_1 = [-3.5, -4] # 待计算点2 x_2 = [2.75, -1.5] # 计算点1到参考点的马氏距离 d_1 = distance.mahalanobis(q, x_1, inv(SIGMA)) # 计算点2到参考点的马氏距离 d_2 = distance.mahalanobis(q, x_2, inv(SIGMA)) print(d_1) print(d_2) ``` ### 方法二:自定义函数计算马氏距离 可以自定义一个函数来实现马氏距离计算,示例代码如下: ```python import numpy as np def mas_distance(target_matrix, comp1=0, comp2=-1): mas_dis = np.mat(0) C1 = np.mat(target_matrix[comp1]) C2 = np.mat(target_matrix[comp2]) P1 = C1 - C2 S = np.cov(target_matrix, rowvar=0) P2 = np.linalg.inv(S) P3 = P1.T mas_dis = P1 * P2 * P3 return np.sqrt(mas_dis[0, 0]) # 示例矩阵 # matrix = np.empty(shape=[0, 3]) # matrix = np.append(matrix, np.array([10, 15, 29]).reshape(1, 3), axis=0) # matrix = np.append(matrix, np.array([15, 46, 13]).reshape(1, 3), axis=0) # matrix = np.append(matrix, np.array([23, 21, 30]).reshape(1, 3), axis=0) # matrix = np.append(matrix, np.array([11, 9, 35]).reshape(1, 3), axis=0) # print(matrix) # 调用自定义函数计算马氏距离 # print(mas_distance(matrix, 1)) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值