Mam tabelę bazy danych przesyłania danych między różnymi węzłami. To ogromna baza danych (z prawie 40 milionami transferów). Jednym z atrybutów jest liczba transferów bajtów (nbajtów) w zakresie od 0 bajtów do 2 tera bajtów. Chciałbym zgrupować nbytes w taki sposób, aby dane k klastrów zawierały niektóre transfery x1 należące do klastra k1, transfery x2 do k2 itd.
Z terminologii, której użyłem, mogłeś odgadnąć, o co mi chodziło: K-znaczy. To dane 1d, ponieważ nbytes to jedyna funkcja, na której mi zależy. Kiedy szukałem różnych metod do tego, zobaczyłem EM kilka razy wspomniane wraz z podejściem bezklastrowym. Chciałbym wiedzieć o twoich poglądach na temat tego, jak podejść do tego problemu (w szczególności, czy skupić się na klastrowaniu czy nie).
Dzięki!
źródło
Odpowiedzi:
W danych jednowymiarowych nie używaj analizy skupień.
Analiza skupień jest zwykle techniką wielowymiarową. Albo pozwólcie, że lepiej to odwrócę: w przypadku danych jednowymiarowych - które są całkowicie uporządkowane - istnieją znacznie lepsze techniki. Używanie k-średnich i podobnych technik jest tutaj całkowitym marnotrawstwem, chyba że włożycie wystarczająco dużo wysiłku, aby faktycznie zoptymalizować je dla przypadku 1-d.
Podam przykład: dla k-oznacza często używa się k losowych obiektów jako początkowych nasion. W przypadku danych jednowymiarowych dość łatwo jest to zrobić lepiej, stosując odpowiednie kwantyle (1 / 2k, 3 / 2k, 5 / 2k itp.), Po jednokrotnym posortowaniu danych , a następnie optymalizacji od tego punktu początkowego. Jednak danych 2D nie można całkowicie posortować. A w siatce prawdopodobnie będą puste komórki.
Nie nazwałbym tego też klastrami. Nazwałbym to interwałem . To, co naprawdę chcesz zrobić, to zoptymalizować granice interwałów. Jeśli użyjesz k-średnich, przetestuje dla każdego obiektu, czy powinien zostać przeniesiony do innego klastra. To nie ma sensu w 1D: należy sprawdzać tylko obiekty na granicy przedziałów. To oczywiście jest znacznie szybsze, ponieważ jest tam tylko ~ 2k obiektów. Jeśli nie wolą już innych interwałów, więcej centralnych obiektów też nie będzie.
Możesz przyjrzeć się takim technikom, jak na przykład optymalizacja Jenks Natural Breaks .
Możesz też dokonać oszacowania gęstości jądra i poszukać lokalnych minimów gęstości do podziału. Zaletą jest to, że nie musisz w tym celu określać k!
PS skorzystaj z funkcji wyszukiwania. Oto kilka pytań dotyczących klastra danych 1-d, które przegapiłeś:
źródło
Czy Twoje pytanie dotyczy klastrowania lub jakiej metody należy użyć do klastrowania?
To, czy powinieneś klastrować, zależy od tego, czy chcesz automatycznie podzielić dane na partycje (na przykład, czy chcesz kilkakrotnie powtórzyć partycjonowanie). Jeśli robisz to tylko raz, możesz po prostu spojrzeć na histogram rozkładu swoich wartości i podzielić go na oko, jak zaproponowano w komentarzach. W każdym razie zaleciłbym spojrzenie na dane, ponieważ mogłoby to pomóc określić, ile klastrów chcesz, a także czy klaster „zadziałał”.
Jeśli chodzi o rodzaj klastrowania, k-średnich powinno być w porządku, jeśli w danych znajdują się „prawdziwe” klastry. Jeśli nie widzisz żadnych klastrów na histogramie, to i tak nie ma większego sensu tworzenie klastrów, ponieważ każde podzielenie zakresu danych da prawidłowe klastry (lub w przypadku losowej inicjacji kmeans, otrzymasz różne klastry każdy bieg).
źródło
Możesz spróbować:
KMeans, GMM lub inne metody, określając n_clusters = no. pików na wykresie gęstości jądra.
KMeans, GMM lub inne metody poprzez określenie optymalnej liczby nie. klastrów w oparciu o niektóre metryki. Więcej informacji: [tutaj] https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set
źródło