Алгоритм кластеризации kmeans, kmeans++ и реализация на python

машинное обучение

1. км означает

kmeans, алгоритм кластеризации k-средних, который реализует алгоритм для обнаружения k кластеров набора данных, каждый кластер описывается его центром тяжести.

км означает шаги: (1) Случайным образом найти k точек в качестве центроидов (начальных точек); (2) Рассчитать расстояние от других точек до k семян и выбрать ближайшую из них в качестве категории точки; (3) Обновите центроиды различных типов и повторяйте до тех пор, пока центроиды не останутся неизменными.

Q: Как выбрать значение k?

A: График производительности модели при различных значениях k. Абсцисса — это количество кластеров k, а ордината — сумма расстояний от каждой точки до центра. K в точке перегиба (расстояние и скорость спуска становятся медленнее) в качестве выбранного значения.

2. км означает++

Поскольку начальное начальное значение kmeans находится случайно, скорость сходимости алгоритма очень тесно связана с начальным значением, поэтому kmeans++ в основном улучшает выбор начального значения. Выбор начального значения выглядит следующим образом:

1. Семя также выбирается случайным образом; 2. Вычислить расстояние от других точек до этого начального числа; 3. Выберите точку с этими большими расстояниями, чтобы заменить случайно выбранное начальное число в качестве новой исходной точки (большее расстояние здесь можно понимать как maxDistance*случайное число, а случайное число может быть выбрано из диапазона 0,5-1;); 4. Повторяйте шаги 1-3, пока не будет выбрано k семян.

3. Оцените эффект кластеризации

Метод коэффициента контура SC

Коэффициент силуэта объединяет сплоченность и разделение кластеров для оценки эффекта кластеризации. Значение находится в диапазоне от -1 до 1, и чем больше значение, тем лучше эффект кластеризации. этапы расчета: (1) Выберите точку, вычислить среднее расстояние от этой точки до всех других элементов в том же кластере, обозначенное как, количественно оценить степень сплоченности внутри кластера; (2) Выберите еще один кластер и рассчитайте среднее расстояние от точки до кластера. Выберите значение с наименьшим средним расстоянием между точкой и другими кластерами, обозначенное как, который используется для количественной оценки степени разделения между кластерами. (3) Для точек выборки, коэффициент силуэта равен:

a(i): среднее различие между вектором i и другими точками в том же кластере. b(i) : минимальное значение средней непохожести вектора i на другие кластеры.在这里插入图片描述Когда коэффициент силуэта

Следовательно, коэффициент силуэта можно использовать для определения значения K среднего значения K, и K с наибольшим коэффициентом силуэта выбирается в качестве окончательного числа классов.

(2)ошибка сумма квадратов

4. Другие вопросы

(1) Сойдутся ли средние значения?Целевая функция kmeans:在这里插入图片描述Шаг E: Оцените скрытые переменные, категорию, к которой принадлежит каждый образец在这里插入图片描述Шаг M: Назначение фиксированных точек данных, обновление параметров在这里插入图片描述Поскольку EM-алгоритм является сходящимся, kmeans в конечном итоге также сойдутся.

(2) Разница между Kmeans и KNN

КНН:

алгоритм классификации; контролируемое обучение; Набор данных — это данные с меткой; Нет очевидного тренировочного процесса, основанного на обучении на основе памяти;

Значение значения K - для выборки X, чтобы классифицировать ее, сначала из набора данных найдите K ближайших к ней точек данных рядом с X и разделите ее на класс, который принадлежит к большинству категорий.

К-означает:

алгоритм кластеризации; обучение без учителя; Набор данных представляет собой дезорганизованные данные без меток; Есть четкий тренировочный процесс;

Значение значения K - K - это заранее установленное число, набор данных разделен на кластеры K, он должен полагаться на предварительные знания человека.

разница:

Фундаментальное различие между этими двумя алгоритмами заключается в том, что K-средние — это, по сути, обучение без учителя, а KNN — обучение с учителем; K-средние — это алгоритм кластеризации, а KNN — это алгоритм классификации (или регрессии).

Алгоритм K-средних делит набор данных на кластеры так, чтобы сформированные кластеры были изоморфны, а точки в каждом кластере были близки друг к другу. Алгоритм пытается поддерживать достаточную разделимость между этими кластерами. Из-за неконтролируемого характера эти кластеры не имеют меток. Алгоритм KNN пытается классифицировать непомеченное наблюдение на основе его k (которое может быть любым числом) окружающих его соседей. Его также называют ленивым обучением, потому что оно предполагает минимальное обучение модели. Следовательно, он не распространяется на невидимые наборы данных без обучающих данных.

5. Практика

Kmeans код Python:

import numpy as np
class KMeans(object):
    def __init__(self, n_cluster, epochs=10):
        self.n_cluster = n_cluster
        self.epochs = epochs
        pass
    def init_centers(self, X):
        idx = np.random.randint(len(X), size=(self.n_cluster,))
        centers = X[idx,:]
        return centers

    def calculate_distance(self,arr1,arr2):
        # L2 distance.
        distance = np.mean(np.sqrt((arr1-arr2)**2))
        return distance
    def update_centers(self, X):
        predict_class = self.predict(X)
        # update centers
        centers = self.centers
        for ct in range(len(centers)):
            idx, = np.where(predict_class == ct)

            samples = X[idx, :]
            assert len(samples)>0
            centers[ct] = np.mean(samples,axis=0)
        self.centers = centers
        return self.centers

    def fit(self, X, y=None):
        self.centers = self.init_centers(X)
        for epoch in range(self.epochs):
            self.centers = self.update_centers(X)
        return self.centers
    def predict(self,X):
        predict_class = np.zeros(shape=(len(X),))
        centers = self.centers
        for n_sample,arr in enumerate(X):
            min_distance = float("inf")
            p_class = 0
            for ct in range(len(centers)):
                distance = self.calculate_distance(arr,centers[ct])
                if distance < min_distance:
                    min_distance = distance
                    p_class = ct
            predict_class[n_sample] = p_class
        return predict_class
    def score(self, X):
        pass

Пример: Задайте 3 распределения Гаусса.

np.random.seed(1)
data1 = np.random.normal(1, 0.5, size=(100, 2))
np.random.seed(1)
data2 = np.random.normal(4, 0.8, size=(100, 2))
np.random.seed(1)
data3 = np.random.normal(7, 0.8, size=(100, 2))
X = np.concatenate((data1, data2, data3),axis=0)#np.random.randint(10,size=(100,2))
print(X.shape)
kmeans = KMeans(3)
centers = kmeans.fit(X)
print(centers)

Визуализируйте результаты кластеризации:

# Generate scatter plot for training data
import matplotlib.pyplot as plt

plt.scatter(X[:,0], X[:,1], marker="o", picker=True)
plt.title('Clusters of data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.scatter(centers[:,0], centers[:,1], marker="v", picker=True)
plt.show()
在这里插入图片描述
вставьте сюда описание изображения

Ссылаться на:

  1. kmeans++_Rakuten Notes;
  2. kmeans_cool оболочка;
  3. Как определить значение k k-средних?;
  4. sklearn kmeans;
  5. Коэффициент силуэта энциклопедии;
  6. Сходимость алгоритма EM и сходимость K-средних;
  7. Разница между KNN и KMeans

В этой статье используетсяmdniceнабор текста