聚类算法
- 聚类概念:
- 无监督问题:我们手里没有标签了
- 聚类:相似的东西分到一组
- 难点:如何评估,如何调参
1.层次聚类
-
层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。创建聚类树有自下而上合并和自上而下分裂两种方法。
-
作为一家公司的人力资源部经理,你可以把所有的雇员组织成较大的簇,如主管、经理和职员;然后你可以进一步划分为较小的簇,例如,职员簇可以进一步划分为子簇:高级职员,一般职员和实习人员。所有的这些簇形成了层次结构,可以很容易地对各层次上的数据进行汇总或者特征化。
1.1 层次划分
- 基于层次的聚类算法(Hierarchical Clustering)可以是凝聚的(Agglomerative)或者分裂的(Divisive),取决于层次的划分是“自底向上”还是“自顶向下”。
1.2. 自底向上的合并算法
-
层次聚类的合并算法通过计算两类数据点间的相似性,对所有数据点中最为相似的两个数据点进行组合,并反复迭代这一过程。
-
简单的说层次聚类的合并算法是通过计算每一个类别的数据点与所有数据点之间的距离来确定它们之间的相似性,距离越小,相似度越高。并将距离最近的两个数据点或类别进行组合,生成聚类树。
-
相似度计算
- 层次聚类使用欧式距离来计算不同类别数据点间的距离(相似度)
1.2.1实例
- 分别计算欧式距离值(矩阵)
- 将数据点B与数据点C进行组合后,重新计算各类别数据点间的距离矩阵。数据点间的距离计算方式与之前的方法一样。这里需要说明的是组合数据点(B,C)与其他数据点间的计算方法。当我们计算(B,C)到A的距离时,需要分别计算B到A和C到A的距离均值。
- 经过计算数据点D到数据点E的距离在所有的距离值中最小,为1.20。这表示在当前的所有数据点中(包含组合数据点),D和E的相似度最高。因此我们将数据点D和数据点E进行组合。并再次计算其他数据点间的距离。
- 后面的工作就是不断的重复计算数据点与数据点,数据点与组合数据点间的距离。这个步骤应该由程序来完成。这里由于数据量较小,我们手工计算并列出每一步的距离计算和数据点组合的结果。
1.3.两个组合数据点间的距离
- 计算两个组合数据点间距离的方法有三种,分别为Single Linkage,Complete Linkage和Average Linkage。在开始计算之前,我们先来介绍下这三种计算方法以及各自的优缺点。
Single Linkage
:方法是将两个组合数据点中距离最近的两个数据点间的距离作为这两个组合数据点的距离。这种方法容易受到极端值的影响。两个很相似的组合数据点可能由于其中的某个极端的数据点距离较近而组合在一起。Complete Linkage
:Complete Linkage
的计算方法与Single Linkage相反,将两个组合数据点中距离最远的两个数据点间的距离作为这两个组合数据点的距离。Complete Linkage的问题也与Single Linkage相反,两个不相似的组合数据点可能由于其中的极端值距离较远而无法组合在一起。Average Linkage
:Average Linkage
的计算方法是计算两个组合数据点中的每个数据点与其他所有数据点的距离。将所有距离的均值作为两个组合数据点间的距离。这种方法计算量比较大,但结果比前两种方法更合理。
- 使用Average Linkage计算组合数据点间的距离。计算组合数据点(A,F)到(B,C)的距离,这里分别计算了(A,F)和(B,C)两两间距离的均值。
1.4.树状图
1.5实例
import pandas as pd
from scipy.cluster.hierarchy import linkage,dendrogram
import matplotlib.pyplot as plt
#加载数据
df=pd.read_csv('./datasets/seeds-less-rows.csv')
#1.查看有几个类别
df.grain_variety.value_counts()
# Rosa wheat 14
# Canadian wheat 14
# Kama wheat 14
# Name: grain_variety, dtype: int64
#2.拆分数据
#获取分类名
varieties=list(df.pop('grain_variety'))
#获取相应数据
samples=df.values
#3.进行层次聚类
mergings=linkage(samples,method='complete')
# 4 画图
fig=plt.figure(figsize=(10,6))
dendrogram(mergings,labels=varieties,leaf_rotation=90,leaf_font_size=12)
plt.show()
#有3个分错了
2.DBSCAN算法
2.1基本概念
-
全称:
Density-Based Spatial Clustering of Applications with Noise
-
密度相连:若从某核心点p出发,点q和点k都是密度可达的 ,则称点q和点k是密度相连的。
-
边界点:属于某一个类的非核心点,不能发展下线了
-
直接密度可达:若某点p在点q的 r 邻域内,且q是核心点则p-q直接密度可达。
-
噪声点:不属于任何一个类簇的点,从任何一个核心点出发都是密度不可达的
-
核心对象:若某个点的密度达到算法设定的阈值则其为核心点。(即 r 邻域内点的数量不小于
minPts
) -
ϵ-邻域的距离阈值:设定的半径r
-
直接密度可达:若某点p在点q的 r 邻域内,且q是核心点则p-q直接密度可达。
-
密度可达:若有一个点的序列
q0、q1、…qk
,对任意qi-qi-1是直接密度可达的 ,则称从q0
到qk
密度可达,这实际上是直接密度可达的“传播”。
2.2 工作流程
-
参数D:输入数据集
-
参数ϵ:指定半径
-
MinPts
:密度阈值
2.3参数选择
- 半径ϵ,可以根据K距离来设定:找突变点
- K距离:给定数据集
P={p(i); i=0,1,…n}
,计算点P(i)
到集合D的子集S中所有点之间的距离,距离按照从小到大的顺序排序,d(k)就被称为k-距离。 MinPts
: k-距离中k的值,一般取的小一些,多次尝试
2.4优势与劣势
-
优势:
-
不需要指定簇个数
-
可以发现任意形状的簇
-
擅长找到离群点(检测任务)
-
两个参数就够了
-
-
劣势:
-
高维数据有些困难(可以做降维)
- 参数难以选择(参数对结果的影响非常大)
-
Sklearn
中效率很慢(数据削减策略) -
可视化:
https://www.naftaliharris.com/blog/visualizing-k-means-clustering/
3.K-MEANS算法
3.1基本概念
-
要得到簇的个数,需要指定K值
-
质心:均值,即向量各维取平均即可
-
距离的度量:常用欧几里得距离和余弦相似度(先标准化)
-
优化目标
3.2优势与劣势
-
优势:
- 简单,快速,适合常规数据集
-
劣势:
- K值难确定
- 复杂度与样本呈线性关系
- 很难发现任意形状的簇
3.3 实例
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
df=pd.read_csv('./datasets/ch1ex1.csv')
# 聚类操作
points=df.values
xs=points[:,0]
ys=points[:,1]
model=KMeans(n_clusters=3)
model.fit(points)
# 找质心
centroids=model.cluster_centers_
centroids_x=centroids[:,0]
centroids_y=centroids[:,1]
labels = model.predict(points)
#画图
plt.scatter(xs,ys,c=labels)
plt.scatter(centroids_x,centroids_y,marker='X',s=200)
plt.show()
4.聚类评估:轮廓系数(Silhouette Coefficient )
- 计算样本
i
到同簇其他样本的平均距离ai
。ai
越小,说明样本i越应该被聚类到该簇。将ai
称为样本i
的簇内不相似度。 - 计算样本i到其他某簇
Cj
的所有样本的平均距离bij
,称为样本i
与簇Cj
的不相似度。定义为样本i
的簇间不相似度:bi =min{bi1, bi2, ..., bik
}
si
接近1,则说明样本i
聚类合理si
接近-1,则说明样本i
更应该分类到另外的簇- 若
si
近似为0,则说明样本i
在两个簇的边界上。