16_非监督学习、k-means 4阶段、kmeans API、Kmeans性能评估指标、案例

1、聚类算法介绍

关于聚类算法,可以查看:常见的六大聚类算法

2、k-means 4阶段

K-means通常被称为劳埃德算法,这在数据聚类中是最经典的,也是相对容易理解的模型。算法执行的过程分为4个阶段。

  • 1.首先,随机设K个特征空间内的点作为初始的聚类中心。
  • 2.然后,对于根据每个数据的特征向量,从K个聚类中心中寻找距离最近的一个,并且把该数据标记为这个聚类中心。
  • 3.接着,在所有的数据都被标记过聚类中心之后,根据这些数据新分配的类簇,通过取分配给每个先前质心的所有样本的平均值来创建新的质心重,新对K个聚类中心做计算。
  • 4.最后,计算旧和新质心之间的差异,如果所有的数据点从属的聚类中心与上一次的分配的类簇没有变化,那么迭代就可以停止,否则回到步骤2继续循环。

K均值等于具有小的全对称协方差矩阵的期望最大化算法。

3、k-means API

sklearn.cluster.KMeans

class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto')

参数:
n_clusters : int, default=8 
      要形成的聚类数以及生成的质心数。
init : {
    
    ‘k-means++, ‘random’, ndarray, callable}, default=’k-means++’
      初始化方法,默认为'k-means++',以智能方式选择k-均值聚类的初始聚类中心,以加速收敛;random,从初始质心数据中随机选择k个观察值
n_init : int,默认值:10使用不同质心种子运行k-means算法的时间。最终结果将是n_init连续运行在惯性方面的最佳输出。
n_jobs : init用于计算的作业数量。这可以通过并行计算每个运行的n_init。如果-1使用所有CPU。如果给出1,则不使用任何并行计算代码,这对调试很有用。对于-1以下的n_jobs,使用(n_cpus + 1 + n_jobs)。因此,对于n_jobs = -2,所有CPU都使用一个。
random_state : 随机数种子,默认为全局numpy随机数生成器。
labels_:默认标记的类型,可以和真实值比较(不是值比较)

# 关于其它更多参数介绍访问:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#examples-using-sklearn-cluster-kmeans]

使用kmeans的方式案例:
from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],[4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0)

方法
fit(X,y=None)
使用X作为训练数据拟合模型

kmeans.fit(X)

predict(X)
预测新的数据所在的类别

kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)

属性
cluster_centers_
集群中心的点坐标

kmeans.cluster_centers_
array([[1.,2.],[4.,2.]])

labels_
每个点的类别

kmeans.labels_

4、Kmeans性能评估指标

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.1 Kmeans性能评估指标API

sklearn.metrics.silhouette_score

sklearn.metrics.silhouette_score(X, labels)
计算所有样本的平均轮廓系数

X:特征值
labels : 被聚类标记的目标值

5、k-means案例分析

手写数字数据上K-Means聚类的演示

# -*- coding: UTF-8 -*-

from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits

def kmeans():
    """
    手写数字聚类过程
    :return: None
    """
    # 加载手写数字数据集
    ld = load_digits()

    print(ld.data)
    print("------------------------------------------")
    print(ld.target)
    print("---------查看第一个样本数据----------------")
    # 查看第一个样本数据
    print(ld.data[0])
    print("------------------------------------------")
    # print(ld.target[:20])

    # 聚类
    km = KMeans(n_clusters=810)

    km.fit_transform(ld.data)

    print(km.labels_[:20])

    # (silhouette :  /ˌsɪluˈet/  n:轮廓,剪影, vt. 使…照出影子来;使…仅仅显出轮廓)
    print(silhouette_score(ld.data,km.labels_))

if __name__=="__main__":
    kmeans()

输出结果:

[[ 0.  0.  5. ...  0.  0.  0.]
 [ 0.  0.  0. ... 10.  0.  0.]
 [ 0.  0.  0. ... 16.  9.  0.]
 ...
 [ 0.  0.  1. ...  6.  0.  0.]
 [ 0.  0.  2. ... 12.  0.  0.]
 [ 0.  0. 10. ... 12.  1.  0.]]
------------------------------------------
[0 1 2 ... 8 9 8]
---------查看第一个样本数据----------------
[ 0.  0.  5. 13.  9.  1.  0.  0.  0.  0. 13. 15. 10. 15.  5.  0.  0.  3.
 15.  2.  0. 11.  8.  0.  0.  4. 12.  0.  0.  8.  8.  0.  0.  5.  8.  0.
  0.  9.  8.  0.  0.  4. 11.  0.  1. 12.  7.  0.  0.  2. 14.  5. 10. 12.
  0.  0.  0.  0.  6. 13. 10.  0.  0.  0.]
------------------------------------------
[209 579  30 233  33 646 712 369 211 784 162  81 158 735  73  46 284 564
 622 720]
0.09647323481043048

再如案例:https://www.cnblogs.com/moon2/p/9872706.html

6、kmeans总结

特点分析:
采用迭代式算法,直观易懂并且非常实用
缺点:
容易收敛到局部最优解(多次聚类)
需要预先设定簇的数量(k-means++解决)

打个赏呗,您的支持是我坚持写好博文的动力
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/toto1297488504/article/details/106322011