Jak wykreślić dane wyjściowe klastrowania?

15

Próbowałem grupować zestaw danych (zestaw znaków) i otrzymałem 2 klastry. Chciałbym to przedstawić graficznie. Trochę zdezorientowany co do reprezentacji, ponieważ nie mam współrzędnych (x, y).

Poszukuję również do tego celu MATLAB / Python.

EDYTOWAĆ

Myślę, że publikowanie danych wyjaśnia pytanie. Mam dwa klastry, które utworzyłem za pomocą klastrowania kmeans w Pythonie (nie używając scipy). Oni są

class 1: a=[3222403552.0, 3222493472.0, 3222491808.0, 3222489152.0, 3222413632.0, 
3222394528.0, 3222414976.0, 3222522768.0, 3222403552.0, 3222498896.0, 3222541408.0, 
3222403552.0, 3222402816.0, 3222588192.0, 3222403552.0, 3222410272.0, 3222394560.0, 
3222402704.0, 3222298192.0, 3222409264.0, 3222414688.0, 3222522512.0, 3222404096.0, 
3222486720.0, 3222403968.0, 3222486368.0, 3222376320.0, 3222522896.0, 3222403552.0, 
3222374480.0, 3222491648.0, 3222543024.0, 3222376848.0, 3222403552.0, 3222591616.0, 
3222376944.0, 3222325568.0, 3222488864.0, 3222548416.0, 3222424176.0, 3222415024.0, 
3222403552.0, 3222407504.0, 3222489584.0, 3222407872.0, 3222402736.0, 3222402032.0, 
3222410208.0, 3222414816.0, 3222523024.0, 3222552656.0, 3222487168.0, 3222403728.0, 
3222319440.0, 3222375840.0, 3222325136.0, 3222311568.0, 3222491984.0, 3222542032.0, 
3222539984.0, 3222522256.0, 3222588336.0, 3222316784.0, 3222488304.0, 3222351360.0, 
3222545536.0, 3222323728.0, 3222413824.0, 3222415120.0, 3222403552.0, 3222514624.0, 
3222408000.0, 3222413856.0, 3222408640.0, 3222377072.0, 3222324304.0, 3222524016.0, 
3222324000.0, 3222489808.0, 3222403552.0, 3223571920.0, 3222522384.0, 3222319712.0, 
3222374512.0, 3222375456.0, 3222489968.0, 3222492752.0, 3222413920.0, 3222394448.0, 
3222403552.0, 3222403552.0, 3222540576.0, 3222407408.0, 3222415072.0, 3222388272.0, 
3222549264.0, 3222325280.0, 3222548208.0, 3222298608.0, 3222413760.0, 3222409408.0, 
3222542528.0, 3222473296.0, 3222428384.0, 3222413696.0, 3222486224.0, 3222361280.0, 
3222522640.0, 3222492080.0, 3222472144.0, 3222376560.0, 3222378736.0, 3222364544.0, 
3222407776.0, 3222359872.0, 3222492928.0, 3222440496.0, 3222499408.0, 3222450272.0, 
3222351904.0, 3222352480.0, 3222413952.0, 3222556416.0, 3222410304.0, 3222399984.0, 
3222494736.0, 3222388288.0, 3222403552.0, 3222323824.0, 3222523616.0, 3222394656.0, 
3222404672.0, 3222405984.0, 3222490432.0, 3222407296.0, 3222394720.0, 3222596624.0, 
3222597520.0, 3222598048.0, 3222403552.0, 3222403552.0, 3222403552.0, 3222324448.0, 
3222408976.0, 3222448160.0, 3222366320.0, 3222489344.0, 3222403552.0, 3222494480.0, 
3222382032.0, 3222450432.0, 3222352000.0, 3222352528.0, 3222414032.0, 3222728448.0, 
3222299456.0, 3222400016.0, 3222495056.0, 3222388848.0, 3222403552.0, 3222487568.0, 
3222523744.0, 3222394624.0, 3222408112.0, 3222406496.0, 3222405616.0, 3222592160.0, 
3222549360.0, 3222438560.0, 3222597024.0, 3222597616.0, 3222598128.0, 3222403552.0, 
3222403552.0, 3222403552.0, 3222499056.0, 3222408512.0, 3222402064.0, 3222368992.0, 
3222511376.0, 3222414624.0, 3222554816.0, 3222494608.0, 3222449792.0, 3222351952.0, 
3222352272.0, 3222394736.0, 3222311856.0, 3222414288.0, 3222402448.0, 3222401056.0, 
3222413568.0, 3222298848.0, 3222297184.0, 3222488000.0, 3222490528.0, 3222394688.0, 
3222408224.0, 3222406672.0, 3222404896.0, 3222443120.0, 3222403552.0, 3222596400.0, 
3222597120.0, 3222597712.0, 3222400896.0, 3222403552.0, 3222403552.0, 3222403552.0, 
3222299200.0, 3222321296.0, 3222364176.0, 3222602208.0, 3222513040.0, 3222414656.0, 
3222564864.0, 3222407904.0, 3222449984.0, 3222352096.0, 3222352432.0, 3222452832.0, 
3222368560.0, 3222414368.0, 3222399376.0, 3222298352.0, 3222573152.0, 3222438080.0, 
3222409168.0, 3222523488.0, 3222394592.0, 3222405136.0, 3222490624.0, 3222406928.0, 
3222407104.0, 3222442464.0, 3222403552.0, 3222596512.0, 3222597216.0, 3222597968.0, 
3222438208.0, 3222403552.0, 3222403552.0, 3222403552.0]

class 2: b=[3498543128.0, 3498542920.0, 3498543252.0, 3498543752.0, 3498544872.0, 
3498544528.0, 3498543024.0, 3498542548.0, 3498542232.0]

Chciałbym to nakreślić. Próbowałem następujące i otrzymałem następujący wynik, gdy knuję ai b.

pylab.plot(a,'x')
pylab.plot(b,'o')
pylab.show()

wprowadź opis zdjęcia tutaj

czy mogę uzyskać lepszą wizualizację klastrowania?

użytkownik2721
źródło
1
To naprawdę zależy od tego, czy zrobiłeś grupowanie :) Jeśli pokażesz mały przykład danych, które masz, jestem pewien, że dostaniesz odpowiedź
David w
1
Używanie różnych kolorów i znaczników jest najłatwiejsze / najłatwiejsze do odczytania. Jeśli masz tylko 2 klastry, możesz po prostu wydrukować 0/1 lub O / X dla różnych wartości.
Marcin
Powiedz, co rozumiesz przez „zestaw znaków”. Ile masz zmiennych, które charakteryzują klastry? Czy jesteś również pewien, że 2 to najlepsza liczba klastrów do użycia? Wiele razy trzeba iteracyjnie korzystać z programów do analizy skupień; na początku można dostać tylko 2, ale z pewnymi poprawkami można uzyskać bardziej interesującą i informacyjną wyższą liczbę.
rolando2
Użyłem kmeans, w których muszę wyraźnie podać liczbę klastrów
user2721
@ user2721, czy możesz nam pokazać, jak korzystasz z kmeans?
Sigur

Odpowiedzi:

30

Zwykle rysujesz oryginalne wartości na wykresie rozrzutu (lub matrycy wykresów rozrzutu, jeśli masz ich wiele) i używasz kolorów, aby pokazać grupy.

Poprosiłeś o odpowiedź w pythonie, a właściwie grupujesz i drukujesz za pomocą scipy, numpy i matplotlib:

Zacznij od zrobienia niektórych danych

import numpy as np
from scipy import cluster
from matplotlib import pyplot

np.random.seed(123)
tests = np.reshape( np.random.uniform(0,100,60), (30,2) )
#tests[1:4]
#array([[ 22.68514536,  55.13147691],
#       [ 71.94689698,  42.31064601],
#       [ 98.07641984,  68.48297386]])

Ile klastrów?

Jest to trudna sprawa w przypadku k-średnich i istnieje wiele metod. Użyjmy metody łokciowej

#plot variance for each value for 'k' between 1,10
initial = [cluster.vq.kmeans(tests,i) for i in range(1,10)]
pyplot.plot([var for (cent,var) in initial])
pyplot.show()

Działka łokciowa

Przypisz swoje obserwacje do zajęć i spisz je

Uważam, że indeks 3 (tj. 4 klastry) jest tak dobry, jak każdy inny

cent, var = initial[3]
#use vq() to get as assignment for each obs.
assignment,cdist = cluster.vq.vq(tests,cent)
pyplot.scatter(tests[:,0], tests[:,1], c=assignment)
pyplot.show()

wykres punktowy

Po prostu ustal, gdzie możesz umieścić wszystko, co już zrobiłeś w tym przepływie pracy (i mam nadzieję, że klastry są trochę ładniejsze niż losowe!)

David w
źródło
Twoja odpowiedź wygląda świetnie. Czy mogę efektywnie wykorzystać to dla moich danych? Nie mogłem znaleźć czasu, aby spróbować.
user2721
@david w: To jedna z najlepszych odpowiedzi, jakie widziałem! Dziękujemy bardzo za opublikowanie samodzielnego przykładu. Rozumiem przynajmniej sedno twojej odpowiedzi :) Jeszcze raz dziękuję!
Legenda,
@david w: Jedyne pytanie, jakie miałem, to metoda łokcia pokazuje rosnące wartości, a twój wykres maleje. Czy to dlatego, że używasz wartości zniekształceń bezpośrednio z kmeans? Jak przekonwertować to, aby wyglądało jak wykres łokcia Wikipedii? I jako ostatnie pytanie, czy wiesz, jak to zrobić dla kmeans2 zamiast kmeans?
Legenda,
Czy odkryłeś indeks 3, patrząc tylko na pierwszą fabułę?
Sigur
2

Być może spróbuj czegoś takiego jak Fastmap, aby wykreślić zestaw znaków na podstawie ich względnych odległości.

(wciąż) nic sprytnego nie napisało Fastmapy w pythonie, aby wykreślić ciągi znaków, i można ją łatwo zaktualizować, by obsługiwała listy atrybutów, gdybyś napisał własną metrykę odległości.

Poniżej znajduje się standardowa odległość euklidesowa, której używam, która przyjmuje dwie listy atrybutów jako parametry. Jeśli twoje listy mają wartość klasy, nie używaj jej do obliczania odległości.

def distance(vecone, vectwo, d=0.0):
    for i in range(len(vecone)):
        if isnumeric(vecone[i]):
            d = d + (vecone[i] - vectwo[i])**2
        elif vecone[i] is not vectwo[i]:
            d += 1.0
    return math.sqrt(d)

def isnumeric(s):
    try:
        float(s)
        return True
    except ValueError:
        return False
Rzeźnik
źródło
0

Nie jestem ekspertem od Pythona, ale niezwykle pomocne jest wykreślenie 2 pierwszych głównych komponentów względem siebie na osiach x, y.

Nie jestem pewien, których pakietów używasz, ale oto przykładowy link:

http://pyrorobotics.org/?page=PyroModuleAnalysis

Ralph Winters
źródło
Nie jestem ekspertem od statystyki. Czy mógłbyś wyjaśnić więcej na temat spisku?
user2721,
Podstawową ideą jest to, że wiele zmiennych jest ze sobą skorelowanych i wszystko można sprowadzić do tylko dwóch zmiennych, które nie są ze sobą skorelowane i wyjaśniają „większość” zmienności danych. Musisz przeczytać o analizie głównych komponentów i zastosować pakiet, który pozwoli ci ją wdrożyć. en.wikipedia.org/wiki/Principal_component_analysis
Ralph Winters