Python: реализация алгоритма кластеризации

Python

  Кластеризация часто используется на ранней стадии исследования или добычи данных, исследовательского анализа без предварительного опыта, а также подходит для предварительной обработки данных в случае большого размера выборки. Например, по пользовательским характеристикам предприятия в целом перед получением релевантных данных или опыта сначала сгруппировать пользователей по характеристикам самих данных, а затем провести дальнейший анализ по разным группам; например, дискретизировать непрерывные данные для облегчить последующую классификацию и анализ приложений.

Обычно используемые алгоритмы кластеризации делятся на алгоритмы, основанные на делении, иерархии, плотности, сетке, статистике, модели и т. д. Типичные алгоритмы включают K-средних (классический алгоритм кластеризации), DBSCAN, двухэтапную кластеризацию, BIRCH, класс спектральной кластеризации и т. д.

Проблемы, которые может решить кластерный анализ, включают: на сколько категорий можно разделить набор данных, сколько выборок имеет каждая категория, насколько сильны и слабы отношения между переменными в разных категориях, каковы типичные характеристики разных категорий и т. д. ; Помимо разделения на категории, кластеризацию можно также использовать для других приложений, основанных на разделении на классы, таких как сжатие изображений. Однако кластеризация не может дать четкого направления действий, а результаты кластеризации в большей степени являются предварительной обработкой и справочными данными для последующей работы по добыче и анализу и не могут ответить на вопросы «почему» и «как».

Влияние аномалий данных на результаты кластеризации

K-средние (K-Means) — один из наиболее часто используемых методов кластеризации.Он вычисляет наилучшую атрибуцию категории на основе схожести межточечных расстояний, но перед применением K-средних необходимо учитывать две аномалии данных. :

  1. выбросы в данных. Выбросы в данных могут значительно изменить сходство расстояний между разными точками, и этот эффект очень значителен. Следовательно, в режиме дискриминации на основе сходства расстояний обработка выбросов имеет важное значение.
  2. Аномальная размерность данных. Если существуют различия в числовом масштабе или измерении между различными измерениями и переменными, то переменные должны быть нормализованы или стандартизированы перед определением расстояний. Например, интервал числового распределения показателя отказов равен [0, 1], сумма заказа может быть равна [0, 10 000 000], а сумма заказа равна [0, 1000], если нет операции нормализации или нормализации, тогда сходство будет в основном зависеть от суммы заказа.

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

  K-means очень хорошо работает с точки зрения стабильности, эффективности и точности алгоритма (дискриминативный по отношению к меткам истинности основания) и по-прежнему делает это при работе с большими объемами данных. Верхняя граница временной сложности его алгоритма составляет O(nkt), где n — размер выборки, k — количество разделенных кластеров, t — количество итераций. Когда количество кластеров и количество итераций остаются неизменными, потребление времени алгоритмом K-средних связано только с размером выборки, поэтому оно будет увеличиваться линейно.

Борьба с кластеризацией многомерных данных

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

  • Перед лицом многомерных данных эффективность расчета подобия на основе расстояния чрезвычайно низка;
  • Большое количество атрибутивных признаков многомерного пространства делает возможность существования кластеров во всех измерениях очень низкой;
  • Из-за характеристик разреженности и соседства сходство на основе расстояния почти равно нулю, что затрудняет существование кластеров данных в многомерном пространстве.

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

  • Уменьшение размерности — эффективный способ работы с многомерными данными.выбор функцииилипреобразование размеровСокращение или отображение пространства высокой размерности на пространство низкой размерности напрямую решает проблему высокой размерности.
  • Алгоритм кластеризации подпространства является расширением традиционного алгоритма кластеризации в многомерном пространстве данных.Идея состоит в том, чтобы выбрать измерения, тесно связанные с данным кластером, а затем выполнить кластеризацию в соответствующем подпространстве. Например, спектральная кластеризация — это метод кластеризации подпространства. Поскольку метод выбора соответствующего измерения и метод оценки подпространства необходимо настраивать, этот метод предъявляет более высокие требования к оператору.

Как выбрать алгоритм кластерного анализа

Существуют десятки алгоритмов кластеризации, выбор алгоритма кластеризации в основном зависит от следующих факторов:

  • Если набор данных имеет большую размерность, выберите спектральную кластеризацию, которая является типом разделения подпространства.
  • Если объем данных небольшой и средний, например, в пределах 100W, то лучшим выбором будет K-means; если объем данных превышает 100W, можно рассмотреть возможность использования Mini Batch KMeans.
  • Если в наборе данных есть шумы (выбросы), то использование DBSCAN на основе плотности может эффективно решить эту проблему.
  • Если требуется более высокая точность классификации, то спектральная кластеризация будет лучшим выбором, чем точность K-средних.

Кластерный анализ Python

import numpy as np 
import matplotlib.pyplot as plt


# 数据准备
raw_data = np.loadtxt('./pythonlearn/cluster.txt') # 导入数据文件
X = raw_data[:, :-1] # 分割要聚类的数据
y_true = raw_data[:, -1] 

print(X)

[[ 0.58057881  0.43199283]
 [ 1.70562094  1.16006288]
 [ 0.8016818  -0.51336891]
 ...
 [-0.75715533 -1.41926816]
 [-0.34736103 -0.84889633]
 [ 0.61103884 -0.46151157]]

Обучите модель кластеризации

Обучите модель кластеризации. Сначала установите количество кластеров равным 3 и установите объект модели кластеризации, затем обучите модель с помощью метода подгонки и используйте метод прогнозирования для приложения кластеризации, чтобы получить набор меток кластеризации y_pre исходного обучающего набора (вы также можете напрямую получить набор меток кластеризации y_pre после применения метода подгонки). Атрибут labels_ объекта класса получает метки кластеризации обучающего набора); из полученной модели кластеризации через ее атрибут cluster_centers_ и атрибут inertia_ сумма центра каждой категории и получается центр кластера с ближайшим расстоянием выборки.

from sklearn.cluster import KMeans # 导入Sklearn聚类模块

n_clusters = 3 # 设置聚类数量
model_kmeans = KMeans(n_clusters=n_clusters, random_state=0) # 建立聚类模型对象

Точка знаний: сохранить алгоритм на жесткий диск

Встроенная стандартная библиотека Python, cPickle, является эффективной библиотекой для реализации этого процесса. cPickle может сериализовать/сохранять любой тип объекта Python, и объекты модели алгоритма не являются исключением. Основными методами применения cPickle являются дамп и загрузка.

  • дамп: сериализовать и сохранить объекты Python в локальный файл
  • load: чтение объекта Python из локального файла и восстановление объекта экземпляра

Примечание: используйте pickle в python3, cPickle в python2.

import pickle
pickle.dump(model_kmeans, open("my_model_object.pkl","wb"))
model_kmeans2 = pickle.load(open("my_model_object.pkl","rb"))

model_kmeans2.fit(X) # 训练聚类模型
y_pre = model_kmeans2.predict(X) # 预测聚类模型
print(y_pre)
[1 1 2 0 2 0 1 1 0 0 0 1 2 1 2 1 0 2 2 2 2 2 1 2 1 0 0 1 1 0 0 2 2 2 0 0 2
 0 1 2 2 2 1 1 2 2 2 1 1 0 0 1 1 1 0 2 0 2 1 0 1 0 1 1 0 2 2 2 1 1 1 0 1 1
 0 1 1 2 1 1 1 0 2 1 2 0 0 1 0 1 2 0 0 1 1 1 2 0 0 1 2 1 1 0 2 1 0 2 1 1 2
 1 2 1 2 2 0 0 1 1 2 2 1 1 0 1 1 1 2 1 1 0 2 2 1 2 0 1 2 1 0 2 2 1 2 2 2 1
 2 1 1 0 1 1 0 0 2 1 1 1 1 1 2 2 1 1 0 0 1 0 2 2 1 2 0 1 0 1 1 1 0 0 0 2 0
 1 0 0 2 0 1 2 0 1 0 0 0 1 2 0 2 1 2 0 2 1 1 2 1 1 1 1 1 1 2 2 0 2 0 1 0 1
 1 1 2 2 2 0 1 2 0 0 2 2 1 0 2 2 1 1 2 2 1 2 2 0 2 2 2 1 0 1 2 2 2 1 2 0 0
 1 2 2 2 0 1 2 2 2 2 2 0 0 1 0 0 1 1 0 0 1 2 0 2 0 1 2 2 0 0 1 1 0 1 2 2 0
 0 2 1 1 0 1 1 1 2 1 2 1 2 0 2 0 1 0 1 0 0 1 2 0 2 2 1 0 0 0 2 0 1 0 1 0 1
 2 1 2 2 0 0 1 0 1 2 2 1 2 0 2 2 1 1 1 1 2 2 2 2 2 2 1 2 1 0 2 2 0 1 2 0 2
 1 2 2 1 2 2 2 2 2 2 0 2 0 0 2 0 1 2 2 2 0 2 0 0 1 2 1 0 0 1 2 0 2 1 1 0 1
 0 0 0 0 0 2 1 2 0 1 1 0 2 2 2 1 2 1 2 2 0 2 2 2 0 1 0 1 1 1 0 0 1 0 0 2 0
 1 0 1 1 1 2 0 2 2 2 0 1 0 1 1 1 1 1 1 0 1 2 1 1 1 2 2 2 2 2 2 0 0 2 0 0 1
 0 1 2 1 0 0 0 2 1 2 1 2 2 0 0 0 0 1 1 1 0 2 0 0 1 0 2 0 2 0 1 1 2 1 1 2 0
 1 0 1 0 0 0 0 0 2 2 0 1 2 0 0 1 1 1 0 1 2 2 0 1 2 1 2 2 2 1 2 0 1 1 1 2 0
 0 1 1 0 2 0 2 2 2 1 0 2 0 0 0 1 0 1 1 0 2 2 0 1 1 1 2 2 1 2 1 2 1 0 0 2 0
 2 2 0 0 1 0 1 2 2 1 0 1 2 2 1 0 0 0 1 1 1 0 2 2 0 2 2 2 0 1 2 2 2 0 2 1 1
 0 0 0 0 0 0 1 2 1 1 1 2 2 2 1 0 1 2 2 1 0 2 1 2 2 0 1 0 1 0 0 2 1 2 0 0 1
 0 2 0 2 1 0 2 1 1 1 0 0 1 2 2 1 2 2 0 0 1 1 0 2 0 1 1 2 0 2 1 0 0 2 2 1 1
 1 0 0 2 1 0 1 2 0 0 2 0 2 0 1 2 1 0 0 1 1 2 1 1 1 0 0 1 2 2 0 0 2 0 2 0 1
 1 0 0 0 1 0 0 0 1 0 1 2 2 0 0 2 2 1 0 0 0 2 1 0 1 0 1 2 2 0 0 1 2 2 1 0 2
 2 1 0 2 1 2 2 1 2 1 2 2 0 0 0 0 2 2 1 1 2 1 1 1 0 1 0 2 1 0 2 1 2 1 2 0 2
 0 1 0 1 1 1 0 2 2 0 0 1 0 0 0 0 0 0 0 2 0 2 0 2 2 0 1 0 2 1 2 1 2 1 2 0 2
 1 2 1 2 2 2 0 2 0 0 0 0 2 0 0 1 1 0 0 2 1 1 0 2 0 1 2 0 2 2 1 1 1 1 0 2 1
 1 0 0 1 0 2 2 1 2 1 0 2 0 1 1 2 0 1 2 0 1 0 1 1 1 1 0 1 2 0 1 0 2 0 0 0 0
 0 1 1 2 0 0 0 1 2 0 1 2 2 2 0 1 0 2 2 2 2 1 2 0 1 2 0 0 0 0 0 0 1 0 0 0 0
 2 0 2 2 2 2 2 2 0 2 1 0 0 2 2 2 2 0 2 0 2 0 2 1 1 2 1 2 1 1 1 2 2 0 0 0 0
 2]

Оценка индекса производительности модели

from sklearn import metrics # 导入sklearn效果评估模块

n_samples, n_features = X.shape # 总样本量,总特征数
print ('samples: %d \t features: %d' % (n_samples, n_features))  # 打印输出样本量和特征数量

samples: 1000 	 features: 2

Метрика оценки 1: инерция

Инерция — это атрибут объекта модели K-средних, представляющий сумму центров кластеров с ближайшим расстоянием выборки, и он используется в качестве метрики неконтролируемой оценки без метки истинного результата классификации. Чем меньше значение, тем лучше.Чем меньше значение, тем концентрированнее распределение выборок между классами, то есть меньше расстояние между классами.

inertias = model_kmeans.inertia_  # 样本距离最近的聚类中心的总和
print(inertias)
300.1262936093466

Индикатор оценки 2: скорректированный_ранд_с:, скорректированный индекс ранда

Индекс Рэнда вычисляет меру подобия между двумя кластерами, рассматривая все пары выборок и отсчетов, назначенных в одном и том же или разных кластерах в предсказанных и истинных кластерах. Скорректированный индекс Рэнда получает значение, близкое к 0, независимо от размера выборки и категории путем корректировки индекса Рэнда, а диапазон его значений составляет [-1, 1].Хорошо, что означает, что результаты кластеризации более соответствуют реальной ситуации .

adjusted_rand_s = metrics.adjusted_rand_score(y_true, y_pre)  # 调整后的兰德指数
print(adjusted_rand_s)
0.9642890803276076

Индикатор оценки 3: взаимная_информация_с, взаимная информация (Взаимная информация, МИ)

Взаимная информация — это количество информации, содержащейся в одной случайной величине о другой случайной величине, в данном случае это мера сходства между двумя метками одних и тех же данных, что приводит к неотрицательному значению.

mutual_info_s = metrics.mutual_info_score(y_true, y_pre)  # 互信息
print(mutual_info_s)
1.0310595406681184

Индикатор оценки 4: Adjust_mutual_info_s, Скорректированная взаимная информация (AMI)

Скорректированная взаимная информация представляет собой скорректированную оценку оценки взаимной информации. Он принимает во внимание, что, как правило, MI выше для кластеров с большим числом, независимо от того, существует ли на самом деле больше обмена информацией, и корректирует этот эффект, корректируя вероятность кластеров. AMI возвращает значение 1, когда два набора кластеров идентичны (т. е. точное совпадение); случайные разделы (независимые метки) имеют среднее ожидаемое значение AMI около 0 и может быть отрицательным.

adjusted_mutual_info_s = metrics.adjusted_mutual_info_score(y_true, y_pre)  # 调整后的互信息
print(adjusted_mutual_info_s)
0.938399249349474


/anaconda3/lib/python3.6/site-packages/sklearn/metrics/cluster/supervised.py:732: FutureWarning: The behavior of AMI will change in version 0.22. To match the behavior of 'v_measure_score', AMI will use average_method='arithmetic' by default.
  FutureWarning)

Индикатор оценки 5: однородность_s, показатель однородности (гомогенность)

Если все кластеры содержат только точки данных, принадлежащие одному классу, результаты кластеризации будут удовлетворять требованиям однородности. Чем больше диапазон значений [0,1], тем больше результаты кластеризации соответствуют реальной ситуации.

homogeneity_s = metrics.homogeneity_score(y_true, y_pre)  # 同质化得分
print(homogeneity_s)
0.9385116928897981

Индикатор оценки 6: полнота_s, балл полноты (Completeness)

Результат кластеризации удовлетворяет требованиям полноты, если все точки данных, являющиеся членами данного класса, являются элементами одного и того же кластера. Чем больше диапазон значений [0,1], тем больше результаты кластеризации соответствуют реальной ситуации.

completeness_s = metrics.completeness_score(y_true, y_pre)  # 完整性得分
print(completeness_s)
0.9385372785555511

Метрика оценки 7: v_measure_s, оценка V-меры

Это среднее гармоническое между однородностью и целостностью, v=2*(однородность*целостность)/(однородность+целостность). Его диапазон значений составляет [0, 1], и чем больше значение, тем более согласуются результаты кластеризации с реальной ситуацией.

v_measure_s = metrics.v_measure_score(y_true, y_pre)  # V-measure得分
print(v_measure_s)
0.938524485548298

Индикатор оценки 8: Silhouette_s, коэффициент силуэта (Силуэт)

Он используется для расчета среднего коэффициента силуэта всех выборок, рассчитанного с использованием среднего расстояния внутри кластера и среднего расстояния до ближайшего кластера для каждой выборки, и представляет собой неконтролируемую оценочную метрику. Его наивысшее значение равно 1, наихудшее равно -1, значения около 0 указывают на перекрывающиеся кластеры, а отрицательные значения обычно указывают на то, что они были назначены неправильному кластеру.

silhouette_s = metrics.silhouette_score(X, y_pre, metric='euclidean')  # 平均轮廓系数
print(silhouette_s)
0.6342086134083013

Метрика оценки 9: баллы calinski_harabaz_s, Calinski и Harabaz

Оценка определяется как отношение дисперсии внутри кластера к дисперсии между кластерами и представляет собой неконтролируемую оценочную метрику.

calinski_harabaz_s = metrics.calinski_harabaz_score(X, y_pre)  # Calinski和Harabaz得分
print(calinski_harabaz_s)
2860.8215946947635

Визуализация эффекта модели

centers= model_kmeans.cluster_centers_ # 各类别中心
colors = ['#4EACC5', '#FF9C34', '#4E9A06']  # 设置不同类别的颜色
plt.figure() # 建立画布
for i in range(n_clusters):  # 循环读类别
    index_sets = np.where(y_pre == i)  # 找到相同类的索引集合
    cluster = X[index_sets]  # 将相同类的数据划分为一个聚类子集
    plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i], marker='.')  # 展示聚类子集内的样本点
    plt.plot(centers[i][0], centers[i][1], 'o', markerfacecolor=colors[i], markeredgecolor='k',
             markersize=6)  # 展示各聚类子集的中心
plt.show() # 展示图像

    

在这里插入图片描述

Применение модели

new_X = [[1,3.6]]
cluster_label = model_kmeans.predict(new_X)
print('cluster of new data point is:  %d' % cluster_label)
cluster of new data point is:  1