Одна из проблем, с которой вы столкнетесь при использовании scipy.cluster.vq.kmeans
, заключается в том, что эта функция использует евклидово расстояние для измерения близости.Чтобы объединить вашу проблему в единую разрешимую с помощью k-means
кластеризацию, вам нужно найти способ преобразовать ваши строки в числовые векторы и уметь оправдать использование евклидова расстояния в качестве разумной меры близости.
Это кажется ... сложным.Возможно, вы ищете расстояние Левенштейна вместо?
Обратите внимание, что есть варианты алгоритма K-средних , которые могут работать с неевклидовыми метриками расстояния (такими как Левенштейнрасстояние).K-medoids
(он же PAM), например, может применяться к данным с произвольной метрикой расстояния .
Например, с использованием реализации Pycluster
* k-medoids
и nltk
реализация расстояния Левенштейна,
import nltk.metrics.distance as distance
import Pycluster as PC
words = ['apple', 'Doppler', 'applaud', 'append', 'barker',
'baker', 'bismark', 'park', 'stake', 'steak', 'teak', 'sleek']
dist = [distance.edit_distance(words[i], words[j])
for i in range(1, len(words))
for j in range(0, i)]
labels, error, nfound = PC.kmedoids(dist, nclusters=3)
cluster = dict()
for word, label in zip(words, labels):
cluster.setdefault(label, []).append(word)
for label, grp in cluster.items():
print(grp)
дает результат, подобный
['apple', 'Doppler', 'applaud', 'append']
['stake', 'steak', 'teak', 'sleek']
['barker', 'baker', 'bismark', 'park']