SKlearn——聚类算法
- 1.聚类
- 2.聚类算法
- 2.1KMeans
- 2.2Birch
- 2.3DBSCAN
- 2.4层次聚类
- 2.5.谱聚类
- 3.评价标准
- 4.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