第六章、聚类算法K-means:一、k-means :无监督分类 1.sklearn中的聚类算法 1.1 sklearn.cluster.K-means 1.2 超参数n_clusters=inert

一、k-means :无监督分类

聚类和分类:

聚类是一种无监督学习方法,其目标是将数据样本分成不同的组,使得同一组内的样本彼此相似,而不同组之间的样本差异较大。聚类算法根据数据点之间的相似性或距离,将它们分配到不同的聚类簇中。聚类算法不需要先验标签或类别信息,而是根据数据本身的特征进行分组。聚类可以帮助发现数据的内在结构、相似性和模式,对于数据探索、分割和预处理等任务非常有用。

分类是一种有监督学习方法,它使用已有的标签或类别信息来训练模型,并预测新的未知数据点所属的类别。分类任务的目标是学习一个模型,能够将输入数据映射到预定义的类别中。分类算法需要有已知的标签或类别信息作为训练数据,并根据这些标签来学习分类规则或决策边界。常见的分类算法包括决策树、支持向量机和神经网络等。

聚类常用于数据探索、分割和预处理等任务,有助于发现数据的相似性和群组结构;分类常用于预测和判别任务,对新的未知数据进行分类。

1.sklearn中的聚类算法

两种表现形式:类和函数
在这里插入图片描述

  • 对于k-means:
    簇:同一簇就是一类
    质心:一簇数据的横纵坐标的平均值
    过程:随机抽取k个样本作为最初质心;开始循环:每个样本点分配到离他最近的质心,生成k簇;对于每个簇计算新的质心,当质心位置不再发生改变时,聚类完成。

  • 样本到质心的距离的度量:
    在这里插入图片描述
    n表示特征数目,例如,二维数据的x,y,则n=2;x表示样本点,u表示质心。

如果k-means采用欧几里得距离,所有样本点的距离之和是:在这里插入图片描述
前者是簇内平方和,后者是整平方和。k-means追求的是簇内平方和最小的质心。这是k-means的模型评估指标,而不是损失函数。

1.1 sklearn.cluster.K-means

代码:

  1. 创建一个数据集:
from sklean.datasets import make_blobs as mb
import matplotlib.pyplot as pt 
x,y=mb(n_samples=500,n_features=2,centers=4,random_sate=1)
print(x.shape)

fig,ax1=pt.subplots(1)//fig是窗口,ax1是子图
ax1.scatter(x[:,0],x[:,1],marker='o',s=8)//点的形状,点的大小
print(pt.show())

color=["red","pink","orange","gray"]
fig,ax1=pt.subplots(1)

//聚类算法结束应该的样子
for i in range(4):
	ax1.scatter(x[y==i],x[y==i,1],marker='o',s=8,c=color[i])
print(pt.show())
  1. 进行聚类
from sklean.cluster import KMeans as km
import matplotlib.pyplot as pt 
n_clsters=3
cluster=km(n_clusters,random_state=0).fix(x)
y_pred=cluster_.labels_
print(y_pred)//查看y的所有值

center=cluster.cluster_centers_//质心
print(center)
print(center.shape)

d=cluster.inertia_//距离平方和,越小越好
print(d) //此时为1903

color=["red","pink","orange","gray"]
fig,ax1=pt.subplots(1)
for i in range(n_clusters):
   ax1.scatter(x[y_pred==i],x[y_pred==i,1],marker='o',s=8,c=color[i])
ax1.scatter(center[:,0],center[:,1],maeker='x',s=18,c="black")
print(pt.show())

结果如下:在这里插入图片描述
若把n_clusters=3 改成4:d=908;改成5,d=733.
but,并不是数字越小越好,如何选择超参数n_clusters=?

1.2 超参数n_clusters=inertia如何选择?

  • inertia越小越好吗?
    不是。
    首先,它不是有界的。我们只知道,inertia是越小越好,是0最好,但我们不知道,一个较小的Inertia究竟有没有达到模型的极限,能否继续提高。
    第二,它的计算太容易受到特征数目的影响,数据维度很大的时候,lnertia的计算量会陷入维度诅咒之中,计算量会爆炸,不适合用来一次次评估模型。
    第三,inertia对数据的分布有假设,它假设数据满足凸分布(即数在二维平面图像上看起来是一个凸函数的样子),并且它假设数据是各向同性的(isotropic),即是说数据的属性在不同方向上代表着相同的含义。但是现实中的数据往往不是这样。所以使用Inertia作为评估指标,会让聚类算法在一些细长簇,环形簇,或者不规则形状的流形时表现不佳。
    在这里插入图片描述
    只有一簇一簇的效果才好,其他的都容易分错。

所以真实标签未知时,一般选择轮廓系数

1.3 轮廓系数silhouetter_score

  • 轮廓系数:
    在这里插入图片描述
    即:
    在这里插入图片描述
    如果一个族中的大多数样本具有比较高的轮系数,则族会有较高的总轮廓系数,则整个数据集的平均轮廊系教越高,则聚类是合适的。如果许多样本点具有低轮廓系数甚至负值,则聚类是不合适的,聚类的超参数K可能设定得太大或者太小。

轮廓系数能同时衡量:

  1. 样本与其白身所在的族中的其他样本的相似度a,等于样本与同一艘中所有其他点之间的平均距离
  2. 样本与其他簇中的样本的担似度b,等于样本与下一个最近的簇中得所有点之间的平均距离根据聚类的要求”簇内差异小,簇外差异大”,我们希望b永远大于a,并且大得越多越好。

轮廓系数代码:

silhouette_samples(x,y_pred)//每个样本点的轮廓系数
silhouette_score(x,y_pred)
//y_pred就是cluster_.labels_

结果:
在这里插入图片描述
基于轮廓系数选择,则n_clusters=4

1.4 其他评价指标

除了轮廓系数是最常用的,还有卡林斯基-哈拉巴斯指数(Calinski-Harabaz ndex,简称CHI,也被称为方差比标准),戴维斯-布尔丁指数 (Davies-Bouldin) 以及权变阵(Contingency Matrix) 可以使用。
例如:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_53982314/article/details/131261650