Проблема с скупыми kmeans и кластерами kmeans2 в Python

У меня вопрос о kmeans kmeans и kmeans2 . У меня есть набор из 1700 lat-long точек данных. Я хочу пространственно сгруппировать их в 100 кластеров. Однако при использовании kmeans vs kmeans2 я получаю совершенно разные результаты. Можете ли вы объяснить, почему это так? Мой код ниже.

Сначала я загружаю свои данные и строю координаты. Все выглядит правильно.

 import pandas as pd, numpy as np, matplotlib.pyplot as plt from scipy.cluster.vq import kmeans, kmeans2, whiten df = pd.read_csv('data.csv') df.head() coordinates = df.as_matrix(columns=['lon', 'lat']) plt.figure(figsize=(10, 6), dpi=100) plt.scatter(coordinates[:,0], coordinates[:,1], c='c', s=100) plt.show() 

Скриншот

Затем я отбеливаю данные и запускаю kmeans() и kmeans2() . Когда я kmeans() центроиды из kmeans() , он выглядит правильно – т.е. примерно 100 точек, которые более или менее представляют местоположения полного набора данных 1700 точек.

 N = len(coordinates) w = whiten(coordinates) k = 100 i = 20 cluster_centroids1, distortion = kmeans(w, k, iter=i) cluster_centroids2, closest_centroids = kmeans2(w, k, iter=i) plt.figure(figsize=(10, 6), dpi=100) plt.scatter(cluster_centroids1[:,0], cluster_centroids1[:,1], c='r', s=100) plt.show() 

http://i.stack.imgur.com/WNi2L.png

Однако, когда я kmeans2() центроиды из kmeans2() , для меня это выглядит совершенно неудобно. Я ожидал бы, что результаты от kmeans и kmeans2 будут довольно похожи, но они совершенно разные. В то время как результат kmeans , кажется, просто пока представляет полный набор данных, результат kmeans2 выглядит почти случайным.

 plt.figure(figsize=(10, 6), dpi=100) plt.scatter(cluster_centroids2[:,0], cluster_centroids2[:,1], c='r', s=100) plt.show() 

http://i.stack.imgur.com/AhgSU.png

Вот мои значения для k и N, а также размеры массивов, полученных в результате kmeans() и kmeans2() :

 print 'k =', k print 'N =', N print len(cluster_centroids1) print len(cluster_centroids2) print len(closest_centroids) print len(np.unique(closest_centroids)) 

Вывод:

 k = 100 N = 1759 96 100 1759 17 
  • Почему len(cluster_centroids1) не будет равно k ?
  • len(closest_centroids) равно N , что кажется правильным. Но почему len(np.unique(closest_centroids)) не будет равно k ?
  • len(cluster_centroids2) равно k , но, опять же, при построении графика cluster_centroids2 , похоже, не представляет исходный набор данных, как это делает cluster_centroids1 .

Наконец, я рисую свой полный набор данных координат, окрашенный кластером.

 plt.figure(figsize=(10, 6), dpi=100) plt.scatter(coordinates[:,0], coordinates[:,1], c=closest_centroids, s=100) plt.show() 

Вы можете видеть это здесь: Скриншот

One Solution collect form web for “Проблема с скупыми kmeans и кластерами kmeans2 в Python”

Благодарим вас за хороший вопрос с образцом кода и изображениями! Это хороший вопрос новичков.

Большинство особенностей можно решить, внимательно прочитав документы. Несколько вещей:

  • Сравнивая исходный набор точек и результирующие центры кластеров, вы должны попробовать и построить их на одном и том же участке с теми же размерами (т. Е. w снова результаты). Например, зарисуйте центры кластеров с большими точками, как вы это делали, и оригинальные данные с небольшими точками поверх него.

  • kmeans и kmeans2 начинаются с разных ситуаций. kmeans2 начинается с случайного распределения точек, и поскольку ваши данные распределены неравномерно, kmeans2 сходится к неидеальному результату. Вы можете попытаться добавить ключевое слово minit='points' и посмотреть, изменились ли результаты.

  • Поскольку исходный выбор центра тяжести является плохим, только 17 из первоначальных 100 центроидов фактически имеют принадлежащие им точки (это тесно связано со случайным взглядом графа).

  • Похоже, что некоторые центроиды в kmeans могут разрушаться друг с другом, если это дает наименьшее искажение. (Это не похоже на документацию.) Таким образом, вы получите только 96 центроидов.

  • создание разреженной матрицы неизвестного размера
  • Чернильный рисунок из урны
  • CSR, несоответствие индексов и indptr
  • Привязка векторной функции с кривой_fit в Scipy
  • Python SciPy: проблема оптимизации fmin_cobyla: одно ограничение не соблюдается
  • scipy imsave сохраняет неправильные значения
  • подгонка многовариантных curve_fit в python
  • Проблема с 2D-интерполяцией в SciPy, непрямоугольная сетка
  • Python - лучший язык программирования в мире.