SKlearn——聚类算法

1.聚类

在无监督学习中,训练样本的标记信息是未知的,目标是通过对无标记训练样本来揭示数据的内在性质及 规律,为进一步的数据分析提供基础。此类学习任务中研究最多、应用最广的是‘聚类’。聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称之为一个‘簇’。
简而言之,聚类就是仅根据数据本身,对大量的数据及进行分类标记,把数据化分为几类。其思想和前面的分类相似,只不过之前的分类任务我们是知道需要根据什么来进行分类,每一类应该是怎样的。而聚类则是仅仅提供数据,假设这些数据是可以分类的,让计算机来“探索”数据的分类特征。

2.聚类算法

聚类算法有KMeans,Birch,DBSCAN,层次聚类以及谱聚类等。

2.1KMeans

KMeans聚类算法又被称为K均值算法,他的思想是初始随机从数据点钟找出K个点作为初始簇中心,然后遍历每个数据点,距离哪个“中心”最近就归为哪一类,然后再从每个簇中随机选点进行迭代,直到达到最大迭代次数为止。

2.2Birch

Birch使用了一个树的结构来进行聚类,建立CF树结构并进行迭代输出结点。

2.3DBSCAN

西瓜书上给出了密度可达关系,DBSCAN算法就是基于密度可达关系的,尝试在样本点中找出若干个最大密度相连的簇,即为得到的聚类结果。

2.4层次聚类

层次聚类通过不断比较数据点之间的相似程度,进行合并并以此迭代的方法,最终建立一棵树形聚类结构.

2.5.谱聚类

谱聚类的思想即把数据点看作带权无向图,数据点之间的距离与权重成负相关,谱聚类的核心思想即尝试将图分割为若干子图,使得子图内的权值和尽可能大,子图间的权重尽可能小。

3.评价标准

本案例中使用经典的评价标准:calinski-harabasz指标(CH指标)来进行聚类结果的评价,其公式为:
在这里插入图片描述其中,n表示聚类的数目 ,k 表示当前的类, trB(k)表示类间离差矩阵的迹, trW(k) 表示类内离差矩阵的迹。对于同一类聚类算法的不同参结果,CH指标的值越大代表聚类的结果相对越好。

4.sklearn中的聚类算法

import matplotlib.pyplot as plt
from sklearn import cluster
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# make_blobs:生成聚类的数据集
# n_samples:生成的样本点个数,n_features:样本特征数,centers:样本中心数
# cluster_std:聚类标准差,shuffle:是否打乱数据,random_state:随机种子
X, y = make_blobs(n_samples=150, n_features=2, centers=3,cluster_std=0.5,shuffle=True, random_state=0)

#散点图
#c:点得颜色,maker:点的形状,edgecolor:点边缘的形状,s:点的大小
plt.scatter(X[:,0], X[:,1], c='white', marker = 'o', edgecolors='black', s=50)
plt.show()

在这里插入图片描述

#定义模型
# 定义模型
# n_clusters:要形成的簇数,即k均值的k,init:初始化方式,tot:Frobenius 范数收敛的阈值
model = KMeans(n_clusters=3, init='random', n_init= 10, max_iter=300, tol=1e-04, random_state=0)
# 训练加预测
y_pred = model.fit_predict(X)

# 画出预测的三个簇类
plt.scatter(
    X[y_pred == 0,0],X[y_pred == 0,1],
    s = 50, c = 'orange',
    marker= 'o', edgecolors='black',
    label = 'cluster 1'
)

plt.scatter(
    X[y_pred == 1,0],X[y_pred == 1,1],
    s = 50, c = 'orange',
    marker= 'o', edgecolors='black',
    label = 'cluster 1'
)

plt.scatter(
    X[y_pred == 2, 0], X[y_pred == 2, 1],
    s=50, c='lightblue',
    marker='v', edgecolor='black',
    label='cluster 3'
)

#画出聚类中心
plt.scatter(
    model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],
    s = 250, marker= '*',
    c = 'red', edgecolors='black',
    label = 'centroids'
)
plt.legend(scatterpoints=1)
plt.grid()
plt.show()

在这里插入图片描述

# 计算inertia随着k变化的情况
distortions = []
for i in range(1, 10):
    model = KMeans(
        n_clusters=i, init = 'random',
        n_init=10, max_iter=300,
        tol=1e-04,random_state=0
    )
    model.fit(X)
    distortions.append(model.inertia_)

# 画图可以看出k越大inertia越小,追求k越大对应用无益处
plt.plot(range(1, 10), distortions, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
plt.show()

在这里插入图片描述

https://github.com/datawhalechina/machine-learning-toy-code/tree/main/ml-with-sklearn/K-means
https://blog.csdn.net/baidu_38406307/article/details/103879731?spm=1001.2014.3001.5501

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值