不了解这些运行时警告 k 均值聚类向量量化



我正在尝试实现K-Means聚类算法,但是我经常收到以下错误

C:UsersandreAppDataRoamingPythonPython37site-packagesnumpycorefromnumeric.py:3257:
RuntimeWarning: Mean of empty slice.
out=out, **kwargs)
C:UsersandreAppDataRoamingPythonPython37site-packagesnumpycore_methods.py:161:
RuntimeWarning: invalid value encountered in double_scalars
ret = ret.dtype.type(ret / rcount)

我将问题追溯到代码中试图通过取平均值来找到新质心的部分。"点"将变成一个空数组,导致我陷入while循环中。我不明白为什么。

import numpy as np
from copy import deepcopy
def compute_euclidean_distance(vec1,vec2,ax):
return np.linalg.norm(vec1 - vec2, axis = ax)
def initalise_centroids(dataset, k):
rand_x = np.random.randint(np.min(dataset),np.max(dataset), size =k)
rand_y = np.random.randint(np.min(dataset),np.max(dataset), size =k)
centroids = np.array(list(zip(rand_x,rand_y)), dtype=np.float32)
return centroids
def kmeans(dataset, k):
err = 0
cent = initalise_centroids(dataset,k)
cOld = np.zeros(cent.shape)
clusters = np.zeros(len(dataset))
err = compute_euclidean_distance(cent, cOld, None)
count = 0
while err !=0:
for i in range(len(dataset)):
dist = compute_euclidean_distance(dataset[i], cent, 1)
cluster = np.argmin(dist)
clusters[i] = cluster
cOld= deepcopy(cent)
for i in range(k):
points = [dataset[j] for j in range(len(dataset)) if clusters [j] == i ]
cent[i] = np.mean(points,axis =0)
err = compute_euclidean_distance(cent, cOld, None)
print(err)
count +=1
return cent,clusters,err

我注意到两件事:

  1. 您的循环while err != 0很可能永远不会到达。 通常,用户会设置一个错误阈值,以便当实际错误低于该值时,循环将退出。 在 Sklearn 的 Kmeans 文档中,您可以在tol参数中看到这一点。
  2. 您的第二个for loop假定每个聚类都分配了一些点。情况可能并非如此。 例如,我使用以下输入[(1,100),(1,100),(100,100)], 2运行您的代码。 您可能会认为该算法将收敛为前两个点和最后一个点的两个聚类。
    但是当算法首次初始化随机聚类中心时,它分配了[[29,78],[62,25]]。 在这种情况下,我所有的点一开始都被分配到集群0
    所以,当你的第二个循环遍历range(k)的所有值时,没有聚类1的点,这就是为什么你可能会在输出中看到nan值。

您可能需要查看其他集群中心初始化算法,如 k-means++

希望对您有所帮助!

最新更新