聚类算法
聚类: 是将数据集划分成簇(cluster)的任务,使得一个簇内的数据点非常相似不同簇内的数据点非常不同。
k均值:可以用簇的平均值来表示簇,可看作一种分解方法。
凝聚聚类:可以提供数据的可能划分的整个层次结构、可以通过树状图可视化。
DBSCAN:可以检测噪声点、自动判断簇的数量,可应用于复杂形状。
k均值聚类
k均值
k均值:视图找到代表数据特定区域簇中心(cluster center)。
算法步骤:将每个数据点分配给最近的簇中心,然后将每个簇中心设置为所分配的所有数据点的平均值,如果簇的分配不再发生变化,则算法结束。
3个假设:
- KMeans假设所有聚类是凸形的(圆、球)
- 所有特征在同一度量范围内(可能需要标准化处理)
- 分组之间是均衡的(分组中的观察值数量大致相等)
from sklearn.culster import KMeans
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
矢量量化
矢量量化(Vector Quantization):可以将其看作仅用一个分量来表示每个数据点,该分量由簇中心给出。这种观点将k均值看作一种分解方法,其中每个点用单一分类来表示。
其他分解方法:(分量和)
PCA:试图找到数据中方差最大的方向
NMF:试图找到累加的分量
优缺点、参数
参数:
- n_clusters:设置簇的个数
- random_state:随机种子数
优点:
- k均值作矢量量化,可用比输入维度更多的簇对数据编码
- 运行速度较快,可扩展到大型数据集
缺点:
- 依赖初始化参数(簇的个数、随机种子(默认为10))
- k均值无法识别非球形簇
- k均值无法识别具有复杂形状的簇
- 对簇形状的假设的约束性较强
KMeans 实现
KMeans聚类算法
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
iris = load_iris()
features = iris.data
# 特征标准化
standardizer = StandardScaler()
features_std = standardizer.fit_transform(features)
# 实例化一个KMeans对象
cluster = KMeans(n_clusters=3, random_state=0, n_jobs=-1)
# 拟合模型
model = cluster.fit(features_std)
# 查看预测预测观察值的分类,返回值相同
model.predict(features_std)
cluster.labels_
# 查看分类的中心点
model.cluster_centers_
加速KMeans聚类
MiniBatchKMeans:与KMeans相似,区别在于KMeans计算量大的步骤只在观察值的一部分随机样本上而非所有的观察值上执行,MiniBatchKMeans可以在只损失一小部分质量的情况下显著缩短算法收敛的时间。
batch_size
:该参数控制每个批次随机选择的观察值的数量
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import MiniBatchKMeans
from sklearn.datasets import load_iris
iris = load_iris()
features = iris.data
# 特征标准化
standardizer = StandardScaler()
features_std = standardizer.fit_transform(features)
# 实例化一个KMeans对象
cluster = MiniBatchKMeans(n_clusters=3, random_state=0, batch_size=100)
# 拟合模型
model = cluster.fit(features_std)
Meanshift聚类算法
Meanshift:不需要设定聚类的数量,不需要假设聚类的形状。
Meanshift参数
bandwidth
:设d定一个观察值可以决定移动方向的区域(核)的半径,默认情况下会计算一个合理的值
cluster_all
:若设定为False,孤值的标签被赋为-1
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import MeanShift
from sklearn.datasets import load_iris
iris = load_iris()
features = iris.data
# 特征标准化
standardizer = StandardScaler()
features_std = standardizer.fit_transform(features)
# 实例化一个KMeans对象
cluster = MeanShift(n_jobs=-1)
# 拟合模型
model = cluster.fit(features_std)
凝聚聚类
AgglomerativeClustering聚类算法
凝聚聚类(Agglomerative Clustering)指的是许多基于相同原则构建的剧烈算法。这个原则是,算法首先声明每个点是自己的簇,然后合并两个相似的簇,直到满足某种停止条件为止。(sklearn实现的停止准则为簇的个数)。
通过linkage参数设定合并策略:
ward
:默认选项,合并后的聚类的方差增加最小average
:两个聚类之间观察的平均距离最小的两个簇合并complete
:两个聚类之间观察值的最大距离最小的两个簇合并
from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=3)
cluster.fit(X)
层次聚类与树状图
层次聚类
层次聚类(Hierarchical Clustering):从一个单点簇变为属于最终的某个簇,每个中间步骤都提供了数据的一种聚类,可视化易于理解。
树状图
from sklearn.datasets import make_blobs
# 从Scipy中导入dendrogram函数和ward聚类函数
from scipy.cluster.hierarchy import dendrogram, ward
X, y = make_blobs(random_state=0, n_samples=12)
# 将ward聚类应用于数据数组X
# Scipy的ward函数返回一个数组,指定执行凝聚聚类是跨越的距离
linkage_array = ward(X)
# 现在为包含簇之间距离的linkage_array绘制树状图
dendrogram(linkage_array)
# 在树中标记划分成两个簇或者三个簇的位置
ax = plt.gca()
bounds = ax.get_xbound()
ax.plot(bounds, [7.25, 7.25], '--', c='k')
ax.plot(bounds, [4, 4], '--', c='k')
ax.text(bounds[1], 7.25, 'two clusters', va='center', fontdict={'size':15})
ax.text(bounds[1], 4, 'three clusters', va='center', fontdict={'size':15})
plt.xlabel("Sample index")
plt.ylabel("Cluster distance")
优缺点、参数
参数:
- affinity:决定linkage使用何种距离度量(比如minkowski、euclidean)
- n_clusters:聚类的数量(至此合并停止)
优点:
是一个强大且灵活的层次聚类算法
缺点:
无法分类复杂的形状
AgglomerativeClustering实现
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import load_iris
iris = load_iris()
features = iris.data
# 特征标准化
standardizer = StandardScaler()
features_std = standardizer.fit_transform(features)
# 实例化一个KMeans对象
cluster = AgglomerativeClustering(n_clusters=3)
# 拟合模型
model = cluster.fit(features_std)
DBSCAN聚类算法
DBSCAN
DBSCAN(Density-Based Spatial Clustering Of Applications With Noise,具有噪声的基于密度的空间聚类应用):识别特征空间的”拥挤“区域中的点。
DBSCAN具有三种类型的点:核心点、与核心点的距离在eps之内的点(边界点,Boundary Point)、噪声。
from sklearn.cluster import DBSCAN
cluster = DBSCAN(n_jobs=-1)
cluster.fit(X)
优缺点、参数
参数:
- eps:从一个观察值到另一个观察值的最远距离,超过这个值将不再认为二者是邻居
- min_samples:最小限度的邻居数量,如果一个观察值在其周围小于eps距离的范围内有超过该值数量的邻居,则被认为是核心观察值
- metric:eps所用的距离度量(比如minkowski、euclidean)
优点:
- 不需要设定簇的个数
- 可以划分复杂形状的簇
- 能够找出噪声点
- 可以扩展到相对较大的数据集
缺点:
- 运行速度稍慢
- 可能会生成大小差别很大的簇(也可是为优点)
DBSCAN实现
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import DBSCAN
from sklearn.datasets import load_iris
iris = load_iris()
features = iris.data
# 特征标准化
standardizer = StandardScaler()
features_std = standardizer.fit_transform(features)
# 实例化一个KMeans对象
cluster = DBSCAN(n_jobs=-1)
# 拟合模型
model = cluster.fit(features_std)
聚类算法评估
真实值评估聚类:调整rand指数(Adjusted Rand Index,ARI)、归一化互信息(Normalized Mutual Information,NMI)
无真实值评估聚类:轮廓系数(Silhouette Coefficient)、基于鲁棒性(Robustness-Based)