Рубрики
Без рубрики

K-означает кластеризацию с нуля в Python [Algorithm объяснил]

K-средства – очень популярная техника кластеризации. K-означает кластеризацию кластеризации к другому классу алгоритмов у обучения, используемые для выявления кластеров

Автор оригинала: Pankaj Kumar.

K-средства – очень популярная техника кластеризации. K-означает кластеризацию кластеризации k – еще один класс неожиданных алгоритмов обучения, используемые для выяснения кластеров данных в данном наборе данных.

В этой статье мы реализуем K-означает алгоритм кластеризации с нуля с помощью модуля Numpy.

5 шагов в K-означает алгоритм кластеризации

Шаг 1. Случайно выбрать K точек данных как наши исходные центры.

Шаг 2. Найдите расстояние (евклидовое расстояние для нашей цели) между каждыми точками данных в нашем обучении, установленном с центром K.

Шаг 3. Теперь назначьте каждую точку данных на ближайший центр Centroc в соответствии с обнаруженным расстоянием.

Шаг 4. Обновите местоположение центроида, принимая в среднем точки в каждой группе кластера.

Шаг 5. Повторите шаги от 2 до 4, пока наши центроиды не меняются.

Мы можем выбрать оптимальное значение k (количество кластеров), используя такие методы, как метод локтя.

Реализация k-означает алгоритм кластеризации

Давайте реализуем вышеупомянутые шаги в код сейчас. Импортируйте Numpy Module, а затем пройдите через остальную часть кода, чтобы получить понимание того, как K-означает кластеризация K-означает в коде.

#Importing required modules

import numpy as np
from scipy.spatial.distance import cdist 

#Function to implement steps given in previous section
def kmeans(x,k, no_of_iterations):
    idx = np.random.choice(len(x), k, replace=False)
    #Randomly choosing Centroids 
    centroids = x[idx, :] #Step 1
    
    #finding the distance between centroids and all the data points
    distances = cdist(x, centroids ,'euclidean') #Step 2
    
    #Centroid with the minimum Distance
    points = np.array([np.argmin(i) for i in distances]) #Step 3
    
    #Repeating the above steps for a defined number of iterations
    #Step 4
    for _ in range(no_of_iterations): 
        centroids = []
        for idx in range(k):
            #Updating Centroids by taking mean of Cluster it belongs to
            temp_cent = x[points==idx].mean(axis=0) 
            centroids.append(temp_cent)

        centroids = np.vstack(centroids) #Updated Centroids 
        
        distances = cdist(x, centroids ,'euclidean')
        points = np.array([np.argmin(i) for i in distances])
        
    return points 


Вышеуказанная функция возвращает массив кластерных меток для каждой точки данных в нашем учебном наборе.

Тестирование кластеров K-означает

Мы будем использовать цифры набора данных (встроенные в модуле Sklearn) для тестирования нашей функции. Вы можете обратиться к этой статье, чтобы узнать больше о построении K-означает кластеры.

#Loading the required modules

import numpy as np
from scipy.spatial.distance import cdist 
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

#Defining our function 
def kmeans(x,k, no_of_iterations):
    idx = np.random.choice(len(x), k, replace=False)
    #Randomly choosing Centroids 
    centroids = x[idx, :] #Step 1
    
    #finding the distance between centroids and all the data points
    distances = cdist(x, centroids ,'euclidean') #Step 2
    
    #Centroid with the minimum Distance
    points = np.array([np.argmin(i) for i in distances]) #Step 3
    
    #Repeating the above steps for a defined number of iterations
    #Step 4
    for _ in range(no_of_iterations): 
        centroids = []
        for idx in range(k):
            #Updating Centroids by taking mean of Cluster it belongs to
            temp_cent = x[points==idx].mean(axis=0) 
            centroids.append(temp_cent)

        centroids = np.vstack(centroids) #Updated Centroids 
        
        distances = cdist(x, centroids ,'euclidean')
        points = np.array([np.argmin(i) for i in distances])
        
    return points 


#Load Data
data = load_digits().data
pca = PCA(2)
 
#Transform the data
df = pca.fit_transform(data)

#Applying our function
label = kmeans(df,10,1000)

#Visualize the results

u_labels = np.unique(label)
for i in u_labels:
    plt.scatter(df[label == i , 0] , df[label == i , 1] , label = i)
plt.legend()
plt.show()
Построение k-означает кластеризацию

Выходные результаты выглядят перспективными. Наша реализация работает.

Заключение

В этой статье мы создали алгоритм кластеризации K-означает с нуля с помощью Python. Мы также охватываем шаги, чтобы сделать алгоритм K-означает и, наконец, проверил нашу реализацию на набор данных цифр. Вы можете прочитать аспекты теории k-означает алгоритм кластеризации на Страница Википедии здесь

Счастливое обучение