2011-10-11 11 views
6

orijinal nesneleri geri almak için, bu yüzden sorunumu anlatmaya çalışacağım:Kümeleme - mesafe matrisi üzerinden kümeleri, nasıl SciPy içinde kümelenme konusunda herhangi yeterince basit öğreticiler veya açıklamalarını bulmak için dikiş olamaz

Belgeleri (hiyerarşik kümelenmiş kümeleme) kümelemeye çalışıyorum ve her belge için bir vektör oluşturup simetrik bir uzaklık matrisi oluşturdum. Vector_list, her belgeyi temsil eden (gerçekten uzun) vektörler içerir. Bu vektörler listesinin sırası, giriş belgelerinin listemdeki ile aynıdır, böylece kümelenme sonuçlarını ilgili belgeyle eşleştireceğim (umarım). diyagonal çizgi başına her belge mesafe (her zaman 0)

[0 5 4] 
[5 0 4] 
[5 4 0] 

I scipys' bağlantı() işlevi için bu mesafe matrisi besleme olduğu

distances = distance.cdist(vector_list, vector_list, 'euclidean') 

Bu, bu gibi bir matris verir.

clusters = hier.linkage(distances, method='centroid', metric='euclidean') 

bu ne olduğunu tam olarak emin değilim bir şey verir, ancak veri türü numpy.ndarray olarak çıkar. Dokümanlara göre, 'yassı kümelenmeler' elde etmek için bunu tekrar kümeleyerek besleyebilirim. Mesafe matrisindeki maksimum mesafenin yarısını eşik olarak kullanıyorum.

idx = hier.fcluster(clu,0.5*distances.max(), 'distance') 

Bu, bir daha bana anlam ifade etmeyen bir numpy.ndarray döndürür. Bir örnek [6 3 1 7 1 8 9 4 5 2]

Benim soru: o ne ben bağlantı ve fcluster fonksiyonları aldığım ve nasıl var ve geri gidebileceği anlamına İlk olarak mesafe matrisini oluşturduğum belgem, kümelerin herhangi bir anlam ifade edip etmediğini görmek için? Bunu doğru mu yapıyorum?

cevap

3

Öncelikle, sen fcluster yerine fclusterdata kullanırsanız cdist ve linkage ile tüm sürecinden geçmesi gerekmez; Bu işlev, bir (n_documents, n_features) dizi sayımı, tf-idf değerleri veya özellikleriniz ne olursa olsun besleyebilirsiniz.

fclusterdata çıkış fcluster arasında aynıdır: Bir dizi T örneğin "T[i]i ait orijinal gözlem düz küme sayısı olduğu" Yani, cluster.hierarchy modülü, kümeyi 0.5*distances.max() olarak ayarladığınız eşiğe göre düzleştirir. Durumunuzda, üçüncü ve beşinci belge birlikte kümelenir, ancak diğerlerinin tümü kendi kümelerini oluşturur, bu nedenle eşiği daha yüksek veya farklı bir criterion kullanarak ayarlamak isteyebilirsiniz.

+0

1. Bu yüzden, fclusterdata kullanırsam cdist ve linkage kullanımı gereksizdir .. beslediğim giriş cdist (vector_list), her satırın belgenin tam sözcük dağarcığına karşı karşılaştırılan metnin olduğu uzun bir sözcük sayısı vektörleri listesidir. Toplamak. Fculsterdata'yı '' özellikleriim ne olursa olsun '' (n_documents, n_features) içinde besleyebileceğimi söylediğinizde, bir dict ala (document_id: vector) yani (1: [0,0,0,1,0,2,0) demek istiyor musunuz? ])? – Eiriks

+0

2. Üçüncü ve beşinci belgenin listeye göre kümelenmiş olduğunu nasıl görüyorsunuz? [6 3 1 7 1 8 9 4 5 2]? Daha fazla yapmak istediğim, kaç tane kümenin bulunduğunu, her kümenin ne kadar büyük olduğunu, her kümede hangi metinlerin bulunduğunu ve her kümenin asaletinin ne olduğunu bilmek. T dizisinin beni oraya nasıl getirdiğini göremiyorum. T [i] 'de T i'de nerede olduğunu söylerim, sadece bir referanstır [6 3 1 7 1 8 9 4 5 2]? – Eiriks

+1

@Eiriks: 1. evet. Özelliklere göre sayısal değerleri kastediyorum. 2.Bu listenin üçüncü ve beşinci öğeleri (1-indeksli) aynı değere sahiptir. Listedeki değerler küme numaralarıdır. –

İlgili konular