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()

结果如下:
Kmeans聚类结果

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、 聚类评价指标

未完待续…

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐