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

 

前言

最近需要写关于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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值