Czy ktoś może mi wskazać implementację k-średnich (byłoby lepiej, gdyby w Matlabie), która może wprowadzić macierz odległości na wejściu? Standardowa implementacja Matlaba wymaga macierzy obserwacji na wejściu i nie jest możliwe niestandardowe zmienianie miary podobieństwa.
clustering
matlab
k-means
Eugenio
źródło
źródło
Odpowiedzi:
Ponieważ k-średnich musi być w stanie znaleźć środki różnych podzbiorów punktów, które chcesz połączyć, tak naprawdę nie ma sensu prosić o wersję k-średnich, która przyjmuje macierz odległości jako dane wejściowe.
Zamiast tego możesz spróbować k-medoidów . Dostępnych jest kilka implementacji Matlaba .
źródło
Możesz zamienić macierz odległości w surowe dane i wprowadzić je do grupowania K-Means. Kroki byłyby następujące:
1) Odległości między twoimi punktami N muszą być równe kwadratowym wartościom euklidesowym. Wykonaj „ podwójne centrowanie ” macierzy: odejmij średnią rzędną z każdego elementu; w wyniku odejmij średnią kolumny od każdego elementu; w rezultacie dodaj średnią macierzy do każdego elementu; podziel przez minus 2. Macierz, którą macie teraz, to macierz SSCP (suma kwadratów i iloczynu) między punktami, w której początek jest umieszczony w geometrycznym środku chmury N punktów. (Przeczytaj wyjaśnienie podwójnego centrowania tutaj .)
2) Wykonaj PCA (Analiza głównego składnika) na tej macierzy i uzyskaj macierz obciążenia składnika NxN . Niektóre z ostatnich kolumn prawdopodobnie będą miały wartość 0, więc odetnij je. Pozostajesz teraz w rzeczywistości ocenami głównych składników, współrzędnymi twoich N punktów na głównych składnikach, które przechodzą, jak osie, przez chmurę. Dane te mogą być traktowane jako surowe dane odpowiednie do wprowadzania danych K-Means.
PS Jeśli twoje odległości nie są geometrycznie poprawne do kwadratu euklidesowego, możesz napotkać problem: macierz SSCP może nie być dodatnia (pół) określona. Problem ten można rozwiązać na kilka sposobów, ale z utratą precyzji.
źródło
X
(powiedzmy N * N) będzie symetryczny, więccolMeans(X) =rowMeans(X)
i raz odjąć wiersz lub col środków:Y=X-rowMeans(X)
,mean(Y)
0.You could turn your matrix of distances into raw data
(punkty 1 i 2), odnoszę się zasadniczo do wielowymiarowego skalowania Torgersona (MDS) , w którym podwójne centrowanie jest początkowym krokiem. Przeszukaj tę stronę (i Google również) w sprawie tej procedury. „Podwójne centrowanie” oznacza konwersję (do kwadratu) odległości w odpowiednią macierz iloczynu skalarnego zdefiniowaną nad początkiem umieszczoną w środku ciężkości chmury punktów.Przeczytaj ten artykuł napisany przez jednego z moich znajomych;)
http://arxiv.org/abs/1304.6899
Chodzi o uogólnioną implementację k-średnich, która przyjmuje dowolną macierz odległości jako dane wejściowe. Może to być dowolna symetryczna nieujemna macierz o zerowej przekątnej. Pamiętaj, że może to nie dać rozsądnych wyników dla dziwnych matryc odległości. Program jest napisany w języku C #.
Kod źródłowy można uzyskać, odwiedzając powyższy link, a następnie klikając Inne formaty, a następnie klikając Pobierz źródło. Otrzymasz plik .tar.gz zawierający Program.cs. Alternatywnie kod źródłowy można również skopiować z pliku PDF.
źródło
Możesz użyć biblioteki Java Machine Learning Library. Mają implementację K-Means. Jeden z konstruktorów przyjmuje trzy argumenty
Można łatwo rozszerzyć klasę DistanceMeasure, aby osiągnąć pożądany wynik. Chodzi o to, aby zwracać wartości z niestandardowej macierzy odległości w metodzie miary (Instancja x, Instancja y) tej klasy.
K-Means jest uzgadniany w celu zbieżności przy założeniu pewnych właściwości metryki odległości. Odległość euklidesowa, odległość Manhattanu lub inne standardowe wskaźniki spełniają te założenia. Ponieważ niestandardowa metryka odległości może nie spełniać tych założeń, konstruktor ma trzeci parametr określający liczbę iteracji do uruchomienia w celu zbudowania klastra.
źródło