Кластеризация часто используется на ранней стадии исследования или добычи данных, исследовательского анализа без предварительного опыта, а также подходит для предварительной обработки данных в случае большого размера выборки. Например, по пользовательским характеристикам предприятия в целом перед получением релевантных данных или опыта сначала сгруппировать пользователей по характеристикам самих данных, а затем провести дальнейший анализ по разным группам; например, дискретизировать непрерывные данные для облегчить последующую классификацию и анализ приложений.
Обычно используемые алгоритмы кластеризации делятся на алгоритмы, основанные на делении, иерархии, плотности, сетке, статистике, модели и т. д. Типичные алгоритмы включают K-средних (классический алгоритм кластеризации), DBSCAN, двухэтапную кластеризацию, BIRCH, класс спектральной кластеризации и т. д.
Проблемы, которые может решить кластерный анализ, включают: на сколько категорий можно разделить набор данных, сколько выборок имеет каждая категория, насколько сильны и слабы отношения между переменными в разных категориях, каковы типичные характеристики разных категорий и т. д. ; Помимо разделения на категории, кластеризацию можно также использовать для других приложений, основанных на разделении на классы, таких как сжатие изображений. Однако кластеризация не может дать четкого направления действий, а результаты кластеризации в большей степени являются предварительной обработкой и справочными данными для последующей работы по добыче и анализу и не могут ответить на вопросы «почему» и «как».
Влияние аномалий данных на результаты кластеризации
K-средние (K-Means) — один из наиболее часто используемых методов кластеризации.Он вычисляет наилучшую атрибуцию категории на основе схожести межточечных расстояний, но перед применением K-средних необходимо учитывать две аномалии данных. :
- выбросы в данных. Выбросы в данных могут значительно изменить сходство расстояний между разными точками, и этот эффект очень значителен. Следовательно, в режиме дискриминации на основе сходства расстояний обработка выбросов имеет важное значение.
- Аномальная размерность данных. Если существуют различия в числовом масштабе или измерении между различными измерениями и переменными, то переменные должны быть нормализованы или стандартизированы перед определением расстояний. Например, интервал числового распределения показателя отказов равен [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