首页 > 编程语言 > 详细

scikit-learn中的无监督聚类算法

时间:2019-06-11 23:15:30      阅读:167      评论:0      收藏:0      [点我收藏+]

  scikit-learn主要由分类、回归、聚类和降维四大部分组成,其中分类和回归属于有监督学习范畴,聚类属于无监督学习范畴,降维适用于有监督学习和无监督学习。scikit-learn的结构示意图如下所示:

技术分享图片  scikit-learn中的聚类算法主要有:

  • K-Means(cluster.KMeans)
  • AP聚类(cluster.AffinityPropagation)
  • 均值漂移(cluster.MeanShift)
  • 层次聚类(cluster.AgglomerativeClustering)
  • DBSCAN(cluster.DBSCAN)
  • BRICH(cluster.Brich)
  • 谱聚类(cluster.Spectral.Clustering)
  • 高斯混合模型(GMM)∈期望最大化(EM)算法(mixture.GaussianMixture)

1. K-Means

1.1 简介

  K 均值聚类(K-Means Clustering)是最基础和最经典的基于划分的聚类算法,是十大经典数据挖掘算法之一。它的基本思想是,通过迭代方式寻找K个簇的一种划分方案,使得聚类结果对应的代价函数最小。特别地,代价函数可以定义为各个样本距离所属簇中心点的误差平方和(SSE)。

技术分享图片

1.2 算法原理

  1. 数据预处理,如归一化、离散点处理等(优化)
  2. 随机选择k个簇的质心
  3. 遍历所有样本,把样本划分到距离最近的一个质心
  4. 划分之后就有K个簇,计算每个簇的平均值作为新的质心
  5. 重复步骤3、4,直到达到停止条件

迭代停止条件:

  • 聚类中心不再发生变化
  • 所有的距离最小
  • 迭代次数达到设定值

1.3 算法特点

优点:

  • 算法容易理解,聚类效果不错
  • 具有出色的速度:O(NKt)
  • 当簇近似高斯分布时,效果比较好

缺点:

  • 需要人工预先确定初试K值,且该值和真是的数据分布未必吻合
  • 对初始中心点敏感
  • 不适合发现非凸形状的簇或者大小差别较大的簇
  • 特殊值/离散值(噪点)对模型的影响比较大
  • 算法只能收敛到局部最优,效果受初始值影响很大
  •  从数据先验的角度来说,在 Kmeans 中,我们假设各个 cluster 的先验概率是一样的,但是各个 cluster 的数据量可能是不均匀的。举个例子,cluster A 中包含了10000个样本,cluster B 中只包含了100个。那么对于一个新的样本,在不考虑其与A cluster、 B cluster 相似度的情况,其属于 cluster A 的概率肯定是要大于 cluster B的。

1.4  适用场景

  • 通用, 均匀的 cluster size(簇大小), flat geometry(平面几何), 不是太多的 clusters(簇)
  • 非常大的 n_samples、中等的 n_clusters 使用 MiniBatch code
  • 样本量<10K时使用k-means,>=10K时用MiniBatchKMeans
  • 不太适用于离散分类

1.5 测试代码

技术分享图片
 1 print(__doc__)
 2 
 3 # Author: Phil Roth <mr.phil.roth@gmail.com>
 4 # License: BSD 3 clause
 5 
 6 import numpy as np
 7 import matplotlib.pyplot as plt
 8 
 9 from sklearn.cluster import KMeans
10 from sklearn.datasets import make_blobs
11 
12 plt.figure(figsize=(12, 12))
13 
14 n_samples = 1500
15 random_state = 170
16 X, y = make_blobs(n_samples=n_samples, random_state=random_state)
17 
18 # Incorrect number of clusters
19 y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)
20 
21 plt.subplot(221)
22 plt.scatter(X[:, 0], X[:, 1], c=y_pred)
23 plt.title("Incorrect Number of Blobs")
24 
25 # Anisotropicly distributed data
26 transformation = [[0.60834549, -0.63667341], [-0.40887718, 0.85253229]]
27 X_aniso = np.dot(X, transformation)
28 y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_aniso)
29 
30 plt.subplot(222)
31 plt.scatter(X_aniso[:, 0], X_aniso[:, 1], c=y_pred)
32 plt.title("Anisotropicly Distributed Blobs")
33 
34 # Different variance
35 X_varied, y_varied = make_blobs(n_samples=n_samples,
36                                 cluster_std=[1.0, 2.5, 0.5],
37                                 random_state=random_state)
38 y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_varied)
39 
40 plt.subplot(223)
41 plt.scatter(X_varied[:, 0], X_varied[:, 1], c=y_pred)
42 plt.title("Unequal Variance")
43 
44 # Unevenly sized blobs
45 X_filtered = np.vstack((X[y == 0][:500], X[y == 1][:100], X[y == 2][:10]))
46 y_pred = KMeans(n_clusters=3,
47                 random_state=random_state).fit_predict(X_filtered)
48 
49 plt.subplot(224)
50 plt.scatter(X_filtered[:, 0], X_filtered[:, 1], c=y_pred)
51 plt.title("Unevenly Sized Blobs")
52 
53 plt.show()
View Code

2. AP聚类

2.1 简介

 

scikit-learn中的无监督聚类算法

原文:https://www.cnblogs.com/xc-family/p/11006525.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!