当前位置:   article > 正文

机器学习(五) -- 无监督学习(1) --聚类2

机器学习(五) -- 无监督学习(1) --聚类2

系列文章目录及链接

上篇:机器学习(五) -- 无监督学习(1) --聚类1
下篇:


前言

tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。

本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。

由于作者时间不算富裕,有些内容的《算法实现》部分暂未完善,以后有时间再来补充。见谅!

文中为方便理解,会将接口在用到的时候才导入,实际中应在文件开始统一导入。


 三、**算法实现

四、接口实现

1、K-means

1.1、API

  1. sklearn.cluster.KMeans
  2. 导入:
  3. from sklearn.cluster import KMeans
  4. 语法:
  5. KMeans(n_clusters=8,init=‘k-means++’,n_init='warn', max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='lloyd')
  6. 参数:
  7. n_clusters:开始的聚类中心数量,默认=8
  8. init:初始化方法,默认为‘k-means ++
  9. 属性:
  10. KMeans.cluster_centers_:簇中心的坐标
  11. KMeans.labels_:每个样本的标签
  12. 方法:
  13. KMeans.fit(x)
  14. KMeans.predict(x)
  15. KMeans.fit_predict(x)
  16. 计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)

1.2、流程

1.2.1、获取数据
  1. from sklearn.datasets import load_iris
  2. from sklearn.cluster import KMeans
  3. # 获取数据
  4. iris = load_iris()
1.2.2、数据预处理
  1. # 划分数据集
  2. x=iris.data
  3. y=iris.target
1.2.3、特征工程
1.2.4、模型训练
  1. # 实例化学习器
  2. kmeans = KMeans(n_clusters=3, random_state=1473, n_init='auto')
  3. # 模型训练
  4. kmeans.fit(x)
1.2.5、模型评估
  1. # 用模型计算测试值,得到预测值
  2. y_pre = kmeans.predict(x)
  3. # 可视化
  4. plt.figure(figsize=(14,7))
  5. plt.subplot(121)
  6. # 绘制iris原本的类别
  7. plt.scatter(x[:, 0], x[:, 1], c=y)
  8. plt.subplot(122)
  9. # 绘制kmeans聚类结果
  10. plt.scatter(x[:, 0], x[:, 1], c=y_pre)
  11. plt.show()
  1. from sklearn.metrics import jaccard_score, fowlkes_mallows_score, adjusted_rand_score, davies_bouldin_score
  2. print('K均值聚类模型的Jaccard系数:', jaccard_score(y, y_pre,average='micro'))
  3. print('K均值聚类模型的FM系数:', fowlkes_mallows_score(y, y_pre))
  4. print('K均值聚类模型的调整Rand指数:', adjusted_rand_score(y, y_pre))
  5. print('K均值聚类模型的DB指数:', davies_bouldin_score(x, kmeans.labels_))

1.2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

2、K-Medoids

make_blobs的API:

        生成聚类数据

  1. sklearn.datasets.make_blobs
  2. 导入:
  3. from sklearn.datasets import make_blobs
  4. 方法:
  5. x, y = make_blobs(n_samples=1000,
  6. n_features=2,
  7. centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
  8. cluster_std=[0.4, 0.2, 0.2, 0.2],
  9. random_state=1473)
  10. x为样本特征,y为样本簇类别
  11. n_samples:样本数,默认=100
  12. n_features:样本特征数(样本维度),默认=2
  13. centers:族中心个数,可以是数字,也可以是点坐标,默认=3
  14. cluster_std:簇标准差,默认=10

2.1、获取数据

  1. from sklearn.datasets import make_blobs
  2. # 获取数据
  3. x,y = make_blobs(n_samples=150, centers=3, n_features=2, random_state=1734)
  4. # 可视化
  5. plt.figure()
  6. plt.scatter(x[:, 0], x[:, 1], c='b')
  7. plt.show()

2.2、数据预处理

2.3、特征工程

2.4、模型训练

  1. class KMedoids1:
  2. def __init__(self,k=3,max_iter=100):
  3. self.k = k
  4. self.max_iter = max_iter
  5. def euclidean_distance(self, x1, x2):
  6. return np.sqrt(np. sum( (x1 - x2) **2))
  7. def fit(self, X):
  8. n_samples,n_features = X.shape
  9. #初始化聚类中心,从样本点中随机选取k个点作为聚类中心
  10. centers = np.sort(np.random.choice(n_samples,self.k,replace=False))
  11. medoids = X[centers]
  12. for i in range(self.max_iter) :
  13. #计算每个样本点到每个聚类中心之间的距离
  14. distances = np.zeros((n_samples,self.k))
  15. for j in range(self.k):
  16. distances[:,j] = np.apply_along_axis(self.euclidean_distance,1,X,medoids[j])
  17. #找到距离每个聚类中心最近的点,作为新的聚类中心
  18. closest_centroid = np.argmin(distances,axis=1)
  19. for j in range(self.k):
  20. medoids[j] = np.median( X[closest_centroid == j],axis=0)
  21. self.medoids = medoids
  22. self.labels = closest_centroid
  23. return self
  1. kmedoids=KMedoids1(3)
  2. kmedoids.fit(x)

2.5、模型评估

  1. plt.figure()
  2. plt.scatter(x[:, 0], x[:, 1], c=kmedoids.labels, cmap='viridis', marker='o', label='Data points')
  3. plt.scatter(kmedoids.medoids[:,0],kmedoids.medoids[:,1], c='red', marker='X', s=100, label='Medoids')
  4. plt.title('K-medoids聚类')
  5. plt.xlabel('特征 1')
  6. plt.ylabel('特征 2')
  7. plt.show()

2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

3、层次聚类--AGNES

2.1、API

  1. sklearn.cluster.AgglomerativeClustering
  2. 导入:
  3. from sklearn.cluster import AgglomerativeClustering
  4. 语法:
  5. AgglomerativeClustering(n_clusters=2, *, affinity='euclidean', memory=None, connectivity=None, compute_full_tree='auto', linkage='ward', distance_threshold=None)
  6. 参数:
  7. n_clusters:指定聚类的簇数。
  8. affinity:指定距离度量的方式,可以是预定义的
  9. (如"euclidean""l1""l2""manhattan"等)或者自定义的距离度量函数。
  10. linkage:指定连接方式,用于计算两个簇之间的距离,可以是预定义的字符串
  11. (如" single""ward""complete""average"等)或者自定义的连接函数。
  12. connectivity:指定连接矩阵,用于限制哪些样本可以连接到一起的布尔数组或可调用对象。
  13. compute_full_tree:指定是否计算完整的层次聚类树。
  14. distance_threshold:指定停止合并簇的距离阈值。
  15. memory:指定内存缓存的路径,以便加速计算。
  16. compute_distances:指定是否在计算连接矩阵时计算距离矩阵。
  17. 属性:
  18. 方法:

2.2、流程

2.2.1、获取数据
  1. from scipy.cluster.hierarchy import linkage #导入linage函数用于层次聚类
  2. from scipy.cluster.hierarchy import dendrogram #dendrogram函数用于将聚类结果绘制成树状图
  3. from scipy.cluster.hierarchy import fcluster #fcluster函数用于提取出聚类的结果
  4. from sklearn.datasets import make_blobs #make_blobs用于生成聚类算法的测试数据
  5. from sklearn.cluster import AgglomerativeClustering #自底向上层次聚类算法
  6. # 获取数据
  7. centers = [[1, 1], [-1, -1], [1, -1]]
  8. X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=1473)
  9. # 可视化
  10. plt.figure()
  11. plt.scatter(X[:, 0], X[:, 1], c='b')
  12. plt.show()

 

2.2.2、数据预处理
2.2.3、特征工程
2.2.4、模型训练
  1. #层次聚类实现
  2. Z = linkage(X, method='ward', metric='euclidean')
  3. print(Z.shape)
  4. print(Z[: 5])
2.2.5、模型评估
  1. # 用模型计算测试值,得到预测值
  2. #
  3. #画出树状图
  4. plt.figure()
  5. dendrogram(Z, truncate_mode='lastp', p=20, show_leaf_counts=False, leaf_rotation=90, leaf_font_size=15,
  6. show_contracted=True)
  7. plt.show()

  1. #根据临界距离返回聚类结果
  2. d = 15
  3. labels_1 = fcluster(Z, t=d, criterion='distance')
  4. print(labels_1[: 100]) # 打印聚类结果
  5. print(len(set(labels_1))) # 看看在该临界距离下有几个 cluster
  6. #根据聚类数目返回聚类结果
  7. k = 3
  8. labels_2 = fcluster(Z, t=k, criterion='maxclust')
  9. print(labels_2[: 100])
  10. list(labels_1) == list(labels_2) # 看看两种不同维度下得到的聚类结果是否一致
  11. #聚类的结果可视化,相同的类的样本点用同一种颜色表示
  12. plt.figure()
  13. plt.scatter(X[:, 0], X[:, 1], c=labels_2, cmap='prism')
  14. plt.show()

 

2.2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

2.2.7、对比不同方法聚类效果
  1. from time import time
  2. import numpy as np
  3. from sklearn.datasets import make_blobs
  4. from scipy.cluster.hierarchy import linkage, fcluster
  5. from sklearn.metrics.cluster import adjusted_mutual_info_score
  6. import matplotlib.pyplot as plt
  7. #生成样本点
  8. centers = [[1, 1], [-1, -1], [1, -1]]
  9. X, labels = make_blobs(n_samples=750, centers=centers,
  10. cluster_std=0.4, random_state=0)
  11. #可视化聚类结果
  12. def plot_clustering(X, labels, title=None):
  13. plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='prism')
  14. if title is not None:
  15. plt.title(title, size=17)
  16. plt.axis('off')
  17. plt.tight_layout()
  18. #进行 Agglomerative 层次聚类
  19. linkage_method_list = ['single', 'complete', 'average', 'ward']
  20. plt.figure(figsize=(10, 8))
  21. ncols, nrows = 2, int(np.ceil(len(linkage_method_list) / 2))
  22. plt.subplots(nrows=nrows, ncols=ncols)
  23. for i, linkage_method in enumerate(linkage_method_list):
  24. print('method %s:' % linkage_method)
  25. start_time = time()
  26. Z = linkage(X, method=linkage_method)
  27. labels_pred = fcluster(Z, t=3, criterion='maxclust')
  28. print('Adjust mutual information: %.3f' % adjusted_mutual_info_score(labels, labels_pred))
  29. print('time used: %.3f seconds' % (time() - start_time))
  30. plt.subplot(nrows, ncols, i + 1)
  31. plot_clustering(X, labels_pred, '%s linkage' % linkage_method)
  32. plt.show()

 

4、密度聚类--DBSCAN

4.1、API

  1. sklearn.cluster.DBSCAN
  2. 导入:
  3. from sklearn.cluster import DBSCAN
  4. 语法:
  5. DBSCAN(eps=0.5, min_samples=5, metric='euclidean', algorithm='auto', leaf_size=30, p=None, n_jobs=1)
  6. 参数:
  7. eps:两个样本之间的最大距离,即扫描半径
  8. min_samples :作为核心点的话邻域(即以其为圆心,eps为半径的圆,含圆上的点)中的最小样本数(包括点本身)。
  9. metric :度量方式,默认为欧式距离,还有metric=‘precomputed’(稀疏半径邻域图)
  10. algorithm:近邻算法求解方式,有四种:‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’
  11. leaf_size:叶的大小,在使用BallTree or cKDTree近邻算法时候会需要这个参数
  12. n_jobs :使用CPU格式,-1代表全开
  13. 属性:
  14. DBSCAN.core_sample_indices_:核心样本指数。(此参数在代码中有详细的解释)
  15. DBSCAN.labels_:数据集中每个点的集合标签给,噪声点标签为-1
  16. DBSCAN.components_ :核心样本的副本
  17. 方法:
  18. DBSCAN.fit(x)
  19. DBSCAN.predict(x)
  20. DBSCAN.fit_predict(x)
  21. 计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)

 make_circles的API:

生成数据集,形成一个二维的大圆,包含一个小圆

  1. sklearn.datasets.make_circles
  2. 导入:
  3. from sklearn.datasets import make_circles
  4. 方法:
  5. x, y = make_circles(n_samples=5000, factor=.6, noise=.05, random_state=1473)
  6. x为样本特征,y为样本簇类别
  7. n_samples:样本数,默认=100
  8. factor:0 < double <1 默认值0.8,内外圆之间的比例因子
  9. noise:设置噪声,小的话比较集中

4.2、流程

4.2.1、获取数据
  1. from sklearn import datasets
  2. from sklearn.cluster import DBSCAN
  3. # 获取数据
  4. # 生成两簇非凸数据
  5. x1, y2 = make_blobs(n_samples=1000, n_features=2,
  6. centers=[[1.2, 1.2]], cluster_std=[[.1]],
  7. random_state=9)
  8. # 一簇对比数据
  9. x2, y1 = datasets.make_circles(n_samples=5000, factor=.6, noise=.05)
  10. x = np.concatenate((x1, x2))
  11. plt.scatter(x[:, 0], x[:, 1], marker='o')
  12. plt.show()

 

4.2.2、数据预处理
4.2.3、特征工程
4.2.4、模型训练
  1. # 实例化学习器
  2. dbs = DBSCAN(eps=0.1, min_samples=12).fit(x)
  3. print('DBSCAN模型:\n', dbs)
  4. # 模型训练+预测
  5. ds_pre = dbs.fit_predict(x)

4.2.5、模型评估
  1. # 用模型计算测试值,得到预测值
  2. #
  3. # 绘制DBSCAN模型聚类结果
  4. plt.scatter(x[:, 0], x[:, 1], c=ds_pre)
  5. plt.title('DBSCAN', size=17)
  6. plt.show()

 

4.2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

5、高斯混合模型(GMM)

5.1、API

  1. sklearn.cluster.KMeans
  2. 导入:
  3. from sklearn.cluster import KMeans
  4. 语法:
  5. KMeans(n_clusters=8,init=‘k-means++’)
  6. n_clusters:开始的聚类中心数量
  7. init:初始化方法,默认为'k-means ++’
  8. labels_:默认标记的类型,可以和真实值比较(不是值比较)

5.2、流程

5.2.1、获取数据

  1. # API导入
  2. from sklearn.mixture import GaussianMixture
  3. # 获取数据
  4. # 生成模拟数据
  5. X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

5.2.2、数据预处理

5.2.3、特征工程

5.2.4、模型训练

  1. # 实例化学习器
  2. gmm = GaussianMixture(n_components=4)
  3. # 模型训练
  4. gmm.fit(X)

5.2.5、模型评估

  1. # 预测测试集结果
  2. clusters = gmm.predict(X)
  3. # 可视化
  4. plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis', marker='o', s=50)
  5. plt.title("Gaussian Mixture Model Clustering")
  6. plt.xlabel("Feature 1")
  7. plt.ylabel("Feature 2")
  8. plt.show()

 

5.2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。


旧梦可以重温,且看:机器学习(五) -- 无监督学习(1) --聚类1
欲知后事如何,且看:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/891095
推荐阅读
相关标签
  

闽ICP备14008679号