массив numpy был изменен в numpy.mean () - PullRequest
1 голос
/ 04 апреля 2019

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

...