其他分享
首页 > 其他分享> > 矩阵运算实现求样本与样本之间欧式距离

矩阵运算实现求样本与样本之间欧式距离

作者:互联网

 

前言

最近需要写关于kmeans的一些小程序,需要计算距离,直接写for循环又特别慢,再要是样本多一点,那简直了。细细一想,需要计算距离的地方还真不少,kmeans、KNN、图等等。

1. 理论指导

小学学过的公式,开平方: ( a − b ) 2 = a 2 + b 2 − 2 a b (a-b)^2 = a^2+b^2-2ab (a−b)2=a2+b2−2ab,这里无非是转换成其矩阵形式。

假设现在有两个矩阵,分别是A和B,分别包含2个和3个样本,每个样本有三个特征:

img

2019-08-06-28

先求ABT:

IMG

然后分别对A和B中的每个样本求其向量的模平方,也就是每个特征平方求和,最后广播(复制)成2*3的矩阵,与ABT形状一致。

img

最后:

img

2. python 矩阵计算

import numpy as np
from scipy.spatial.distance import pdist, squareform

def EuclideanDistances(A, B):
    BT = B.transpose()
    vecProd = np.dot(A, BT)
    SqA = A ** 2
    sumSqA = np.matrix(np.sum(SqA, axis=1))
    sumSqAEx = np.tile(sumSqA.transpose(), (1, vecProd.shape[1]))

    SqB = B ** 2
    sumSqB = np.sum(SqB, axis=1)
    sumSqBEx = np.tile(sumSqB, (vecProd.shape[0], 1))

    SqED = sumSqBEx + sumSqAEx - 2 * vecProd
    ED = np.sqrt(SqED)
    return ED

A = np.random.randint(0, 255, (2, 3))

# 自己写的函数
dis = EuclideanDistances(A, A)
print(dis)

# scipy定义的函数
X = pdist(A, 'euclidean') # 这个的结果是仅包含下三角的一维向量,需要用下面的函数展开成二维对称矩阵
Y = squareform(X, force='no', checks=True)
print(Y)

# result:完全一致
[[  0.        143.6279917]
 [143.6279917   0.       ]]
[[  0.        143.6279917]
 [143.6279917   0.       ]]

原文链接:https://blog.csdn.net/xijuezhu8128/article/details/111163569

标签:vecProd,样本,矩阵,BT,np,欧式,143.6279917
来源: https://blog.csdn.net/javastart/article/details/115431596