Обяснение на алгоритми за частично и базирано на плътност групиране

Групирането е процес на групиране на подобни точки от данни чрез намиране на прилики и определяне на модели в немаркирани и невидими данни. Алгоритмите за групиране се използват широко в пазарното сегментиране, търсачките, системите за препоръки и диагностичните системи.

Може би, ако срещнете набор от данни без етикетирана целева променлива, има начин да получите известна представа за него, без да се налага да го етикетирате. Може би няма ясна целева променлива за прогнозиране, има ли все пак начин да се използват данните? Това е светът на „ученето без надзор“.

Алгоритъмът се опитва да намери основната структура на данните чрез различни подходи, които могат да бъдат разделени на три подкатегории:

  1. Клъстериране на базата на дялове: K-средно, K-медиана

2. Йерархично групиране: агломеративно, разделящо

3. Клъстериране на базата на плътност: DBSCAN

K-означава групиране:

Алгоритмите за клъстериране, базирани на дялове, като k-средни стойности, се използват за класифициране на точки от данни въз основа на подобни характеристики в K (положително число) на клъстери, така че точките от данни за различни характеристики принадлежат към други клъстери.

Алгоритъмът Kmeans е итеративен алгоритъм, който се опитва да раздели набора от данни на Kпредварително дефинирани отделни клъстери, които не се припокриват, където всяка точка от данни принадлежи само на една група. Той се опитва да направи разстоянието между клъстерите минимално и разстоянието между клъстерите максимално. Колкото по-малко вариации имаме в клъстерите, толкова по-хомогенни са точките от данни в рамките на един и същи клъстер.

Методологичен подход към групирането на K-средства:

  1. Извършете MinMaxScaling, докато прилагате алгоритъма за K-средни стойности.
    Начертайте набор от данни върху графика (EDA- Проучвателен анализ на данни)
    Изберете K, т.е. оптимален брой клъстери.
  2. Инициализирайте центроиди (средно аритметично от всички точки от данни, които принадлежат към този клъстер) и изберете произволни K точки от данни.
    Забележка – K-средствата опитва симетрично първоначалните центроиди.
  3. Присвоете точки от данни към клъстер така, че сумата от квадрата на разстоянието между точките от данни и центроида на клъстера да е минимална.
  4. Изчислете и поставете нов центроид към всеки клъстер.
  5. Конвергенция: Проверете разстоянията на Евклид/Манхатън, така че най-ниската сума от квадратни грешки в клъстера да бъде преназначена.

Метод на лакътя:

Методът на коляното ни дава представа какъв е оптималният K, т.е. брой клъстери, който би се основавал на сумата от квадратите на разстоянието (SSE) между точките от данни и центроидите на присвоените им клъстери. Избираме K на мястото, където SSE започва да се изравнява и образува коляно, т.е. бавни промени в сумата на квадратните грешки в клъстера.

Минимизиране на сумата от квадратни грешки в рамките на клъстера: Прогноза за точност

Имплементация на Scikit-Learn:



Започваме със създаване на примерен набор от данни, използвайки модула за набори от данни на scikit-learn. Ще създадем набор от данни с 2 функции с 0,5 стандартно отклонение за всеки клъстер. Броят на пробите е 150 и ние също избираме три точки като центроиди.

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
X , y = make_blobs(n_samples=150,n_features=2,centers=3,cluster_std=.5,
                   shuffle=True,random_state=0)

Начертайте набор от данни.

plt.scatter(X[:,0],X[:,1],marker='o',s=50)
plt.grid()
plt.show()

Задаваме n_init=10 да изпълнява алгоритъма за клъстериране на k-средни стойности 10 пъти независимо с различни произволни центроиди, за да избере крайния модел като този с най-ниската SSE. Параметърът max_iter указва максималния брой итерации за всяко отделно изпълнение.

from sklearn.cluster import KMeans
km = KMeans(n_clusters=3,n_init=10,max_iter=300)
km.fit(X)
pred=km.predict(X)
pred

Сума от квадратни грешки в клъстера:

km.inertia_

Начертайте клъстер и центроиди.

km.cluster_centers_
plt.scatter(X[:,0],X[:,1],c=pred,cmap='winter')
centers = km.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200)
plt.show()

Използване на метода на лакътя за намиране на оптималния брой клъстери.

WSSE = []
for i in range(1,11):
    km = KMeans(n_clusters=i,random_state=0)
    km.fit(X)
    WSSE.append(km.inertia_)
plt.plot(range(1,11),WSSE,marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('with-in cluster sum of square error')
plt.show()
import pandas as pd
pd.DataFrame(WSSE,index=range(1,11))

DBSCAN Клъстериране:

K-означава клъстерирането е полезно за клъстери със сферична форма. Въпреки това, когато става въпрос за клъстери с произволна форма или откриване на отклонения и откриване на аномалии, техниките, базирани на плътност, са по-ефективни. При базираното на плътност пространствено клъстериране на приложения (DBSCAN) не е необходимо да се знае броят на клъстерите, за разлика от алгоритъма на K-средните. DBSCAN намира всички гъсти региони на начертани пробни точки и третира тези региони като клъстери - устойчиви на шумови точки, които са далеч от ядрото на клъстера.

Има два ключови параметъра на DBSCAN:

  1. eps: Разстоянието, което определя кварталите. Две точки се считат за съседни, ако разстоянието между тях е по-малко или равно на eps. Като цяло, eps трябва да бъдат избрани възможно най-малки (eps ≤ 4)

2. min_points: Минимален брой точки от данни за дефиниране на клъстер.

Видове точки:

  1. Основна точка: Точката от данни, където броят на пробните точки в рамките на радиуса на съседство (eps) ≥ min_points.
  2. Гранична точка: Точките от данни, които са в близост до основните точки.
  3. Шумови точки: Точките от данни са далеч от клъстерите и основните точки.

Методологичен подход към групирането на DBSCAN:

  1. Начертайте точки от данни. Изберете произволно неприсвоена точка и изчислете околността й, за да разберете дали е основна точка или не. Ако не, точката се маркира като шум.
  2. Намерете основната точка, за да формирате временен клъстер, ако броят на точките в радиуса на точката на извадката е ≥ min_points.
    Проверете точките с данни в съседство във временния клъстер.
  3. Всички точки в директната плътност на основната точка ще формират временния клъстер. Всички точки от данни в директната плътност на съседите на основната точка също ще се добавят към временния клъстер.
  4. Комбинирайте временни клъстери, за да получите окончателни клъстери.
    За всеки временен клъстер проверете дали точката от данни в него е основна точка. Ако е така, тогава обединете временни клъстери, за да образувате нов клъстер.
    Точка, която е маркирана като шум, може да бъде преразгледана и да бъде част от клъстер като гранична точка.
  5. Повторете стъпка 4, докато всяка точка в текущия клъстер или не е в списъка с основни точки, или е съсед на основна точка, т.е. всички точки са били посетени.

Метод на коляното:

Целта е да се намери средната стойност на разстоянията за всяка точка до нейните K най-близки съседи и да се избере разстоянието, на което се случва рязка промяна. Стойността на K е зададена да бъде равна на min_points. По подразбиране K = 4 = min_points.

Scikit-научете внедряване:



Започваме със създаване на примерен набор от данни, използвайки модула за набори от данни на scikit-learn. След като създадем примерните точки от данни, ще нормализираме стойностите с помощта на класа StandardScaler от модула за предварителна обработка на scikit-learn. Ще създадем и начертаем набор от данни с брой проби като 400 с 0,6 стандартно отклонение за всеки клъстер.

import numpy as np
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
X, y = make_blobs(n_samples=400,cluster_std=0.6,random_state=0)
plt.scatter(X[:,0],X[:,1],c=y,cmap='cool')
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

Вече можем да създадем DBSCAN обект, да напаснем данните и да визуализираме клъстерите.

dbscan = DBSCAN(eps = 0.3,metric="euclidean",min_samples = 10)
clusters = dbscan.fit_predict(X_scaled)
plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_, cmap="plasma")
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.title('eps={},min samples={}'.format(dbscan.eps,dbscan.min_samples))
print("Adjusted Rand Index: %0.3f"% metrics.adjusted_rand_score(y, dbscan.labels_))

Параметър eps (Приложение на метода на коляното):

plt.figure(figsize=(12,8))
for i,k in enumerate([.15,.3,.5,1.5],start=1):
    plt.subplot(2,2,i)
    db = DBSCAN(eps = k,metric="euclidean",min_samples = 10)
    db.fit(X_scaled)
    
    plt.scatter(X[:, 0], X[:, 1], c=db.labels_, cmap="plasma")
   # plt.xlabel("Feature 0")
   # plt.ylabel("Feature 1")
    plt.title('eps={},min samples={}'.format(db.eps,dbscan.min_samples))

Параметър min_samples:

plt.figure(figsize=(12,8))
for i,k in enumerate([5,10,15,20],start=1):
    plt.subplot(2,2,i)
    db = DBSCAN(eps = .3,metric="euclidean",min_samples = k)
    db.fit(X_scaled)
    
    plt.scatter(X[:, 0], X[:, 1], c=db.labels_, cmap="plasma")
   # plt.xlabel("Feature 0")
   # plt.ylabel("Feature 1")
    plt.title('eps={},min samples={}'.format(db.eps,db.min_samples))

Кога кои техники за клъстериране да използвате зависи от набора от данни. Въпреки че K-Means е широко използваният подход за клъстериране, има проблеми с набора от данни, при които използването на DBSCAN води до по-добри клъстери.

И накрая, дали тази статия ви е харесала или ви е помогнала по някакъв начин. Моля, ръкопляскайте. И нямам нищо против 50 от тях ;)