活动地址:CSDN21天学习挑战赛
概念
聚类算法的概念和K-means算法
详细回顾——
聚类—K-means算法_Caaaaaan的博客-CSDN博客
层次聚类
-
凝聚法——自底向上
通过相似性计算形成各种小簇,然后通过计算簇与簇之间的相似性形成较大簇
-
通常凝聚到K个聚簇的时候就停止迭代
-
簇与簇之间的相似性数值达到了一个阈值,我们就停止
-
-
划分法——自上而下
聚类评估
- 估计在数据集上进行聚类的可行性和被聚类方法产生的结果的质量
- 聚类评估的任务:
- 估计聚类趋势:评估数据集是否存在非随机结构
- 确定数据集中的簇数:在聚类之前,估计簇数
- 测定聚类质量:聚类之后,评估结果簇的质量
估计聚类趋势
- 从统计学的角度,就是检测数据是否是随机或线性分布的
如果数据服从均匀分布,显然对其进行的聚类操作都是没有意义的
霍普金斯统计量
H
=
∑
i
=
1
n
y
i
∑
i
=
1
n
x
i
+
∑
i
=
1
n
y
i
我们先随机生成一个均匀分布的数据,本身拥有一个数据集的数据
y
i
表示,从真实数据集里随机抽样一个数据,然后从随机生成的数据中,找到离该点最近的点
y
i
为两者距离
x
i
表示的距离是,真实数据集里,离抽样点最近的距离
霍普金斯统计量\\ H=\frac{\sum_{i=1}^ny_i}{\sum_{i=1}^nx_i+\sum_{i=1}^ny_i}\\ 我们先随机生成一个均匀分布的数据,本身拥有一个数据集的数据\\ y_i表示,从真实数据集里随机抽样一个数据,然后从随机生成的数据中,找到离该点最近的点\\y_i为两者距离\\ x_i表示的距离是,真实数据集里,离抽样点最近的距离
霍普金斯统计量H=∑i=1nxi+∑i=1nyi∑i=1nyi我们先随机生成一个均匀分布的数据,本身拥有一个数据集的数据yi表示,从真实数据集里随机抽样一个数据,然后从随机生成的数据中,找到离该点最近的点yi为两者距离xi表示的距离是,真实数据集里,离抽样点最近的距离
- H越近似等于1,则认为这个数据更适合使用聚类这个方法
- 如果数据是均匀分布,H值就会近似等于1/2,就认为不适合使用聚类
确定簇数
-
实验方法
对于n个点的数据集,簇数为 n / 2 \sqrt{n/2} n/2,每个簇约有个 2 n \sqrt{2n} 2n个点
-
肘方法(Elbow method)
-
增加簇数可以降低簇内方差之和,但是如果形成太多的簇,降低簇内方差之和的边缘效应可能下降
-
最初的时候,簇内方差下降就很快,但是随着簇数的增加,下降速率就会越来越差
S S E = ∑ i = 1 k ∑ p ∈ C i ∣ p − m i ∣ 2 SSE=\sum_{i=1}^k\sum_{p\in C_i}|p-m_i|^2 SSE=i=1∑kp∈Ci∑∣p−mi∣2 -
我们通过找到这个肘——簇内方差之和下降最快的点,确定K值
-
-
可视化
从散点图直接观察
测定聚类质量
-
外在方法:有监督的
-
用某种聚类质量度量对聚类结果和基准进行比较
-
基准:一种理想的聚类,由专家构建
-
四个维度考虑:
-
簇的同质性
每个簇里的对象是同一类
-
簇的完全性
原本由两个簇,我们就希望簇不要分成一个簇,这个是完全性
-
碎布袋性
把一个异构对象放到一个纯聚簇中要比把它放到一个碎布袋里(例如杂项或其他类别)更糟糕
也就是更希望噪音不被聚到已存在的聚簇中
-
小簇保持性
把一个小类别聚簇分成更小的聚簇比把一个大类别分成小聚簇更有害
也就是更希望小类别聚簇不再被划分
-
-
-
内在方法:无监督的
- 通过考察簇的分离情况和簇的紧凑情况来评估聚类
- 例如:轮廓系数
轮廓系数 : s ( i ) = b ( i ) − a ( i ) m a x { a ( i ) , b ( i ) } b ( i ) 表示簇与簇之间的最短距离 a ( i ) 表示簇内对象之间的平均距离 轮廓系数:\\ s(i)=\frac{b(i)-a(i)}{max\{a(i),b(i)\}}\\ b(i)表示簇与簇之间的最短距离\\ a(i)表示簇内对象之间的平均距离\\ 轮廓系数:s(i)=max{a(i),b(i)}b(i)−a(i)b(i)表示簇与簇之间的最短距离a(i)表示簇内对象之间的平均距离
- 通常优秀的聚类,我们认为
- 簇与簇之间的距离尽可能得大——决定了b(i)比较大
- 每个簇尽可能紧凑——决定了a(i)比较小
因此:
- s ( i ) ∈ [ − 1 , 1 ] s(i)\in [-1,1] s(i)∈[−1,1]
- 越趋近于1代表内聚度和分离度都相对较优
编程实践
K-means聚类
from sklearn.cluster import KMeans
import pandas as pd
data_url='iris_train.csv'
df=pd.read_csv(data_url)
X=df.iloc[:,1:5]
estimator=KMeans(n_clusters=3)#构造聚类器
result=estimator.fit_transform(X)
print(result)
#打印出来0,1,2只能表示是不是同一类,不能判断这一类是哪一类
层次聚类代码
from sklearn.cluster import AgglomerativeClustering
import pandas as pd
data_url='iris_train.csv'
df=pd.read_csv(data_url)
X=df.iloc[:,1:5]
clustering=AgglomerativeClustering(linkage='average',n_clusters=3)
re=clustering.fit_predict(X)
print(re)