Я написал свой собственный алгоритм кластеризации (плохой, я знаю) для своей проблемы. Он работает хорошо, но может работать быстрее.Оптимизация кластеризации в Python
Алгоритм принимает список значений (1D), как на входе, и работает следующим образом:
- Для каждого кластера, вычислить расстояние до ближайшего соседнего кластера
- Выберите кластер А, который имеет наименьшее расстояние до соседа в
- Если расстояние между а и в меньше, то пороговое значение, возвращаемое
- Зерноуборочный а и Б
- Гото 1.
я, наверное, заново колесо здесь ..
Это мой скотина код Фос, как сделать это быстрее? Я SciPy и Numpy установлен, если есть что-то готовое
#cluster center as simple average value
def cluster_center(cluster):
return sum(cluster)/len(cluster)
#Distance between clusters
def cluster_distance(a, b):
return abs(cluster_center(a) - cluster_center(b))
while True:
cluster_distances = []
#If nothing to cluster, ready
if len(clusters) < 2:
break
#Go thru all clusters, calculate shortest distance to neighbor
for cluster in clusters:
cluster_distances.append((cluster, sorted([(cluster_distance(cluster, c), c) for c in clusters if c != cluster])[0]))
#Find out closest pair
cluster_distances.sort(cmp=lambda a,b:cmp(a[1], b[1]))
#Check if distance is under threshold 15
if cluster_distances[0][1][0] < 15:
a = cluster_distances[0][0]
b = cluster_distances[0][1][1]
#Combine clusters (combine lists)
a.extend(b)
#Form a new cluster list
clusters = [c[0] for c in cluster_distances if c[0] != b]
else:
break
Я не знаю, с чего начать, но, к счастью, кто-то еще может: https://code.google.com/p/scipy-cluster/ и http://glowingpython.blogspot.com/2012/04/k -means-clustering-with-scipy.html – mdscruggs
K-означает, что кластеризация требует знания количества кластеров, а с scipy-cluster я не знаю, с чего начать :) – Harriv
Вы изобретаете агломеративную кластеризацию? Посмотрите: http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering – M456