K-означает кластеризацию с нуля в Python - переосмысление центроидов

1

Я пытаюсь сделать кластер K-Means с нуля в Python. Вот мой код, есть проблема с тем, как я переопределяю центроиды

Это я получаю:

Iteration 1:
[1.5, 8.1] [8.04, 1.525]
Iteration 2:
[4.98, 4.05] [2.87, 4.09]
Iteration 3:
[9.29, 8.28] [8.57, 7.87]
Iteration 4:
[9.97, 8.94] [inf, inf]

Заранее спасибо!

# Example dataset
data = pd.DataFrame({'x' : [6.480, 7.320, 4.380, 8.040, 7.680, 6.600, 6.420, 5.940, 4.140, 5.700,
                            7.500, 7.620, 6.840, 7.500, 4.920, 3.780, 7.860, 4.260, 7.980, 6.840,
                            3.025, 2.300, 3.250, 2.975, 3.325, 1.500, 1.875, 2.850, 1.600, 2.525,
                            2.900, 2.175, 2.050, 1.650, 2.250, 3.475, 1.800, 2.975, 3.025, 2.175 ],

                     'y' : [6.300, 5.220, 6.060, 4.560, 7.080, 4.740, 3.660, 4.680, 4.800, 5.880,
                            8.100, 7.800, 3.900, 6.780, 4.860, 5.100, 4.380, 5.160, 5.520, 5.700,
                            2.125, 3.475, 2.500, 2.875, 2.075, 3.350, 1.525, 3.050, 2.950, 2.150, 
                            2.125, 2.550, 3.375, 1.950, 1.700, 2.400, 2.525, 2.525, 2.675, 3.325]})

data['Cluster'] = 0
data['EuclideanDist1'] = 0
data['EuclideanDist2'] = 0
data['EuclideanDistD'] = 0   

iterations = 0

C1nx = C1ny =  0
C2nx = C2ny =  0
C1c = 0
C2c = 0

C1 = [min(data['x']), max(data['y'])]
C2 = [max(data['x']), min(data['y'])]

count = 0

while(iterations < 40):
    print(C1, C2)    
    for count in range(0, len(data)-1):

        data['EuclideanDist1'][count] = ((data['x'][count] - C1[0])**2 + (data['y'][count] - C1[1])**2)**(0.5)
        data['EuclideanDist2'][count] = ((data['x'][count] - C2[0])**2 + (data['y'][count] - C2[1])**2)**(0.5)
        data['EuclideanDistD'][count] = data['EuclideanDist1'] [count]- data['EuclideanDist2'][count]  


        if data['EuclideanDistD'][count] >= 0:
            data['Cluster'][count] = 1
            C1nx = C1nx + data['x'][count]
            C1ny = C1ny + data['y'][count]
            C1c = C1c + 1

        elif data['EuclideanDistD'][count] < 0:
            data['Cluster'][count] = 2
            C2nx = C2nx + data['x'][count]
            C2ny = C2ny + data['y'][count]       
            C2c = C2c + 1

    C1[0] = (C1nx / C1c)
    C1[1] = (C1ny / C1c)
    C2[0] = (C2nx / C2c)
    C2[1] = (C2ny / C2c)

    C1n = [0,0]
    C2n = [0,0]
    C1c = 0
    C2c = 0

    iterations = iterations + 1
  • 0
    Можете ли вы указать версии, которые вы используете? Когда я запускаю ваш код на Python 3.4.5, я не получаю меток Iteration . После первого массива 2x2 я получаю множество предупреждений Pandas, а затем ошибку переполнения, преобразующую число с плавающей точкой в целое число.
  • 0
    Я делаю это в Try Jupyter: Python 3.6.5 | упаковано в conda-forge | (по умолчанию, 6 апреля 2018 г., 13:39:56) [GCC 4.8.2 20140120 (Red Hat 4.8.2-15)]
Показать ещё 1 комментарий
Теги:
machine-learning
k-means
cluster-analysis

1 ответ

1
  1. K-средство не использует евклидово расстояние. Удалите sqrt.
  2. Кластеры могут стать пустыми при плохих стартовых условиях. Затем вы получаете деление на 0 и значения NaN.
  3. Вы ошибаетесь. Вы назначаете каждую точку в самый дальний кластер, поэтому вы всегда сталкиваетесь с проблемой выше. Кроме того, увеличение k> 2 будет непросто.

Избегайте поиска в стеке [a][b] внутри петель. Это не очень читаемо и медленно. Используйте локальные переменные соответствующим образом. Поскольку Python довольно медленный в режиме интерпретатора, попробуйте использовать операции с векторизованными numpy, где это возможно, чтобы извлечь выгоду из их более быстрого кода C/Fortran.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню