我正在对我的数据(1500x2矩阵)运行以下python代码段,并尝试从头开始实现KMeans算法:-
/app/views/foo/bar.html
当我比较各点的欧式距离时,错误发生在第def closestCentroids(arr, centroids):
idx = np.zeros(arr.shape[0]);
for i in range(0, arr.shape[0]):
idx[i] = 0
for j in range(0, centroids.shape[0]):
if(np.linalg.norm(arr[i]-centroids[j]) < np.linalg.norm(arr[i]-centroids[idx[i]])):
idx[i] = j
return idx
def computeCentroids(arr, idx, k = 3):
centroids = np.zeros((k, arr.shape[1]))
for i in range(0, k):
idx_k = (idx==i).sum()
centroids[i] = (arr[np.where(idx == i)].sum(axis=0))/idx_k
return centroids
def kMeans(arr, k = 3):
centroids = arr[np.random.randint(arr.shape[0], size = k), :]
idx = np.zeros(arr.shape[0])
for i in range(0, 50):
idx = closestCentroids(arr, centroids)
centroids = computeCentroids(arr, idx, k=3)
return centroids
行。我不知道我要去哪里错了。
答案 0 :(得分:1)
默认情况下,numpy.zeros()
创建一个浮点值数组,因此您的数组idx
是一个浮点数组。您使用idx
的值来索引数组centroids
,而numpy不允许使用浮点值进行索引,因此idx
必须是整数数组。
将idx
的创建更改为
idx = np.zeros(arr.shape[0], dtype=int)