从统计学的观点看,聚类分析是通过数据建模简化数据的一种方法。
从机器学习角度讲,簇相当于隐藏模式。
相关文献:
- 【书籍】数据挖掘概念与技术
- Comparing different clustering algorithms on toy datasets(在同一数据集上,不同聚类算法的效果)
- 聚类算法简介
- 聚类算法分类
- 聚类分析、数据挖掘、关联规则这几个概念的关系
限制:kmeans需要指定最终形成的类的数量。
【场景】更适合大数据量,高维度的情况。
【关系】Mini Batch K-Means = k-means + 随机抽样
参考:
用scikit-learn学习K-Means聚类(包括K值评估标准)
scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法
这里放上一个scikit-learn官方的例子,在这些例子中,加入了一些注释,帮助读者理解。
#!/usr/bin/python
# -*- coding: utf-8 -*-
""" ========================================================= K-means Clustering ========================================================= The plots display firstly what a K-means algorithm would yield using three clusters. It is then shown what the effect of a bad initialization is on the classification process: By setting n_init to only 1 (default is 10), the amount of times that the algorithm will be run with different centroid seeds is reduced. The next plot displays what using eight clusters would deliver and finally the ground truth. """
print(__doc__)
# Code source: Gaël Varoquaux
# Modified for documentation by Jaques Grobler
# License: BSD 3 clause
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.cluster import KMeans
from sklearn import datasets
np.random.seed(5)
centers = [[1, 1], [-1, -1], [1, -1]]
iris = datasets.load_iris() # 获取实验数据。
X = iris.data
y = iris.target # 标签。(标示花的分类是哪个)
estimators = {'k_means_iris_3': KMeans(n_clusters=3),
'k_means_iris_8': KMeans(n_clusters=8),
'k_means_iris_bad_init': KMeans(n_clusters=3, n_init=1,
init='random')}
fignum = 1
for name, est in estimators.items():
fig = plt.figure(fignum, figsize=(4, 3))
plt.clf()
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
plt.cla()
est.fit(X) # 对 X 中的数据进行聚类。
labels = est.labels_ # 获取聚类结束之后,各个数据的标签(用来标示 聚类结果)。
ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=labels.astype(np.float)) # X 行数与 lables的元素个数是一样的。所以用labels作为颜色的标志。
# 用来显示坐标轴数据,刻度。
ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
# 用来说明坐标轴名称。
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
fignum = fignum + 1
# Plot the ground truth
fig = plt.figure(fignum, figsize=(4, 3))
plt.clf()
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
plt.cla()
for name, label in [('Setosa', 0),
('Versicolour', 1),
('Virginica', 2)]:
# numpy 的高级索引使用
ax.text3D(X[y == label, 3].mean(),
X[y == label, 0].mean() + 1.5,
X[y == label, 2].mean(), name,
horizontalalignment='center',
bbox=dict(alpha=.5, edgecolor='w', facecolor='w'))
# Reorder the labels to have colors matching the cluster results
y = np.choose(y, [1, 2, 0]).astype(np.float)
ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y)
ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
plt.show()
参考:
[Python] Scikit-learn的kmeans聚类
numpy基本使用
一个层次的聚类方法将数据对象组织成一棵聚类的树。
分类
层次聚类分为分裂的(自上而下),凝聚的(自下而上)两种方式。
适用场景
挖掘数据的潜在关系。
缺陷
一旦一个步骤(合并或分裂)完成,它就不能撤销。
K-Means善于处理凸数据集问题,但对于非凸数据集的聚类表现不好。而基于密度的聚类从某种程度上克服了这类缺点。
【wiki】什么是凸集?
DBSCAN密度聚类算法
用scikit-learn学习DBSCAN聚类
【知乎】如何评价聚类结果的好坏?
【scikit官网】Empirical evaluation of the impact of k-means initialization(对于kmeans初始化影响的经验评价)
tips: