gpt4 book ai didi

python - 使用numpy对矩阵进行距离计算

转载 作者:太空宇宙 更新时间:2023-11-04 10:57:13 24 4
gpt4 key购买 nike

我正在尝试在 Python 中实现 K-means 算法(我知道有相应的库,但我想自己学习如何实现它。)这是我遇到问题的函数:

def AssignPoints(points, centroids):
"""
Takes two arguments:
points is a numpy array such that points.shape = m , n where m is number of examples,
and n is number of dimensions.

centroids is numpy array such that centroids.shape = k , n where k is number of centroids.
k < m should hold.

Returns:
numpy array A such that A.shape = (m,) and A[i] is index of the centroid which points[i] is assigned to.
"""

m ,n = points.shape
temp = []
for i in xrange(n):
temp.append(np.subtract.outer(points[:,i],centroids[:,i]))
distances = np.hypot(*temp)
return distances.argmin(axis=1)

此函数的目的,给定 n 维空间中的 m 个点和 n 维空间中的 k 个质心,生成一个 (x1 x2 x3 x4 ... xm) 的 numpy 数组,其中 x1 是最接近的质心索引第一点。这工作正常,直到我用 4 维示例尝试它。当我尝试放置 4 维示例时,出现此错误:

  File "/path/to/the/kmeans.py", line 28, in AssignPoints
distances = np.hypot(*temp)
ValueError: invalid number of arguments

我该如何解决这个问题,或者如果我不能,您建议我如何计算我在这里尝试计算的内容?

我的回答

def AssignPoints(points, centroids):
m ,n = points.shape
temp = []
for i in xrange(n):
temp.append(np.subtract.outer(points[:,i],centroids[:,i]))
for i in xrange(len(temp)):
temp[i] = temp[i] ** 2
distances = np.add.reduce(temp) ** 0.5
return distances.argmin(axis=1)

最佳答案

试试这个:

np.sqrt(((points[np.newaxis] - centroids[:,np.newaxis]) ** 2).sum(axis=2)).argmin(axis=0)

或者:

diff = points[np.newaxis] - centroids[:,np.newaxis]
norm = np.sqrt((diff*diff).sum(axis=2))
closest = norm.argmin(axis=0)

不要问它在做什么 :D

编辑:不,开玩笑的。中间的广播 (points[np.newaxis] - centroids[:,np.newaxis]) 是从原始数组“制作”两个 3D 数组。结果是每个“平面”包含所有点和一个质心之间的差异。我们称它为差异

然后我们进行通常的操作来计算欧氏距离(差的平方的平方根):np.sqrt((diffs ** 2).sum(axis=2))。我们最终得到一个 (k, m) 矩阵,其中第 0 行包含到 centroids[0] 等的距离。因此,.argmin(axis= 0) 给你你想要的结果。

关于python - 使用numpy对矩阵进行距离计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8827338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com