sklearn聚类算法实现
主要通过调用python中sklearn库中的函数来实现聚类算法,主要包括:K-MEANS、近邻传播(AffinityPropagation)、均值偏移(MeanShift)、谱聚类(SpectralCluster)、层次聚类(AgglomerativeClustering)、密度噪声(DBSCAN)、平衡迭代层次聚类(Birch)、高斯混合(GMM)、双向聚类(SpectralBiclustering)。
1、生成数据集
通过sklearn中的make_blobs函数主要来生成数据集,方便后续的聚类操作。
make_blobs的用法
data, label = make_blobs(n_features, n_samples, centers, random_state, cluster_std)
- n_features 表示每一个样本有多少特征值
- n_samples 表示样本的个数
- centers 聚类中心点的个数,可以理解为label的种类数
- random_state 随机种子,可以固定生成的数据
- cluster_std 设置每个类别的方差
例子:
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成(150,2)的数据集
centers = [[1, 1], [-1, -1], [1, -1]]
Xn, labels_true = make_blobs(n_samples=150, centers=centers, cluster_std=0.5, random_state=0)
# 在图上画出数据
plt.scatter(Xn[:, 0], Xn[:, 1], s=80)
plt.show()
生成结果如下:
2、 聚类算法
2.1 K-MEANS
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# KMeans聚类
model = KMeans(n_clusters=3)
y_pred = model.fit_predict(Xn)
# 画图显示样本数据
plt.figure('Kmeans', facecolor='lightgray')
plt.title('Kmeans', fontsize=16)
plt.xlabel('X', fontsize=14)
plt.ylabel('Y', fontsize=14)
plt.tick_params(labelsize=10)
plt.scatter(Xn[:, 0], Xn[:, 1], s=80, c=y_pred, cmap='brg', label='Samples')
plt.legend()
plt.show()
结果如下:
2.2 近邻传播(AffinityPropagation)
import matplotlib.pyplot as plt
from sklearn.cluster import AffinityPropagation
'''
sklearn.cluster.AffinityPropagation函数
主要参数: damping 阻尼系数,取值[0.5,1) convergence_iter:比较多少次聚类中心不变后停止迭代,默认15
max_iter:最大迭代次数 preference:参考度(即p值)
主要属性: cluster_centers_indices_ 存放聚类中心数组
labels_ 存放每个点的分类的数组
n_iter_ 迭代次数
'''
model = AffinityPropagation(damping=0.5, max_iter=500, convergence_iter=30,
preference=-50).fit(Xn)
cluster_centers_indices = model.cluster_centers_indices_
y_pred = model.labels_
# 画图显示样本数据
plt.figure('AffinityPropagation', facecolor='lightgray')
plt.title('AffinityPropagation', fontsize=16)
plt.tick_params(labelsize=10)
plt.scatter(Xn[:, 0], Xn[:, 1], s=80, c=y_pred, cmap='brg', label='Samples')
plt.legend()
plt.show()
结果如下:
2.3 均值偏移
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
import sklearn.cluster as sc
bw = sc.estimate_bandwidth(Xn, n_samples=len(Xn), quantile=0.1)
model = sc.MeanShift(bandwidth=bw, bin_seeding=True)
model.fit(Xn) # 完成聚类
pred_y = model.predict(Xn) # 预测点在哪个聚类中
centers = model.cluster_centers_
# 画图显示样本数据
plt.figure('MeanShift', facecolor='lightgray')
plt.title('MeanShift', fontsize=16)
plt.tick_params(labelsize=10)
plt.scatter(Xn[:, 0], Xn[:, 1], s=80, c=pred_y, cmap='brg', label='Samples')
plt.legend()
plt.show()
结果如下:
2.4 谱聚类
import sklearn.cluster as sc
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
'''
y_pred = sc.SpectralClustering().fit_predict(Xn)
print("Calinski-Harabasz Score", metrics.calinski_harabasz_score(Xn, y_pred))
# 默认使用的是高斯核,需要对n_cluster和gamma进行调参,选择合适的参数
for index, gamma in enumerate((0.01, 0.1, 1, 10)):
for index, k in enumerate((3, 4, 5, 6, 7, 8)):
y_pred = sc.SpectralClustering(n_clusters=k, gamma=gamma).fit_predict(Xn)
print("Calinski-Harabasz Score with gamma=", gamma, "n_clusters=", k, "score:", metrics.calinski_harabasz_score(Xn, y_pred))
'''
# 用测试出的参数进行最终聚类得到类别信息
y_pred = sc.SpectralClustering(gamma=1, n_clusters=3).fit_predict(Xn)
print(y_pred)
model = sc.SpectralClustering(gamma=1, n_clusters=3)
# 画图显示样本数据
plt.figure('SpectralCluster', facecolor='lightgray')
plt.title('SpectralCluster', fontsize=16)
plt.tick_params(labelsize=10)
plt.scatter(Xn[:, 0], Xn[:, 1], s=80, c=y_pred, cmap='brg', label='Samples')
plt.legend()
plt.show()
结果如下:
2.5 层次聚类
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs
'''
参数:
n_cluster:聚类数量 affinity:距离度量方法,可选 ‘euclidean’, ‘manhattan’,‘l1’,‘l2’,‘cosine’,‘precomputed’
linkage:选择何种距离,可选’ward'(组间距离等于两类对象之间的最小距离),‘complete'(组间距离等于两组对象之间的最大距离),'average'(组间距离等于两组对象之间的平均距离),'single'(最近距离)
distance_threshold:距离阈值,大于这个阈值后,不会合并
compute_full_tree:是否生成一颗完整的树,设置成否可以节省计算开销
属性:
labels_ 聚类结果
'''
model = AgglomerativeClustering(n_clusters = 3, linkage = 'ward')
model.fit(Xn) # 训练模型
y_pred= model.labels_
# 画图显示样本数据
plt.figure('AgglomerativeCluster', facecolor='lightgray')
plt.title('AgglomerativeCluster', fontsize=16)
plt.tick_params(labelsize=10)
plt.scatter(Xn[:, 0], Xn[:, 1], s=80, c=y_pred, cmap='brg', label='Samples')
plt.legend()
plt.show()
结果如下:
2.6 密度噪声
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_blobs
'''
参数:
eps:两个样本之间的最大距离,即扫描半径 (最重要的两个参数)
min_samples :作为核心点的话邻域(即以其为圆心,eps为半径的圆,含圆上的点)中的最小样本数(包括点本身)。(最重要的两个参数)
metric :度量方式,默认为欧式距离,还有metric=‘precomputed’(稀疏半径邻域图)
algorithm:近邻算法求解方式,有四种:‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’
leaf_size:叶的大小,在使用BallTree or cKDTree近邻算法时候会需要这个参数
n_jobs :使用CPU格式,-1代表全开
属性:
core_sample_indices_:核心样本指数。(此参数在代码中有详细的解释)
labels_:数据集中每个点的集合标签给,噪声点标签为-1。
components_ :核心样本的副本
'''
model = DBSCAN(eps=0.4, min_samples=8).fit(Xn)
y_pred = model.labels_
print(y_pred)
# 画图显示样本数据
plt.figure('DBSCAN', facecolor='lightgray')
plt.title('DBSCAN', fontsize=16)
plt.tick_params(labelsize=10)
plt.scatter(Xn[:, 0], Xn[:, 1], s=80, c=y_pred, cmap='brg', label='Samples')
plt.legend()
plt.show()
结果如下:
2.7 平衡迭代层次聚类
import matplotlib.pyplot as plt
from sklearn.cluster import Birch
from sklearn.datasets import make_blobs
model = Birch(n_clusters= 3, threshold= 0.2)
y_pred = model.fit_predict(Xn)
print(y_pred)
# 画图显示样本数据
mp.figure('Birch', facecolor='lightgray')
mp.title('Birch', fontsize=16)
mp.tick_params(labelsize=10)
mp.scatter(Xn[:, 0], Xn[:, 1], s=80, c=y_pred, cmap='brg', label='Samples')
mp.legend()
mp.show()
结果如下:
2.8 高斯混合
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.mixture import GaussianMixture # 高斯混合模型
model = GaussianMixture(n_components=3)
y_pred = model.fit_predict(Xn)
print(y_pred)
plt.figure('GMM', facecolor='lightgray')
plt.title('GMM', fontsize=16)
plt.tick_params(labelsize=10)
plt.scatter(Xn[:, 0], Xn[:, 1], s=80, c=y_pred, cmap='brg', label='Samples')
plt.legend()
plt.show()
结果如下:
2.9 双向聚类
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import SpectralBiclustering
model = SpectralBiclustering(n_clusters=2).fit(Xn)
y_pred = model.row_labels_
print(y_pred)
plt.figure('SpectralBiclustering', facecolor='lightgray')
plt.title('SpectralBiclustering', fontsize=16)
plt.tick_params(labelsize=10)
plt.scatter(Xn[:, 0], Xn[:, 1], s=80, c=y_pred, cmap='brg', label='Samples')
plt.legend()
plt.show()
结果如下:(有点小问题,好像目前只能两类,以后有时间再看看吧)
3、 聚类评价指标
未完待续…