我最近正在学习Kmeans。但是当我运行python代码时,数据集意外更改了。
通过使用numpy.mean()
语句,我设法将问题定位到称为assert()
的一行代码中。我试图将np.array
的数据类型更改为np.float
,但是没有用。我还打印了一些数据,它表明np.mean()
无法正常工作。
我的原始数据集:
array([[0, 0],
[3, 3],
[1, 0],
[4, 4],
[4, 5],
[5, 4],
[5, 5]])
我的代码如下所示。 init_centroids()
返回数据集的前k个元素。is_converged()
比较两个np.array。 distance()
返回两个向量的距离^ 2(平方距离)。
def k_mean(data, k):
factor = data.shape[1]
n = data.shape[0]
label = np.zeros(n, dtype=np.int)
centroids = init_centroids(data, k)
old_centroids = np.zeros((k, factor), dtype=np.float)
while not is_converged(centroids, old_centroids):
assert((data == const_data).all())
for i in range(n):
min = np.inf
for j in range(k):
d = distance(centroids[j], data[i])
if min > d:
label[i] = j
min = d
assert((data == const_data).all())
old_centroids = np.copy(centroids)
assert((data == const_data).all())
print(old_centroids, data[label==0], data[label==1])
for m in range(k):
centroids[m] = np.mean(data[label==m], axis=0, dtype=np.float)
print(m, "\n", centroids[m], "\n", data[label==m])
assert((data == const_data).all()) // stopped here
return label, centroids
data = np.array([[0,0],[0,1],[1,0],[4,4],[4,5],[5,4],[5,5]])
const_data = np.copy(data)
label, centroids = k_mean(data, 2)
输出如下所示:
[[0 0]
[0 1]] [[0 0]
[1 0]] [[0 1]
[4 4]
[4 5]
[5 4]
[5 5]]
0
[0 0]
[[0 0]
[1 0]]
1
[3 3]
[[3 3]
[4 4]
[4 5]
[5 4]
[5 5]]
然后,在代码退出函数AssertionError
的最后一个for
循环之后,它立即得到k_mean()
。从输出中,我发现np.mean()无法按预期工作,并且我的数据集也发生了变化。
我很困惑,有人可以帮我吗?