Я учу 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 () не работает должным образом, и мой набор данных тоже изменился.Я совсем запутался, кто-нибудь может мне помочь?