OpenCV KMeans (K-Means) Python Количество выходных кластеров проблема - PullRequest
3 голосов
/ 02 апреля 2011

Я использую интерфейс Python OpenCV для кластеризации K-Means многомерных данных (обычно размерность 7).Я получаю странные результаты для кластеров.При запросе n-кластеров (индекс от 0 до n) некоторым кластерам не назначаются точки, что приводит к меньшему количеству кластеров, чем ожидалось.Кто-нибудь успешно использовал реализацию OpenCV для Python K-Means?Некоторый пользовательский опыт или совет был бы наиболее полезным.

Вот фрагмент кода моей реализации Python:

points = cv.CreateMat(dim1, dim2, cv.CV_32FC2)
clusters = cv.CreateMat(dim1, 1, cv.CV_32SC1)
for a in range(0,dim0):
   for b in range(0,dim1):
       for c in range(0,dim2):
           #print float(list[a*dim1*dim2 + b*dim2 + c])
           cv.Set2D( points, b, c, float(list[a*dim1*dim2 + b*dim2 + c]) )
cv.KMeans2(points, numClusters, clusters, (cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 100000, 0.00000001), 50)

for d in range(0,dim1):
    f.write(str(int(clusters[d,0])))
    f.write(' ')
    f.write('\n')

С уважением,

Стефан

1 Ответ

0 голосов
/ 14 июня 2012

Это может быть желательным свойством, и оно варьируется от реализации к реализации.

Как это происходит : при случайной инициализации или при использовании итераций Ллойда онможет случиться так, что кластер потеряет все свои объекты.В MacQueen k-означает, что он всегда должен содержать хотя бы один объект.Предположим, что в 1d есть (среди прочего) объекты в 1 и 2, назначенные кластеру c1.Кластер с1 имеет среднее значение 1,5.Теперь, если есть два других кластера, среднее значение которых переместится на 0,6 и 2,4, эти два объекта будут переназначены, и кластер c1 внезапно станет пустым.

Почему это может быть желательно : при условии, что вы заранее не знаете лучшего значения для k, вы можете просто решить выбрать слишком большое k и посмотреть, не выродятся ли некоторые из кластеров.

Скорее всего, это такоднако укажите, что ваш набор данных просто не работает с k-means.K-means на самом деле довольно придирчив, удивительно, как часто он все еще работает достаточно удовлетворительно.В целом, k-means не любит кластеры, которые различаются по размеру, но близки друг к другу.Потому что k-means всегда будет делиться посередине!Кроме того, в вашем конкретном случае, k, вероятно, слишком сильно .

Вот одномерная иллюстрация ситуации, которая не нравится k-средних: (A и B - объектих кластеров; вторая строка указывает истинное среднее значение и среднее разделение между двумя средними значениями. Тогда k-means переназначит и разделит еще дальше влево.

AAAAAAAAAAAAA BBBBB
      A    |    B
...