Pertanyaan Bagaimana Anda memvisualisasikan pohon lingkungan dari sklearn.cluster.ward_tree?


Dalam sklearn ada satu algoritma pengelompokan agglomerative diimplementasikan, metode ward meminimalkan varians. Biasanya sklearn didokumentasikan dengan banyak contoh penggunaan yang bagus, tetapi saya tidak dapat menemukan contoh bagaimana menggunakan fungsi ini.

Pada dasarnya masalah saya adalah menggambar dendrogram sesuai dengan pengelompokan data saya, tetapi saya tidak mengerti keluaran dari fungsi tersebut. Itu dokumentasi mengatakan bahwa ia mengembalikan anak-anak, jumlah komponen, jumlah daun dan orang tua dari setiap simpul.

Namun untuk sampel data saya, hasilnya tidak memberi arti. Untuk matriks (32,542) yang telah dikelompokkan dengan matriks konektivitas, ini adalah keluarannya:

>>> wt = ward_tree(mymat, connectivity=connectivity, n_clusters=2)

>>> mymat.shape
(32, 542)
>>> wt
(array([[16,  0],
       [17,  1],
       [18,  2],
       [19,  3],
       [20,  4],
       [21,  5],
       [22,  6],
       [23,  7],
       [24,  8],
       [25,  9],
       [26, 10],
       [27, 11],
       [28, 12],
       [29, 13],
       [30, 14],
       [31, 15],
       [34, 33],
       [47, 46],
       [41, 40],
       [36, 35],
       [45, 44],
       [48, 32],
       [50, 42],
       [38, 37],
       [52, 43],
       [54, 39],
       [53, 51],
       [58, 55],
       [56, 49],
       [60, 57]]), 1, 32, array([32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,     45, 46, 47, 32,
       33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 53, 48,
   48, 51, 51, 55, 55, 57, 50, 50, 54, 56, 52, 52, 49, 49, 53, 60, 54,
   58, 56, 58, 57, 59, 60, 61, 59, 59, 61, 61]))

Dalam hal ini saya meminta dua kluster, dengan 32 vektor yang mengandung fitur. Tetapi bagaimana dua kelompok terlihat dalam data? Dimana mereka? Dan apa arti anak-anak di sini, bagaimana anak-anak dapat memiliki angka yang lebih tinggi daripada jumlah total sampel?


8
2018-02-28 21:45


asal


Jawaban:


Tentang argumen pertama output, kata dokumentasi

Anak-anak dari setiap node non-daun. Nilai yang kurang dari n_samples merujuk   ke daun pohon. Nilai yang lebih besar saya menunjukkan sebuah simpul dengan   anak-anak anak-anak [i - n_samples].

Saya mengalami kesulitan dalam memahami apa artinya ini, tetapi kemudian kode ini membantu. Kami menghasilkan data terdistribusi normal dengan dua "kelompok", satu dengan 3 titik data dengan rata-rata 0, dan satu dengan 2 titik data dengan rata-rata 100. Jadi kami berharap bahwa 3 titik data pertama akan berakhir di satu cabang dari pohon keluaran dan yang 2 lainnya di yang lain.

from sklearn.cluster import ward_tree
import numpy as np
import itertools
X = np.concatenate([np.random.randn(3, 10), np.random.randn(2, 10) + 100])
w = ward_tree(X)
ii = itertools.count(w[2])
[{'node_id': next(ii), 'left': x[0], 'right':x[1]} for x in w[0]]

Yang menghasilkan pohon:

[{'node_id': 5, 'right': 2, 'left': 1},
 {'node_id': 6, 'right': 4, 'left': 3}, 
 {'node_id': 7, 'right': 5, 'left': 0}, 
 {'node_id': 8, 'right': 7, 'left': 6}]

di mana angka-angka adalah id node. Jika node_id <5 (jumlah sampel) maka itu adalah indeks ke titik data (atau simpul daun). Jika node_id> = 5 maka itu adalah node internal. Kami melihat bahwa kelompok data seperti yang diharapkan:

         8
     /       \
    7         \  
   / \         \
  5   \         6
 / \   \       / \
1   2   0     3   4

5
2017-10-01 23:09