python-sklearn 机器学习导学&聚类入门实例

课程主页: https://www.icourse163.org/course/BIT-1001872001

课程导学

分类

  • 监督学习 Supervised Learning
    • 在给定人类标注的训练数据中学习函数
  • 无监督学习 Unsepervised Learning
    • 无人类标注的训练集
  • 增强学习/强化学习 Reinforcement Learning
    • 通过观察环境学习执行动作
  • 半监督学习 Semi-supervised Learning
  • 深度学习 Deep Learning

scikit-learn

  • sklearn
  • 一组简单有效的工具集
  • 依赖numpty, scipy and matplotlib
  • 开源、可复用
应用
分类Classification 异常检测、图像识别等 KNN, SVM…
聚类Clustering 图像分割、群体划分等 K-Means, 谱聚类…
回归Regression 价格预测、趋势预测等 线性回归, SVR…
降维Dimension Reduction 可视化 PCA, NMF…

Sklearn库的安装

sklearn库中的标准数据集及基本功能

  • sklearn.datasets.load_boston加载波士顿房价数据集
    • return_X_y, True则返回target(价格), 默认False只返回data(属性).

无监督学习

  • 利用无标签的数据学习数据的分布或数据与数据之间的关系被称作无监督学习。
  • 有无监督学习的最大区别在于数据是否有标签
  • 常用场景:聚类和降维

聚类 Clustering

  • 根据数据的“相似性”将数据分为多类的过程
    • 如何定义相似性
  • 估算相似性通常计算样本间距离
    • 欧氏距离 $d=\sqrt{\sum_{k=1}^n(x_{1k}-x_{2k}^n)}$
    • 曼哈顿距离,城市街区距离 $d=\sum_{k=1}^n\|x_{1k}-x_{2k}\|^2$
    • 马氏距离,数据的协方差距离,尺度无关,$d(x_i,x_j)=\sqrt{(x_i-x_j)^T s^{-1}(x_i-x_j)}$, where s为协方差矩阵
    • 夹角余弦,用向量空间中两个向量夹角的余弦值作为衡量两个样本差异的大小,$cos(\Theta)=\frac{x_1 x_2 + y_1 y_2}{\sqrt{x_1 ^2 + y_1 ^2}\cdot \sqrt{x_2 ^2 + y_2 ^2}}$

sklearn.cluster

  • K-Means, 近邻传播算法, DBSCAN
    • DBSCAN较快,近邻传播较慢
  • 可以使用不同的数据形式作为输入
    • 标准数据输入格式: [样本个数,特征个数] 定义的矩阵形式
  • DBSCAN, AffinityPropogation 接受相似性矩阵即 [样本数目] 定义的矩阵形式
    • 以余弦相似度为例,对角线元素全为1,每个元素取值范围为[0,1]
算法名称 参数 可扩展性 相似性度量
K-means 聚类个数 大规模数据 点间距离
DBSCAN 领域大小 大规模数据 点间距离
Gaussian Mixtures 聚类个数及其他超参 复杂度高,不适合处理大规模数据 马氏距离
Birch 分支因子,阈值等其他超参 大规模数据 两点间的欧氏距离

降维

  • 保证数据具有代表性特性或分布的情况下,将高维数据转为低维数据的过程
    • 数据可视化
    • 精简数据
  • 对数据集的组成成分进行分解 decomposition

sklearn.decomposition

算法名称 参数 可扩展性 适用任务
PCA 所降维度及其他超参 大规模数据 信号处理等
FastICA 所降维度及其他超参 超大规模数据 图形图像特征提取
NMF 所降维度及其他超参 大规模数据 图形图像特征提取
LDA 所降维度及其他超参 大规模数据 文本数据,主题挖掘

聚类之K-Mean 31省市居民家庭消费调查

  • 以k为参数,把n个对象分成k个簇,使簇内有较高相似度,簇间相似度较低
    • 随机选择k个点作为初始聚类中心
    • 剩下点根据与簇内中心的距离将其归入最近的簇
    • 对每个簇,计算所有点的均值作为新的聚类中心
    • 重复以上两个步骤直到簇类中心不再发生改变

城镇居民家庭平均消费

  • Goal: 通过聚类,了解99年各个省份的消费水平在国内的情况
  • 技术路线: sklearn.cluster.Kmeans
  • 1.建立工程,导入sklearn包
    • import numpy as np
    • from sklearn.cluster import KMeans
  • 2.加载数据

  • K-Means方法的参数
    • n_clusters 指定聚类中新的个数
    • init 初始聚类中心的初始化方法,默认为k-means++
    • max_iter 最大的迭代次数,默认为300
    • data 加载数据
    • label 聚类后各数据所属标签
    • fit_predict() 计算簇中心以及为簇分配序号
  • 计算数据相似性时,sklearn.KMeans默认用欧式距离。虽有余弦相似度和马氏距离等多种方法,但没有设定计算距离方法的参数
  • 使用自定义计算距离的方式
    • def euclidean_distances
    • scipy.spatial.distance.cdist(A, B, metrics='cosine') 余弦距离

聚类之DBSCAN 学生月上网时间分布聚类实例

  • DBSCAN基于密度的聚类算法,不需指定簇个数,最终的簇个数不定
  • 将数据点分为三类:
    • 核心点:在半径Eps内含有超过MinPts数目的点
    • 边界点:在半径Eps内点点数量小于MinPts,但是落在核心点的邻域内
    • 噪音点:既不是核心点也不是边界点的点
  • 算法流程:
    • 将所有点标记为三类点
      • 对每个点计算其邻域Eps内的点的集合
      • 集合内点的个数超过MinPts的点为核心点
      • 查看剩余点是否在核心点邻域内,若在则为边界点,否则为噪声点
    • 删除噪声点
    • 为距离在Eps之内的所有核心点之间赋予一条边
    • 每组连通的核心点形成一个簇
    • 将每个边界点指派到一个与之关联的核心点的簇内
  • Goal: 通过DBSCAN聚类,分析学生上网时间和上网时长的模式
  • 技术路线:sklearn.cluster.DBSCAN
  • 1.建立工程,引入相关包
    • import numpy as np
    • from sklearn.cluster import DBSCAN
    • DBSCAN参数
      • eps 两个样本被看作邻居节点的最大距离
      • min_samples 簇的样本数
      • metric 距离计算方式
    • eg.sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, metric='euclidean')
  • 2.加载数据,预处理数据

  • 3.聚类分析上网时长、上网时间

  • 4.得出分析结果

Full Code

Notes

  • np.reshape() 中,-1 为参数表示根据已设定的值猜测
    • 对于 [[2,3],[4,5]]reshape(4, -1) 表示 reshape(4, 1)
  • ndarray 执行 arr[arr[index0:index1] == value] 为输出数组中值为 value 的子数组
  • 对于 Silhouette Score 轮廓平均系数, https://www.cnblogs.com/zhaokui/p/ml-metric.html,是一种聚类效果的评价指标

Leave a Reply

Your email address will not be published.