从零学习机器学习七:聚类算法

聚类算法

      • 目标
      • 1 聚类算法简介
        • 1.1 认识聚类算法
        • 1.2 现实中的应用
        • 1.3 概念
        • 1.4 与分类算法区别
      • 2 聚类算法API
        • 2.1 API
        • 2.2 案例
      • 3 实现流程
        • 3.1 k-means聚类步骤
        • 3.2 案例练习
        • 3.3 小结
      • 4 模型评估
        • 4.1 误差平方和(SSE)
        • 4.2 ”肘“方法-K值确定
        • 4.3 轮廓系数法(SC)
        • 4.4 CH系数
        • 4.5 总结
      • 5 算法优化
        • 5.1 优缺点
        • 5.2 Canopy算法
        • 5.9 总结
      • 6 特征工程-特征降维
        • 6.1 降维
        • 6.2 特征选择
        • 6.3 主成分分析

目标

  • 掌握聚类算法的实现过程
  • 知道K-means算法原理
  • 知道聚类算法中的评估模型
  • 知道聚类算法的优缺点
  • 了解聚类算法的优化方式
  • 应用Kmeans实现聚类任务

1 聚类算法简介

1.1 认识聚类算法

从零学习机器学习七:聚类算法_第1张图片 从零学习机器学习七:聚类算法_第2张图片

1.2 现实中的应用

  • 用户画像,广告推荐,Data Segmentation,搜索引擎的流量推荐,恶意流量识别

  • 基于位置信息的商业退佣,新闻聚类,筛选排序

  • 图像分割,降维,识别;离群点检测;信用卡异常消费;发觉相同功能的基因片段

    从零学习机器学习七:聚类算法_第3张图片

1.3 概念

一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。

在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。

1.4 与分类算法区别

聚类算法时无监督学习算法,而分类算法是监督学习算法。

2 聚类算法API

2.1 API

  • sklearn.cluster.KMeans(n_clusters=8)
    • 参数
      • n_clusters:开始的聚类中心数量。整型,缺省值=8,生成的聚类数,即产生的质心(centroids)数。
    • 方法
      • estimator.fit(x)
      • estimator.predict(x)
      • estimator.fit_predict(x)
        • 计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)

2.2 案例

随机创建不同二维数据集作为训练集,并结合k-means算法将其聚类,你可以尝试分别聚类不同数量的簇,并观察聚类效果:

聚类参数n_cluster传值不同,得到的聚类结果不同

从零学习机器学习七:聚类算法_第4张图片
  • 流程分析

    从零学习机器学习七:聚类算法_第5张图片
  • 代码实现

    1. 创建数据集

      import matplotlib.pyplot as plt
      from sklearn.datasets.samples_generator import make_blobs
      from sklearn.cluster import KMeans
      from sklearn.metrics import calinski_harabaz_score
      
      # 创建数据集
      # X为样本特征,Y为样本簇类别, 共1000个样本,每个样本4个特征,共4个簇,
      # 簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2, 0.2]
      X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
                        cluster_std=[0.4, 0.2, 0.2, 0.2],
                        random_state=9)
      
      # 数据集可视化
      plt.scatter(X[:, 0], X[:, 1], marker='o')
      plt.show()
      
    2. 使用k-means进行聚类,并使用CH方法评估

      y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(X)
      # 分别尝试n_cluses=2\3\4,然后查看聚类效果
      plt.scatter(X[:, 0], X[:, 1], c=y_pred)
      plt.show()
      
      # 用Calinski-Harabasz Index评估的聚类分数, 越大效果越好
      print(calinski_harabaz_score(X, y_pred))
      

3 实现流程

k-means其实包含两层内容:

  • K:初始中心点个数(计划聚类数)
  • means:求中心点到其他数据点距离的平均值

3.1 k-means聚类步骤

  • 步骤

    1. 随机设置K个特征空间内的点作为初始的聚类中心
    2. 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
    3. 接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
    4. 如果计算得出的新中心点和原中心点一样(质心不再移动),那么结束,否则重新进行第二步过程

    通过下图解释流程:

    从零学习机器学习七:聚类算法_第6张图片

3.2 案例练习

3.3 小结

  • 流程
    • 事先确定常数K,常数K意味着最终的聚类类别数
    • 首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中
    • 接着,重新计算每个类的质心(即为类中心),重复这样的过程,知道质心不再改变
    • 最终就确定了每个样本所属的类别以及每个类的质心
  • 注意
    • 由于每次都要计算所有的样本与每一个质心间的相似度,所以在大规模的数据集上,K-Means算法的收敛速度比较慢

4 模型评估

4.1 误差平方和(SSE)

4.2 ”肘“方法-K值确定

  • 方法

    1. 对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个店到其所属的簇中心的距离的平方和
    2. 平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是他所在簇的中心本身
    3. 在这个平方和变化过程中,会出现一个拐点也即肘点,下降率突然变缓时即认为是最佳的k值

    在决定什么时候停止训练时,肘形判据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,我们停止增加类别

4.3 轮廓系数法(SC)

4.4 CH系数

4.5 总结

  • 肘部法
    • 下降率突然变缓时即认为是最佳的值
  • SC系数
    • 取值为[-1,1],其值越大越好
  • CH系数
    • 分数s高则聚类效果越好

5 算法优化

5.1 优缺点

  • 优点:

    1. 原理简单(靠近中心点),实现容易

    2. 聚类效果中上(依赖K的选择)

    3. 空间复杂度o(N),时间复杂度o(IKN) 注:N为样本点个数,k为中心点个数,I为迭代次数

  • 缺点:

    1. 对离群点,噪声敏感 (中心点易偏移)

    2. 很难发现大小差别很大的簇及进行增量计算

    3. 结果不一定是全局最优,只能保证局部最优(与K的个数及初值选取有关)

5.2 Canopy算法

  • 实现流程

  • 优缺点

    • 优点

      1. Kmeans对噪声抗干扰较弱,通过Canopy对比,将较小的NumPoint的Cluster直接去掉有利于抗干扰。

      2. Canopy选择出来的每个Canopy的centerPoint作为K会更精确。

      3. 只是针对每个Canopy的内做Kmeans聚类,减少相似计算的数量。

    • 缺点

      1. 算法中 T1、T2的确定问题 ,依旧可能落入局部最优解。

5.9 总结

对于K-means++、二分k-means、k-medoids(k-中心聚类算法)、Kernel k-means、ISODATA、Mini Batch K-Means等优化方法暂不过多介绍,只做初步汇总:

优化方法 思路
Canopy+kmeans Canopy粗聚类配合kmeans
kmeans++ 距离越远越容易成为新的质心
二分k-means 拆除SSE最大的簇
k-medoids 和kmeans选取中心点的方式不同
kernel kmeans 映射到高维空间
ISODATA 动态聚类
Mini-batch K-Means 大数据集分批聚类

6 特征工程-特征降维

6.1 降维

  • 定义

    降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量**的过程

    正是因为在进行训练的时候,我们都是使用特征进行学习。如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测会影响较大

    • 降低随机变量的个数
    • 相关特征
      • 相对湿度与降雨量之间的相关
  • 降维的两种方式

    • 特征选择
    • 主成分分析(可以理解为一种特征提取的方式)

6.2 特征选择

  • 定义

    数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征

  • 方法

    • Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
      • 方差选择法:低方差特征过滤
      • 相关系数
    • Embedded (嵌入式):算法自动选择特征(特征与目标值之间的关联)
      • 决策树:信息熵、信息增益
      • 正则化:L1、L2
      • 深度学习:卷积等
  • 低方差特征过滤

    删除低方差的一些特征,前面讲过方差的意义。再结合方差的大小来考虑这个方式的角度。

    • 特征方差小:某个特征大多样本的值比较相近
    • 特征方差大:某个特征很多样本的值都有差别
  • API

    • sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
      • 删除所有低方差特征
      • Variance.fit_transform(X)
        • X:numpy array格式的数据[n_samples,n_features]
        • 返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。

6.3 主成分分析

  • 什么是PCA
    • 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
    • 作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
    • 应用:回归分析或者聚类分析当中
  • API
    • sklearn.decomposition.PCA(n_components=None)
      • 将数据分解为较低维数空间
      • n_components:
        • 小数:表示保留百分之多少的信息
        • 整数:减少到多少特征
      • PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
      • 返回值:转换后指定维度的array

你可能感兴趣的:(机器学习,算法,sklearn,机器学习,聚类算法)