8 Кластерні алгоритми машинного навчання, які повинні знати всі вчені-дослідники даних

Існує три різних підходи до машинного навчання, залежно від ваших даних. Ви можете піти з навчанням під наглядом, навчанням під наглядом або без нагляду.

У контрольованому навчанні ви позначали дані, тож у вас є результати, про які ви точно знаєте, що це правильні значення для ваших входів. Це як знати ціни на автомобілі на основі таких характеристик, як марка, модель, стиль, трансмісія та інші атрибути.

З напівконтрольованим навчанням у вас є великий набір даних, де деякі дані позначені, але більшість із них - ні.

Це охоплює велику кількість даних із реального світу, оскільки залучити експерта для позначення кожної точки даних може бути дорого. Ви можете обійти це, використовуючи комбінацію контрольованого та неконтрольованого навчання.

Навчання без нагляду означає, що у вас є набір даних, який повністю не маркується. Ви не знаєте, чи в даних приховані якісь закономірності, тому залишаєте алгоритму знайти все, що може.

Ось тут і з’являються алгоритми кластеризації. Це один із методів, який можна використовувати в проблемі навчання без нагляду.

Що таке алгоритми кластеризації?

Кластеризація є завданням машинного навчання без нагляду. Ви також можете почути це, що називається кластерним аналізом, через те, як працює цей метод.

Використання алгоритму кластеризації означає, що ви збираєтеся надати алгоритму багато вхідних даних без міток і дозволити йому знаходити будь-які групування в даних, які він може.

Ці угруповання називаються кластерами . Кластер - це група точок даних, схожих одна на одну на основі їх відношення до оточуючих точок даних. Кластеризація використовується для таких речей, як інженерія об’єктів або виявлення шаблонів.

Коли ви починаєте з даних, про які ви нічого не знаєте, кластеризація може бути гарним місцем, щоб отримати деяку інформацію.

Типи алгоритмів кластеризації

Існують різні типи алгоритмів кластеризації, які обробляють всілякі унікальні дані.

На основі щільності

У кластеризації на основі щільності дані групуються за зонами високих концентрацій точок даних, оточених зонами низьких концентрацій точок даних. В основному алгоритм знаходить місця, щільні точками даних, і викликає ці кластери.

Чудовим у цьому є те, що скупчення можуть бути будь-якої форми. Ви не обмежені очікуваними умовами.

Алгоритми кластеризації цього типу не намагаються присвоїти кластерам відхилення, тому вони ігноруються.

На основі розподілу

За допомогою підходу кластеризації на основі розподілу всі точки даних вважаються частинами кластера на основі ймовірності належності їм до даного кластеру.

Це працює так: існує центральна точка, і, коли відстань точки даних від центру збільшується, ймовірність того, що вона буде частиною цього кластеру, зменшується.

Якщо ви не впевнені в тому, яким може бути розподіл ваших даних, вам слід розглянути алгоритм іншого типу.

На основі Centroid

Кластеризація на основі Centroid - це та, про яку ви, мабуть, чуєте найбільше. Це трохи чутливе до початкових параметрів, які ви йому надаєте, але це швидко і ефективно.

Ці типи алгоритмів розділяють точки даних на основі кількох центроїдів у даних. Кожна точка даних призначається кластеру на основі його квадратичної відстані від центроїда. Це найбільш часто використовуваний тип кластеризації.

На ієрархічній основі

Ієрархічна кластеризація, як правило, використовується для ієрархічних даних, як це ви отримуєте з бази даних компанії або таксономій. Він будує дерево кластерів, тому все організовано зверху вниз.

Це більш обмежує, ніж інші типи кластеризації, але ідеально підходить для певних типів наборів даних.

Коли використовувати кластеризацію

Коли у вас є набір немічених даних, дуже ймовірно, що ви будете використовувати якийсь некерований алгоритм навчання.

Існує багато різних методів навчання без нагляду, таких як нейронні мережі, навчання з підкріплення та кластеризація. Конкретний тип алгоритму, який ви хочете використовувати, залежатиме від того, як виглядають ваші дані.

Можливо, вам захочеться скористатися кластеризацією, коли ви намагаєтеся виявити аномалії, щоб спробувати знайти викиди у своїх даних. Це допомагає, знаходячи ті групи кластерів і показуючи межі, які визначають, чи є точка даних відхиленням чи ні.

Якщо ви не впевнені, які функції використовувати для вашої моделі машинного навчання, кластеризація виявляє шаблони, за якими можна визначити, що виділяється в даних.

Кластеризація особливо корисна для вивчення даних, про які ви нічого не знаєте. Може знадобитися деякий час, щоб з’ясувати, який тип алгоритму кластеризації працює найкраще, але коли ви це зробите, ви отримаєте безцінне розуміння своїх даних. Ви можете знайти зв’язки, про які ніколи б не думали.

Деякі реальні програми кластеризації включають виявлення шахрайства у страхуванні, класифікацію книг у бібліотеці та сегментацію клієнтів у маркетингу. Він також може бути використаний для вирішення більших проблем, таких як аналіз землетрусів або планування міста.

8 найкращих алгоритмів кластеризації

Тепер, коли ви вже знаєте, як працюють алгоритми кластеризації та доступні різні типи, ми можемо поговорити про фактичні алгоритми, які ви зазвичай бачите на практиці.

Ми реалізуємо ці алгоритми на прикладі набору даних із бібліотеки sklearn в Python.

Ми будемо використовувати набір даних make_classification з бібліотеки sklearn, щоб продемонструвати, як різні алгоритми кластеризації не підходять для всіх проблем кластеризації.

Тут ви можете знайти код для всіх наступних прикладів.

K-означає алгоритм кластеризації

Кластеризація K-засобів є найбільш часто використовуваним алгоритмом кластеризації. Це алгоритм, заснований на центроїді, і найпростіший алгоритм навчання без нагляду.

Цей алгоритм намагається мінімізувати дисперсію точок даних у кластері. Це також те, як більшість людей знайомляться з машинним навчанням без нагляду.

K-засоби найкраще використовувати на менших наборах даних, оскільки вони ітератуються по всіх точках даних. Це означає, що для класифікації точок даних знадобиться більше часу, якщо в наборі даних їх велика кількість.

Оскільки так k-означає кластери точок даних, це погано масштабується.

Реалізація:

from numpy import unique from numpy import where from matplotlib import pyplot from sklearn.datasets import make_classification from sklearn.cluster import KMeans # initialize the data set we'll work with training_data, _ = make_classification(     n_samples=1000,     n_features=2,     n_informative=2,     n_redundant=0,     n_clusters_per_class=1,     random_state=4 ) # define the model kmeans_model = KMeans(n_clusters=2) # assign each data point to a cluster dbscan_result = dbscan_model.fit_predict(training_data) # get all of the unique clusters dbscan_clusters = unique(dbscan_result) # plot the DBSCAN clusters for dbscan_cluster in dbscan_clusters:     # get data points that fall in this cluster     index = where(dbscan_result == dbscan_clusters)     # make the plot     pyplot.scatter(training_data[index, 0], training_data[index, 1]) # show the DBSCAN plot pyplot.show()

Алгоритм кластеризації DBSCAN

DBSCAN означає просторове скупчення додатків на основі щільності з шумом. Це алгоритм кластеризації на основі щільності, на відміну від k-середніх.

Це хороший алгоритм пошуку пошукових рядків у наборі даних. Він знаходить довільно сформовані кластери на основі щільності точок даних у різних регіонах. Він розділяє регіони районами низької щільності, щоб він міг виявити відхилення між скупченнями високої щільності.

Цей алгоритм кращий за k-середній, коли йдеться про роботу з даними дивної форми.

DBSCAN використовує два параметри, щоб визначити, як визначаються кластери: minPts (мінімальна кількість точок даних, які потрібно згрупувати для того, щоб область вважалася високою щільністю) і eps (відстань, яка використовується для визначення, чи знаходиться точка даних у така ж область, як і інші точки даних).

Вибір правильних початкових параметрів є критичним для роботи цього алгоритму.

Реалізація:

from numpy import unique from numpy import where from matplotlib import pyplot from sklearn.datasets import make_classification from sklearn.cluster import DBSCAN # initialize the data set we'll work with training_data, _ = make_classification(     n_samples=1000,     n_features=2,     n_informative=2,     n_redundant=0,     n_clusters_per_class=1,     random_state=4 ) # define the model dbscan_model = DBSCAN(eps=0.25, min_samples=9) # train the model dbscan_model.fit(training_data) # assign each data point to a cluster dbscan_result = dbscan_model.predict(training_data) # get all of the unique clusters dbscan_cluster = unique(dbscan_result) # plot the DBSCAN clusters for dbscan_cluster in dbscan_clusters:     # get data points that fall in this cluster     index = where(dbscan_result == dbscan_clusters)     # make the plot     pyplot.scatter(training_data[index, 0], training_data[index, 1]) # show the DBSCAN plot pyplot.show()

Алгоритм моделі Гаусова суміші

Однією з проблем k-середнього є те, що дані повинні мати циклічний формат. Спосіб обчислення k-середньої відстані між точками даних пов’язаний із круговим шляхом, тому некругові дані неправильно кластеризовані.

Це питання, яке вирішують моделі Гаусова суміші. Вам не потрібні дані круглої форми, щоб вони добре працювали.

Модель суміші Гауса використовує множинні розподіли Гауса, щоб відповідати довільно сформованим даним.

У цій гібридній моделі є кілька одиночних моделей Гауса, які діють як приховані шари. Отже, модель обчислює ймовірність того, що точка даних належить певному гауссовому розподілу, і це кластер, до якого вона потрапить.

Реалізація:

from numpy import unique from numpy import where from matplotlib import pyplot from sklearn.datasets import make_classification from sklearn.mixture import GaussianMixture # initialize the data set we'll work with training_data, _ = make_classification(     n_samples=1000,     n_features=2,     n_informative=2,     n_redundant=0,     n_clusters_per_class=1,     random_state=4 ) # define the model gaussian_model = GaussianMixture(n_components=2) # train the model gaussian_model.fit(training_data) # assign each data point to a cluster gaussian_result = gaussian_model.predict(training_data) # get all of the unique clusters gaussian_clusters = unique(gaussian_result) # plot Gaussian Mixture the clusters for gaussian_cluster in gaussian_clusters:     # get data points that fall in this cluster     index = where(gaussian_result == gaussian_clusters)     # make the plot     pyplot.scatter(training_data[index, 0], training_data[index, 1]) # show the Gaussian Mixture plot pyplot.show()

Алгоритм BRECH

Алгоритм ітеративного зменшення та кластеризації балансу за допомогою ієрархій (BIRCH) працює краще на великих наборах даних, ніж алгоритм k-середніх.

Він розбиває дані на невеликі зведення, які кластеризуються замість вихідних точок даних. Резюме містить якомога більше інформації про розподіл про точки даних.

Цей алгоритм зазвичай використовується з іншими алгоритмами кластеризації, оскільки інші методи кластеризації можуть бути використані в зведеннях, сформованих BIRCH.

Основним недоліком алгоритму BIRCH є те, що він працює лише на числових значеннях даних. Ви не можете використовувати це для категоріальних значень, якщо не виконаєте певні перетворення даних.

Реалізація:

from numpy import unique from numpy import where from matplotlib import pyplot from sklearn.datasets import make_classification from sklearn.cluster import Birch # initialize the data set we'll work with training_data, _ = make_classification(     n_samples=1000,     n_features=2,     n_informative=2,     n_redundant=0,     n_clusters_per_class=1,     random_state=4 ) # define the model birch_model = Birch(threshold=0.03, n_clusters=2) # train the model birch_model.fit(training_data) # assign each data point to a cluster birch_result = birch_model.predict(training_data) # get all of the unique clusters birch_clusters = unique(birch_result) # plot the BIRCH clusters for birch_cluster in birch_clusters:     # get data points that fall in this cluster     index = where(birch_result == birch_clusters)     # make the plot     pyplot.scatter(training_data[index, 0], training_data[index, 1]) # show the BIRCH plot pyplot.show() 

Алгоритм кластеризації поширення афінності

Цей алгоритм кластеризації абсолютно відрізняється від інших тим, що він кластеризує дані.

Кожна точка даних взаємодіє з усіма іншими точками даних, щоб повідомити одна одну, наскільки вони схожі, і це починає виявляти кластери в даних. Вам не потрібно повідомляти цьому алгоритму, скільки кластерів очікувати в параметрах ініціалізації.

У міру надсилання повідомлень між точками даних знаходять набори даних, які називаються зразками , і вони представляють кластери.

Приклад знаходить після того, як точки даних передають повідомлення один одному і формують консенсус щодо того, яка точка даних найкраще представляє кластер.

Коли ви не впевнені, скільки кластерів очікувати, як у проблемі з комп'ютерним зором, це чудовий алгоритм для початку.

Реалізація:

from numpy import unique from numpy import where from matplotlib import pyplot from sklearn.datasets import make_classification from sklearn.cluster import AffinityPropagation # initialize the data set we'll work with training_data, _ = make_classification(     n_samples=1000,     n_features=2,     n_informative=2,     n_redundant=0,     n_clusters_per_class=1,     random_state=4 ) # define the model model = AffinityPropagation(damping=0.7) # train the model model.fit(training_data) # assign each data point to a cluster result = model.predict(training_data) # get all of the unique clusters clusters = unique(result) # plot the clusters for cluster in clusters:     # get data points that fall in this cluster     index = where(result == cluster)     # make the plot     pyplot.scatter(training_data[index, 0], training_data[index, 1]) # show the plot pyplot.show()

Алгоритм кластеризації середнього зсуву

Це ще один алгоритм, який особливо корисний для обробки зображень та обробки комп'ютерного зору.

Середній зсув подібний до алгоритму BIRCH, оскільки він також знаходить кластери без встановленої початкової кількості кластерів.

Це ієрархічний алгоритм кластеризації, але мінусом є те, що він погано масштабується при роботі з великими наборами даних.

Він працює шляхом ітерації по всіх точках даних та зміщення їх у бік режиму. Режим у цьому контексті - область високої щільності точок даних у регіоні.

Ось чому ви можете почути цей алгоритм, який називають алгоритмом пошуку режиму. Він пройде цей ітераційний процес з кожною точкою даних і перемістить їх ближче до місця, де знаходяться інші точки даних, поки всі точки даних не будуть призначені кластеру.

Реалізація:

from numpy import unique from numpy import where from matplotlib import pyplot from sklearn.datasets import make_classification from sklearn.cluster import MeanShift # initialize the data set we'll work with training_data, _ = make_classification(     n_samples=1000,     n_features=2,     n_informative=2,     n_redundant=0,     n_clusters_per_class=1,     random_state=4 ) # define the model mean_model = MeanShift() # assign each data point to a cluster mean_result = mean_model.fit_predict(training_data) # get all of the unique clusters mean_clusters = unique(mean_result) # plot Mean-Shift the clusters for mean_cluster in mean_clusters:     # get data points that fall in this cluster     index = where(mean_result == mean_cluster)     # make the plot     pyplot.scatter(training_data[index, 0], training_data[index, 1]) # show the Mean-Shift plot pyplot.show()

Алгоритм ОПТИКИ

OPTICS розшифровується як Впорядкування точок для визначення структури кластеризації. Це алгоритм на основі щільності, подібний до DBSCAN, але кращий, оскільки він може знаходити значущі кластери в даних, що відрізняються за щільністю. Це робиться шляхом упорядкування точок даних так, щоб найближчі точки були сусідами в упорядкуванні.

Це полегшує виявлення різних кластерів щільності. Алгоритм OPTICS лише один раз обробляє кожну точку даних, подібно до DBSCAN (хоча працює повільніше, ніж DBSCAN). Для кожної точки даних також зберігається спеціальна відстань, яка вказує, що точка належить певному кластеру.

Реалізація:

from numpy import unique from numpy import where from matplotlib import pyplot from sklearn.datasets import make_classification from sklearn.cluster import OPTICS # initialize the data set we'll work with training_data, _ = make_classification(     n_samples=1000,     n_features=2,     n_informative=2,     n_redundant=0,     n_clusters_per_class=1,     random_state=4 ) # define the model optics_model = OPTICS(eps=0.75, min_samples=10) # assign each data point to a cluster optics_result = optics_model.fit_predict(training_data) # get all of the unique clusters optics_clusters = unique(optics_clusters) # plot OPTICS the clusters for optics_cluster in optics_clusters:     # get data points that fall in this cluster     index = where(optics_result == optics_clusters)     # make the plot     pyplot.scatter(training_data[index, 0], training_data[index, 1]) # show the OPTICS plot pyplot.show()

Алгоритм кластеризації агломеративної ієрархії

Це найпоширеніший тип ієрархічного алгоритму кластеризації. Застосовується для групування об’єктів у кластери залежно від того, наскільки вони схожі між собою.

Це форма кластеризації знизу вгору, коли кожна точка даних присвоюється своєму кластеру. Потім ці кластери об’єднуються.

На кожній ітерації подібні кластери об'єднуються, поки всі точки даних не стануть частиною одного великого кореневого кластера.

Agglomerative clustering is best at finding small clusters. The end result looks like a dendrogram so that you can easily visualize the clusters when the algorithm finishes.

Implementation:

from numpy import unique from numpy import where from matplotlib import pyplot from sklearn.datasets import make_classification from sklearn.cluster import AgglomerativeClustering # initialize the data set we'll work with training_data, _ = make_classification(     n_samples=1000,     n_features=2,     n_informative=2,     n_redundant=0,     n_clusters_per_class=1,     random_state=4 ) # define the model agglomerative_model = AgglomerativeClustering(n_clusters=2) # assign each data point to a cluster agglomerative_result = agglomerative_model.fit_predict(training_data) # get all of the unique clusters agglomerative_clusters = unique(agglomerative_result) # plot the clusters for agglomerative_cluster in agglomerative_clusters:     # get data points that fall in this cluster     index = where(agglomerative_result == agglomerative_clusters)     # make the plot     pyplot.scatter(training_data[index, 0], training_data[index, 1]) # show the Agglomerative Hierarchy plot pyplot.show()

Other types of clustering algorithms

We've covered eight of the top clustering algorithms, but there are plenty more than that available. There are some very specifically tuned clustering algorithms that quickly and precisely handle your data. Here are a few of the others that might be of interest to you.

There's another hierarchical algorithm that's the opposite of the agglomerative approach. It starts with a top-down clustering strategy. So it will start with one large root cluster and break out the individual clusters from there.

This is known as the Divisive Hierarchical clustering algorithm. There's research that shows this is creates more accurate hierarchies than agglomerative clustering, but it's way more complex.

Mini-Batch K-means is similar to K-means, except that it uses small random chunks of data of a fixed size so they can be stored in memory. This helps it run faster than K-means so it converges to a solution in less time.

The drawback to this algorithm is that the speed boost will cost you some cluster quality.

The last algorithm we'll briefly cover is Spectral Clustering. This algorithm is completely different from the others we've looked at.

It works by taking advantage of graph theory. This algorithm doesn't make any initial guesses about the clusters that are in the data set. It treats data points like nodes in a graph and clusters are found based on communities of nodes that have connecting edges.

Other thoughts

Watch out for scaling issues with the clustering algorithms. Your data set could have millions of data points, and since clustering algorithms work by calculating the similarities between all pairs of data points, you might end up with an algorithm that doesn’t scale well.

Conclusion

Clustering algorithms are a great way to learn new things from old data. Sometimes you'll be surprised by the resulting clusters you get and it might help you make sense of a problem.

One of the coolest things about using clustering for unsupervised learning is that you can use the results in a supervised learning problem.

The clusters could be your new features that you use on a completely different data set! You can use clustering on just about any unsupervised machine learning problem, but make sure that you know how to analyze the results for accuracy.