logo

Алгоритъм за групиране на K-средни стойности

K-Means Clustering е алгоритъм за неконтролирано обучение, който се използва за решаване на проблемите с клъстерирането в машинното обучение или науката за данни. В тази тема ще научим какво представлява алгоритъмът за клъстериране на K-означава, как работи алгоритъмът, заедно с реализацията на Python за клъстериране на k-означава.

Какво представлява алгоритъмът на K-Means?

K-Means Clustering е Алгоритъм за неконтролирано обучение , който групира немаркирания набор от данни в различни клъстери. Тук K дефинира броя на предварително дефинираните клъстери, които трябва да бъдат създадени в процеса, като ако K=2, ще има два клъстера, а за K=3 ще има три клъстера и т.н.

Това е итеративен алгоритъм, който разделя немаркирания набор от данни на k различни клъстера по такъв начин, че всеки набор от данни принадлежи само на една група, която има подобни свойства.

Това ни позволява да групираме данните в различни групи и удобен начин да открием категориите групи в немаркирания набор от данни самостоятелно, без да е необходимо каквото и да е обучение.

Това е алгоритъм, базиран на центроид, където всеки клъстер е свързан с центроид. Основната цел на този алгоритъм е да минимизира сумата от разстоянията между точката с данни и съответните им клъстери.

Алгоритъмът приема немаркирания набор от данни като вход, разделя набора от данни на k-брой клъстери и повтаря процеса, докато не намери най-добрите клъстери. Стойността на k трябва да бъде предварително определена в този алгоритъм.

К-означава групиране Алгоритъмът изпълнява основно две задачи:

  • Определя най-добрата стойност за K централни точки или центроиди чрез итеративен процес.
  • Присвоява всяка точка от данни на най-близкия k-център. Тези точки от данни, които са близо до конкретния k-център, създават клъстер.

Следователно всеки клъстер има точки от данни с някои общи характеристики и е далеч от други клъстери.

обвиване на css текст

Диаграмата по-долу обяснява работата на алгоритъма за клъстериране на K-средни стойности:

Алгоритъм за групиране на K-средни стойности

Как работи алгоритъмът на K-Means?

Работата на алгоритъма K-Means е обяснена в стъпките по-долу:

Етап 1: Изберете числото K, за да определите броя на клъстерите.

Стъпка 2: Изберете произволни K точки или центроиди. (Може да е друго от входния набор от данни).

Стъпка-3: Присвоете всяка точка от данни към техния най-близък център, който ще формира предварително дефинираните K клъстери.

Стъпка-4: Изчислете дисперсията и поставете нов центроид на всеки клъстер.

Стъпка-5: Повторете третите стъпки, което означава пренасочване на всяка точка от данни към новия най-близък център на всеки клъстер.

Стъпка-6: Ако възникне преназначаване, отидете на стъпка 4, в противен случай отидете на FINISH.

двоично дърво java

Стъпка-7 : Моделът е готов.

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

Да предположим, че имаме две променливи M1 и M2. Графиката на разсейване на тези две променливи по оста x-y е дадена по-долу:

Алгоритъм за групиране на K-средни стойности
  • Нека вземем брой k клъстери, т.е. K=2, за да идентифицираме набора от данни и да ги поставим в различни клъстери. Това означава, че тук ще се опитаме да групираме тези набори от данни в два различни клъстера.
  • Трябва да изберем някои произволни k точки или центроид, за да формираме клъстера. Тези точки могат да бъдат или точките от набора от данни, или всяка друга точка. И така, тук избираме долните две точки като k точки, които не са част от нашия набор от данни. Разгледайте изображението по-долу:
    Алгоритъм за групиране на K-средни стойности
  • Сега ще присвоим всяка точка от данни на точковата диаграма на най-близката K-точка или центроид. Ще го изчислим, като приложим някои математики, които сме изучавали, за да изчислим разстоянието между две точки. И така, ще начертаем медиана между двата центроида. Разгледайте изображението по-долу:
    Алгоритъм за групиране на K-средни стойности

От изображението по-горе е ясно, че точките от лявата страна на линията са близо до K1 или синия центроид, а точките отдясно на линията са близо до жълтия център. Нека ги оцветим в синьо и жълто за ясна визуализация.

Алгоритъм за групиране на K-средни стойности
  • Тъй като трябва да намерим най-близкия клъстер, ще повторим процеса, като избираме нов центроид . За да изберем новите центроиди, ние ще изчислим центъра на тежестта на тези центроиди и ще намерим нови центроиди, както е показано по-долу:
    Алгоритъм за групиране на K-средни стойности
  • След това ще присвоим отново всяка точка от данни към новия център. За целта ще повторим същия процес на намиране на средна линия. Медианата ще бъде като изображението по-долу:
    Алгоритъм за групиране на K-средни стойности

От изображението по-горе можем да видим, че една жълта точка е от лявата страна на линията, а две сини точки са точно до линията. И така, тези три точки ще бъдат присвоени на нови центроиди.

Алгоритъм за групиране на K-средни стойности

Тъй като е извършено преназначаване, ние отново ще преминем към стъпка 4, която е намирането на нови центроиди или K-точки.

  • Ще повторим процеса, като намерим центъра на тежестта на центроидите, така че новите центроиди ще бъдат както е показано на изображението по-долу:
    Алгоритъм за групиране на K-средни стойности
  • Тъй като получихме новите центроиди, отново ще начертаем средната линия и ще преназначим точките от данни. И така, изображението ще бъде:
    Алгоритъм за групиране на K-средни стойности
  • Можем да видим в горното изображение; няма различни точки от данни от двете страни на линията, което означава, че нашият модел е формиран. Разгледайте изображението по-долу:
    Алгоритъм за групиране на K-средни стойности

Тъй като нашият модел е готов, сега можем да премахнем предполагаемите центроиди и двата последни клъстера ще бъдат както е показано на изображението по-долу:

Алгоритъм за групиране на K-средни стойности

Как да избера стойността на „K брой клъстери“ в K-означава клъстериране?

Ефективността на алгоритъма за клъстериране на K-средни стойности зависи от високоефективните клъстери, които той формира. Но изборът на оптимален брой клъстери е голяма задача. Има няколко различни начина за намиране на оптималния брой клъстери, но тук обсъждаме най-подходящия метод за намиране на броя на клъстерите или стойността на K. Методът е даден по-долу:

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

Методът Elbow е един от най-популярните начини за намиране на оптималния брой клъстери. Този метод използва концепцията за WCSS стойност. WCSS означава В рамките на клъстера Сума от квадрати , което определя общите вариации в рамките на клъстер. Формулата за изчисляване на стойността на WCSS (за 3 клъстера) е дадена по-долу:

WCSS= ∑Паз в Клъстер1разстояние (Pаз° С1)2+∑Паз в Клъстер2разстояние (Pаз° С2)2+∑Паз в CLuster3разстояние (Pаз° С3)2

В горната формула на WCSS,

Паз в Клъстер1разстояние (Pаз° С1)2: Това е сумата от квадрата на разстоянията между всяка точка от данни и нейния центроид в рамките на клъстер1 и същото за другите два члена.

За да измерим разстоянието между точките от данни и центроида, можем да използваме всеки метод като евклидово разстояние или разстояние Манхатън.

За да намерите оптималната стойност на клъстерите, методът на коляното следва следните стъпки:

  • Той изпълнява клъстерирането на K-означава върху даден набор от данни за различни стойности на K (диапазони от 1-10).
  • За всяка стойност на K изчислява WCSS стойността.
  • Начертава крива между изчислените стойности на WCSS и броя на клъстерите K.
  • Острата точка на завоя или точка на графиката изглежда като ръка, тогава тази точка се счита за най-добрата стойност на К.

Тъй като графиката показва рязкото огъване, което прилича на лакът, следователно е известно като метод на лакътя. Графиката за метода на лакътя изглежда като изображението по-долу:

Алгоритъм за групиране на K-средни стойности

Забележка: Можем да изберем броя на клъстерите, равен на дадените точки от данни. Ако изберем броя на клъстерите, равен на точките от данни, тогава стойността на WCSS става нула и това ще бъде крайната точка на диаграмата.

Внедряване на Python на алгоритъм за групиране на K-средства

В горния раздел обсъдихме алгоритъма на K-средните, сега нека видим как може да бъде приложен с помощта Python .

Преди внедряването, нека разберем какъв тип проблем ще решим тук. И така, имаме набор от данни Mall_Customers , което са данни на клиенти, които посещават мола и харчат там.

В дадения набор от данни имаме Customer_Id, пол, възраст, годишен доход ($) и оценка на разходите (което е изчислената стойност на това колко клиент е похарчил в мола, колкото по-голяма е стойността, толкова повече е похарчил). От този набор от данни трябва да изчислим някои модели, тъй като това е неконтролиран метод, така че не знаем какво точно да изчислим.

Стъпките, които трябва да се следват за внедряването, са дадени по-долу:

    Предварителна обработка на данни Намиране на оптималния брой клъстери по метода на коляното Обучение на алгоритъма за K-средни стойности върху набора от данни за обучение Визуализиране на клъстерите

Стъпка 1: Стъпка на предварителна обработка на данни

Първата стъпка ще бъде предварителната обработка на данните, както направихме в предишните ни теми за регресия и класификация. Но що се отнася до проблема с групирането, той ще бъде различен от другите модели. Нека го обсъдим:

    Импортиране на библиотеки
    Както направихме в предишните теми, първо ще импортираме библиотеките за нашия модел, което е част от предварителната обработка на данни. Кодът е даден по-долу:
 # importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd 

В горния код, numpy ние сме импортирали за извършване на математически изчисления, matplotlib е за начертаване на графиката и панди са за управление на набора от данни.

какво е uri
    Импортиране на набора от данни:
    След това ще импортираме набора от данни, който трябва да използваме. Така че тук използваме набора от данни Mall_Customer_data.csv. Може да се импортира с помощта на кода по-долу:
 # Importing the dataset dataset = pd.read_csv('Mall_Customers_data.csv') 

Като изпълним горните редове код, ще получим нашия набор от данни в Spyder IDE. Наборът от данни изглежда като изображението по-долу:

Алгоритъм за групиране на K-средни стойности

От горния набор от данни трябва да намерим някои модели в него.

    Извличане на независими променливи

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

 x = dataset.iloc[:, [3, 4]].values 

Както виждаме, извличаме само 3rdи 4thособеност. Това е така, защото се нуждаем от 2d графика, за да визуализираме модела, а някои функции не са необходими, като customer_id.

Стъпка 2: Намиране на оптималния брой клъстери с помощта на метода на коляното

Във втората стъпка ще се опитаме да намерим оптималния брой клъстери за нашия проблем с клъстерирането. И така, както беше обсъдено по-горе, тук ще използваме метода на лакътя за тази цел.

Както знаем, методът на лакътя използва концепцията на WCSS, за да начертае графиката чрез нанасяне на WCSS стойности по оста Y и броя на клъстерите по оста X. Така че ще изчислим стойността за WCSS за различни k стойности, вариращи от 1 до 10. По-долу е кодът за него:

 #finding optimal number of clusters using the elbow method from sklearn.cluster import KMeans wcss_list= [] #Initializing the list for the values of WCSS #Using for loop for iterations from 1 to 10. for i in range(1, 11): kmeans = KMeans(n_clusters=i, init='k-means++', random_state= 42) kmeans.fit(x) wcss_list.append(kmeans.inertia_) mtp.plot(range(1, 11), wcss_list) mtp.title('The Elobw Method Graph') mtp.xlabel('Number of clusters(k)') mtp.ylabel('wcss_list') mtp.show() 

Както можем да видим в горния код, използвахме KMeans клас на sklearn. клъстерна библиотека за формиране на клъстерите.

След това създадохме wcss_list променлива за инициализиране на празен списък, който се използва да съдържа стойността на wcss, изчислена за различни стойности на k, вариращи от 1 до 10.

След това инициализирахме for цикъла за итерацията на различна стойност на k, варираща от 1 до 10; тъй като for цикъл в Python, изключете изходящия лимит, така че се приема като 11, за да включите 10thстойност.

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

Изход: След като изпълним горния код, ще получим изхода по-долу:

Алгоритъм за групиране на K-средни стойности

От горния график можем да видим, че точката на лакътя е в 5. Така че броят на клъстерите тук ще бъде 5.

Алгоритъм за групиране на K-средни стойности

Стъпка 3: Обучение на алгоритъма за K-средни стойности върху набора от данни за обучение

Тъй като имаме броя на клъстерите, сега можем да обучим модела върху набора от данни.

За да обучим модела, ще използваме същите два реда код, както използвахме в горния раздел, но тук вместо да използваме i, ще използваме 5, тъй като знаем, че има 5 клъстера, които трябва да бъдат формирани. Кодът е даден по-долу:

 #training the K-means model on a dataset kmeans = KMeans(n_clusters=5, init='k-means++', random_state= 42) y_predict= kmeans.fit_predict(x) 

Първият ред е същият като по-горе за създаване на обект на клас KMeans.

Във втория ред на кода създадохме зависимата променлива y_predict за обучение на модела.

Като изпълним горните редове код, ще получим променливата y_predict. Можем да го проверим под изследовател на променливи опция в Spyder IDE. Вече можем да сравним стойностите на y_predict с нашия оригинален набор от данни. Разгледайте изображението по-долу:

стек в java
Алгоритъм за групиране на K-средни стойности

От изображението по-горе вече можем да установим, че CustomerID 1 принадлежи към клъстер

3 (тъй като индексът започва от 0, следователно 2 ще се счита за 3), а 2 принадлежи към клъстер 4 и т.н.

Стъпка 4: Визуализиране на клъстерите

Последната стъпка е да визуализирате клъстерите. Тъй като имаме 5 клъстера за нашия модел, ще визуализираме всеки клъстер един по един.

За визуализиране на клъстерите ще се използва точкова диаграма с помощта на функцията mtp.scatter() на matplotlib.

 #visulaizing the clusters mtp.scatter(x[y_predict == 0, 0], x[y_predict == 0, 1], s = 100, c = 'blue', label = 'Cluster 1') #for first cluster mtp.scatter(x[y_predict == 1, 0], x[y_predict == 1, 1], s = 100, c = 'green', label = 'Cluster 2') #for second cluster mtp.scatter(x[y_predict== 2, 0], x[y_predict == 2, 1], s = 100, c = 'red', label = 'Cluster 3') #for third cluster mtp.scatter(x[y_predict == 3, 0], x[y_predict == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4') #for fourth cluster mtp.scatter(x[y_predict == 4, 0], x[y_predict == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5') #for fifth cluster mtp.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroid') mtp.title('Clusters of customers') mtp.xlabel('Annual Income (k$)') mtp.ylabel('Spending Score (1-100)') mtp.legend() mtp.show() 

В горните редове код сме написали код за всеки клъстер, вариращ от 1 до 5. Първата координата на mtp.scatter, т.е. x[y_predict == 0, 0], съдържаща стойността x за показване на матрицата на включва стойности, а y_predict варира от 0 до 1.

Изход:

Алгоритъм за групиране на K-средни стойности

Изходното изображение ясно показва петте различни клъстера с различни цветове. Клъстерите се формират между два параметъра на набора от данни; Годишен доход на клиента и разходи. Можем да променим цветовете и етикетите според изискването или избора. Можем също да наблюдаваме някои точки от горните модели, които са дадени по-долу:

    Клъстер1показва клиентите със средна заплата и средни разходи, за да можем да ги категоризираме като
  • Cluster2 показва, че клиентът има висок доход, но ниски разходи, така че можем да го категоризираме като внимателен .
  • Cluster3 показва ниските доходи, а също и ниските разходи, така че те могат да бъдат категоризирани като разумни.
  • Cluster4 показва клиентите с ниски доходи с много големи разходи, така че те могат да бъдат категоризирани като небрежен .
  • Cluster5 показва клиентите с високи доходи и големи разходи, така че те могат да бъдат категоризирани като целеви и тези клиенти могат да бъдат най-печелившите клиенти за собственика на мола.