Я написал простой скрипт, предназначенный для иерархической кластеризации на простом наборе тестовых данных.
Я обнаружил, что функция fclusterdata подходит для кластеризации моих данных в два кластера.Он принимает два обязательных параметра вызова: набор данных и порог.Проблема в том, что я не смог найти порог, который привел бы к ожидаемым двум кластерам.
Я был бы счастлив, если бы кто-нибудь мог сказать мне, что я делаю неправильно.Я также был бы рад, если бы кто-нибудь мог указать на другие подходы, которые лучше подходили бы для моей кластеризации (я явно хочу не указывать количество кластеров заранее).
Вот мой код:
import time
import scipy.cluster.hierarchy as hcluster
import numpy.random as random
import numpy
import pylab
pylab.ion()
data = random.randn(2,200)
data[:100,:100] += 10
for i in range(5,15):
thresh = i/10.
clusters = hcluster.fclusterdata(numpy.transpose(data), thresh)
pylab.scatter(*data[:,:], c=clusters)
pylab.axis("equal")
title = "threshold: %f, number of clusters: %d" % (thresh, len(set(clusters)))
print title
pylab.title(title)
pylab.draw()
time.sleep(0.5)
pylab.clf()
Вот вывод:
threshold: 0.500000, number of clusters: 129
threshold: 0.600000, number of clusters: 129
threshold: 0.700000, number of clusters: 129
threshold: 0.800000, number of clusters: 75
threshold: 0.900000, number of clusters: 75
threshold: 1.000000, number of clusters: 73
threshold: 1.100000, number of clusters: 58
threshold: 1.200000, number of clusters: 1
threshold: 1.300000, number of clusters: 1
threshold: 1.400000, number of clusters: 1