机器学习实践:非监督学习

1、实验描述

  • 本实验通过scikit-learn 工具包完成非监督学习的理解和使用,其中主要包括各种聚类分析算法及其分析能力的对比,使用PCA技术达到处理高维数据的能力等内容

  • 实验时长:90分钟

  • 主要步骤:

    • 非监督学习简介

    • 典型非监督学习之KMeans聚类分析

    • 多种聚类分析算法对比

    • PCA降维实验

2、实验环境

  • 虚拟机数量:1

  • 系统版本:CentOS 7.5

  • Python版本: Python3.5

3、相关技能

  • Python编程

  • 非监督学习

  • 聚类分析

  • PCA降维及编程

4、相关知识点

  • 非监督学习
  • 聚类分析算法
  • 划分聚类
  • 评价函数
  • 层次聚类
  • 轮廓系数
  • Mean Shift
  • Brich
  • DBSCAN
  • 主成分分析
  • PCA降维
  • 协方差矩阵
  • 特征值
  • 特征向量

5、效果图

  • 用k_means对数据做聚类分析,并将结果可视化,效果如下图

图 1

  • 对比KMeans、MeanShift、Birch、DBSCAN四种聚类的聚类结果

图 2

  • 利用手写数据集做降维处理后数据,训练KMeans模型,并利用模型对数据做聚类划分,然后可视化结果

图 3

6、实验步骤

6.1非监督学习:非监督学习的数据集跟监督学习不同,没有任何标签,即没有相应的“正确答案”。从数据集中可以通过非监督学习得到数据的某种结构,监督学习里典型例子是聚类。聚类的目的在于把相似的东西聚在一起,而我们并不关心这一类是什么。因此,一个聚类算法通常只需要知道如何计算相似度就可以了。

6.1.1聚类算法一般有五种方法,最主要的是划分方法层次方法两种。划分聚类算法通过优化评价函数把数据集分割为K个部分,它需要K作为输人参数。典型的分割聚类算法有K-means算法,K-medoids算法、CLARANS算法。层次聚类由不同层次的分割聚类组成,层次之间的分割具有嵌套的关系。它不需要输入参数,这是它优于分割聚类算法的一个明显的优点,其缺点是终止条件必须具体指定。典型的分层聚类算法有BIRCH算法、DBSCAN算法和CURE算法等

6.2这里我们主要讲解非监督学习中的K-means聚类算法

6.2.1K-means聚类:K 代表最终将样本数据聚合为 K 个类别。而「均值」代表在聚类的过程中,我们计算聚类中心点的特征向量时,需要采用求相邻样本点特征向量均值的方式进行。

6.2.2聚类过程:

6.2.2.1第一步,确定聚类的个数(K),在特征空间上,随机初始化k个类别的中心。当然,k值的大小并不是随机选取的,在我们使用K-means聚类时我们一般通过计算轮廓系数来确定k值的大小,我们计算数据集中所有点的轮廓系数,最终以平均值作为当前聚类的整体轮廓系数。整体轮廓系数介于[-1,1] ,越趋近于 1 代表聚类的效果越好。

6.2.2.2依据上一步随机初始化的中心,将现有的样本按照与最近的中心点之间的距离进行归类。

6.2.2.3通过计算出新的中心点的位置,又接着迭代到上一步的计算,继续求解中心。

6.2.2.4依次迭代下去,直到中心点的变化非常小的时候,停止。就可以将全部样本聚类为k类

6.2.3聚类实验:

6.2.3.1进入虚拟环境zkbc(该环境前面的实验已经建立,若没有则按照前面的实验创建即可)

[zkpk@master ~]$ source activate zkbc
(zkbc)[zkpk@master ~]$

6.2.3.2为python分别安装numpy、scipy、scikit-learn、matplotlib、pandas,询问是否确定时输入y(若已安装可跳过此步骤)

(zkbc)[zkpk@master ~]$ conda install numpy=1.11.3
(zkbc)[zkpk@master ~]$ conda install scipy
(zkbc)[zkpk@master ~]$ pip install scikit-learn
(zkbc)[zkpk@master ~]$ conda install matplotlib
(zkbc)[zkpk@master ~]$ conda install pandas

6.2.3.3安装完成后,进入python命令行

(zkbc)[zkpk@master ~]$ python

6.2.3.4首先我们要确定k值,这里我们使用scikit-learn中的sklearn.metrics.silhouette_score()方法来计算样本的轮廓系数,从而确定k值

6.2.3.5导入实现要用到的相关包

>>>from sklearn.cluster import k_means
>>>from sklearn.metrics import silhouette_score
>>>from matplotlib import pyplot as plt
>>>import pandas as pd

6.2.3.6利用pandas读取本地实验文件,可以查看下前5条数据的结构,发现其只有两列特征值

>>>df=pd.read_csv('/home/zkpk/experiment/unspdlearn/cluster_data.csv')
>>>df.head()

图 4

6.2.3.7取出所有的样本数据赋值给sample,创建一个空的列表score

>>>sample=df[['x','y']]
>>>score=[]

6.2.3.8循环计算k值等于2至12中的每一个数值时的样本轮廓系数,并追加到score列表中(结束循环语句要两次回车)

>>>for i in range(10):
...    model =k_means(sample,n_clusters=i+2)
...    score.append(silhouette_score(sample,model[1]))
...

6.2.3.9每一种情况的k值对应的样本轮廓系数计算完成之后,我们通过matplotlib绘制出轮廓系数折线图如下,-o表示将折线点绘制成圆点,可以看到当k值约为3时,我们的聚类效果可以达到最好

>>>plt.subplot(1,1,1)
>>>plt.plot(range(2,12,1),score,"-o")
>>>plt.show()

图 5

6.2.3.10关闭图形,回到python命令行

6.2.3.11通过上面的步骤我们已经确定了k的大小,接下来我们就可以开始利用k均值算法对数据进行聚类了

6.2.3.12创建Kmeans模型,其中n_clusters就是k值

>>>model=k_means(sample,n_clusters=3)

6.2.3.13查看模型参数: 第一个数组表示三个聚类中心点坐标。第二个数组表示样本聚类后类别,第三个数组表示样本距最近聚类中心的距离总和。

>>>model

图 6

6.2.3.14获取x列样本和y列样本,作为绘图时的x轴和y轴

>>>X=df['x']
>>>Y=df['y']

6.2.3.15从模型中获得每个类别的中心点和类别标签值,前面已经说过它们分别是模型中的第一个数组和第二个数组

>>>cluster_centers = model[0] # 聚类中心数组
>>>cluster_labels = model[1] # 聚类标签数组

6.2.3.16利用matplotlib绘制散点图,并用X和Y的值作为x轴和y轴,并根据类别标签分类着色

>>>plt.scatter(X, Y, c=cluster_labels) # 绘制样本并按聚类标签标注颜色

6.2.3.17循环获取中心点数组中的每一个中心点,并利用中心点的第一列和第二列绘制出该中心点,点的样式marker为p(五边形),边界颜色为红色(回车两次完成循环结构编写)

>>>for center in cluster_centers:
...   plt.scatter(center[0], center[1], marker="p", edgecolors="red")
...

6.2.3.18利用show方法输出图形,查看聚类结果。可以看到样本数据很明显的分为了三类,并且样本中心也很准确,至此,一个简单的聚类分析任务就完成了

>>>plt.show() # 显示图

图 7

6.2.3.19关闭图形,回到python命令行界面

6.3其他聚类分析算法

6.3.1scikit-learn中除了K-Means算法之外还有其他的聚类算法,例如MeanShift、Brich、DBSCAN等算法

6.3.1.1Mean Shift(实现方法:sklearn.cluster.MeanShift): Mean shift将特征空间视为先验概率密度函数,那么输入就被视为是一组满足某种概率分布的样本点,这样一来,特征空间中数据最密集的地方,对应于概率密度最大的地方,且概率密度的质心就可以被视为是概率密度函数的局部最优值,也就是要求的聚类中心。对于每一个样本点,计算以它为中心的某个范围内所有样本点的均值,作为新的中心(这就是shift既中心的移动),移动直至收敛。这样每一轮迭代,中心都会向数据更密集的地方移动

6.3.1.2Brich(实现方法:sklearn.cluster.Birch): BIRCH的全称是利用层次方法的平衡迭代规约和聚类(Balanced Iterative Reducing and Clustering Using Hierarchies), BIRCH算法利用了一个树结构来帮助我们快速的聚类,这个树结构类似于平衡B+树,一般将它称之为聚类特征树(Clustering Feature Tree,简称CF Tree)。这颗树的每一个节点是由若干个聚类特征(Clustering Feature,简称CF)组成。从下图我们可以看看聚类特征树是什么样子的:每个节点包括叶子节点都有若干个CF,而内部节点的CF有指向孩子节点的指针,所有的叶子节点用一个双向链表链接起来, Birch 的优点是,只需要单次扫描数据集即可完成聚类,运行速度较快,特别适合大数据集

6.3.1.3DBSCAN(实现方法:sklearn.cluster.DBSCAN):DBSCAN是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果

6.3.2现在我们分别利用这几种聚类算法,进行聚类分析,通过绘图查看不同算法聚类结果的异同

6.3.2.1导入聚类算法对比实验所需的包

>>>from sklearn import cluster # 导入聚类模块
>>>from matplotlib import pyplot as plt # 导入绘图模块
>>>import pandas as pd # 导入数据处理模块
>>>import numpy as np # 导入数值计算模块

6.3.2.2创建模型名称数组cluster_name和模型数组cluster_estimators,我们的样本数据共有三类标签值,所以这里我们的k值就不再计算了,有兴趣的同学可以自己试试,这里我们直接定义为3就好

6.3.2.3需要注意的这里的KMeans与上面实验的k_means,他们的聚类原理是一样的,Kmeans又称 k_means++。原始k_means算法的思想是最开始随机选取数据集中K个点作为聚类中心,而k_means++的思想是第一个聚类中心是随机选取,选取其他聚类中心时距离当前已选聚类中心越远,会有更高的概率被选为第n+1个聚类中心。两种模型的参数略有不同,但其聚类原理是一致的

>>>cluster_names=['KMeans','MeanShift', 'Birch', 'DBSCAN']
# 确定聚类方法相应参数
>>>cluster_estimators = [
...   cluster.KMeans(n_clusters=3),
...   cluster.MeanShift(),
...   cluster.Birch(n_clusters=3),
...   cluster.DBSCAN()
...]

6.3.2.4利用pandas读取本地实验文件data_blobs,该数据集有两个特征值列(x、y)和一个目标值列(class),样本数据集有三类目标值,我们只需取出特征值即可

>>>data=pd.read_csv("/home/zkpk/experiment/unspdlearn/data_blobs.csv", header=0)
>>>samples=data[['x','y']]

6.3.2.5创建一个数字变量为绘图做准备,创建一个画布,尺寸为15*10,设置尺寸是为了显示的时候字体不会挤压到一起

>>>plot_num = 1 # 为绘制子图准备
>>>plt.figure(figsize=(15,10)) #创建画布

6.3.2.6创建一个for循环,循环从模型名称数组和模型数组中取出模型信息,利用fit方法对样本数据sample进行聚类模型训练,聚类完成后,判断该模型有无`labels_`参数,如果有则直接将其目标值转换为int类型;如果没有则利用样本数据进行预测,推测出目标值。再利用绘图工具,将不同的图形放置在画布不同的位置上,位置的区分就是用到了上面定义plot_num变量。最后判断该模型有无聚类中心,有则以五角星红色画出,判断结束,设置画布标题,plot_num加1(回车两次结束循环代码编写)

>>>for name, algorithm in zip(cluster_names, cluster_estimators):
...    algorithm.fit(samples) # 聚类
...    if hasattr(algorithm, 'labels_'):
...        algorithm.labels_.astype(np.int)
...    else:
...        algorithm.predict(samples)   # 利用模型做预测
...    plt.subplot(2, len(cluster_estimators) / 2, plot_num)    # 设置子图位置
...    plt.scatter(data['x'], data['y'], c=algorithm.labels_)  # 绘制散点图
...    if hasattr(algorithm, 'cluster_centers_'):
...        centers = algorithm.cluster_centers_
...        plt.scatter(centers[:, 0], centers[:, 1], marker="p", edgecolors="red")
...    plt.title(name)
...    plot_num += 1
...

6.3.2.7最后输出绘制好的图形,比较聚类结果

>>>plt.show()

图 8

6.3.2.8可以看到这四中聚类算法的效果都大同小异,都将数据集成功分为3类,但是可以看出Birch和DBSCAN找不到聚类中心,DBSCAN分类的边界点会出现部分错误分类

6.3.2.9这里只列举了几种聚类算法的原理和聚类结果比较,在scikit-learn中还有一些其他的聚类算法,有兴趣的同学可以去查阅学习其原理和使用方法

6.3.2.10关闭图形,回到python命令行

6.4主成分分析和PCA降维:

6.4.1主成分分析(Principal Components Analysis),简称 PCA。随着数据集维度的增加,算法学习需要的样本数量呈指数级增加。有些应用中,遇到这样的大数据是非常不利的,而且从大数据集中学习需要更多的内存和处理能力。另外,随着维度的增加,数据的稀疏性会越来越高。在高维向量空间中探索同样的数据集比在同样稀疏的数据集中探索更加困难。PCA是一种用于探索高维数据结构的技术。PCA通常用于高维数据集的探索与可视化。还可以用于数据压缩,数据预处理等。PCA可以把可能具有相关性的高维变量合成线性无关的低维变量,称为主成分( principal components)。新的低维数据集会尽可能的保留原始数据的变量。PCA将数据投射到一个低维子空间实现降维。例如,二维数据集降维就是把点投射成一条线,数据集的每个样本都可以用一个值表示,不需要两个值。三维数据集可以降成二维,就是把变量映射成一个平面。一般情况下,n维数据集可以通过映射降成k维子空间,其中k是选取的主成分数目

6.4.2主成分分析数学原理:通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(也即包含方差最大)的N个特征所对应的特征向量组成的矩阵,我们就可以将数据矩阵转换到新的空间当中,实现数据特征的降维(N维)

6.4.3scikit-learn 中PCA的使用示例

sklearn.decomposition.PCA(n_components=None,copy=True,whiten=False, svd_solver='auto')

6.4.3.1n_components:表示需要保留主成分(特征)的数量,即维度,默认为None

6.4.3.2copy:表示针对原始数据降维还是针对原始数据副本降维。当参数为 False 时,降维后的原始数据会发生改变,这里默认为 True。

6.4.3.3whiten:白化表示将特征之间的相关性降低,并使得每个特征具有相同的方差,默认为False

6.4.3.4svd_solver:表示奇异值分解 SVD 的方法。有 4 个参数,分别是:auto, full, arpack, randomized,默认为auto

6.4.4使用 PCA 降维时,通常我们会使用 PCA.fit_transform() 方法直接返回降维后的数据结果

6.4.5举个简单的例子

6.4.5.1导入数值计算包numpy和PCA降维模块

>>>import numpy as np # 导入数值计算模块
>>>from sklearn.decomposition import PCA # 导入 PCA 模块

6.4.5.2新建一个二维数组data

>>>data = np.array([[1, 2], [3, 4], [5, 6], [7, 8]]) # 新建一个 2 维数组

6.4.5.3利用PCA的fit_transform方法进行数据降维,然后输入原始数据和降维后数据进行比较

>>>new_data = PCA(n_components=1).fit_transform(data) # 降维成 1 维并返回值
>>>print(data) # 输出原数据
>>>print(new_data)

图 9

6.4.5.4可以看到成功将二维数据转换成为了一维数据,这里大家可能会问为什么数据差异这么大?这里一维数据的结果其实是二维数据的协方差矩阵的主成分特征向量

6.4.6PCA降维实例

6.4.6.1通过支持向量机对scikit-learn中自带的手写数字数据集digits做了分类预测,但是没法将其绘制图形,因为该数据集的特征太多了,无法在二维空间展示

6.4.6.2该数据集包含images部分,该部分存储的是1797张手写数字图片的影像,大小为8*8;data部分,该部分存储的是1797张图片灰度值转换的矩阵,每张图片像素已经转换成了64*1的矩阵;target部分,该部分存储的是每张图片的标签值,用于标识该图片是什么数字,默认有从0到9共10类

6.4.6.3那现在我们再使用这一数据集,并对其进行降维处理,计算该数据集的主成分,然后绘制图形

6.4.6.4导入scikit-learn数据集模块datasets和matplotlib绘图模块

>>>from sklearn import datasets  # 导入数据集模块
>>>import matplotlib.pyplot as plt  # 导入绘图模块
>>>from sklearn.decomposition import PCA # 导入PCA降维分析包
>>>from sklearn.cluster import KMeans #导入KMeans聚类分析模型
>>>import numpy as np #导入数值计算模块

6.4.6.5载入手写数字数据集

>>>digits_data = datasets.load_digits()

6.4.6.6原始数据的维度达到64,需要使用降维操作,降维到2

>>>sample = digits_data.data
>>>target = digits_data.target
# PCA 将数据降为 2 维
>>>reduction_data = PCA(n_components=2).fit_transform(sample)

6.4.6.7手写数字数据集共10类,所以将降维后的数据聚为 10 类

6.4.6.8创建KMeans模型,k值为10,再利用降维后的数据训练模型

>>>model = KMeans(n_clusters=10)
>>>model.fit(reduction_data)

6.4.6.9计算聚类过程中的决策边界(分类边界)

>>>x_min,x_max=reduction_data[:,0].min()-1,reduction_data[:,0].max() + 1
>>>y_min,y_max=reduction_data[:,1].min()-1,reduction_data[:,1].max() + 1
>>>xx,yy=np.meshgrid(np.arange(x_min,x_max, .05), np.arange(y_min, y_max, .05))   # 绘制网络
>>>result = model.predict(np.c_[xx.ravel(), yy.ravel()])  # ravel()将多维数组转换成一维数组;c_列方向拼接矩阵
>>>result = result.reshape(xx.shape)

6.4.6.10绘制出决策边界,xx是决策边界的x轴坐标,yy是决策边界的y轴坐标,再绘制出样本数据,并以该样本数据的标签值进行着色

>>>plt.contourf(xx, yy, result, cmap=plt.cm.Greys)
>>>plt.scatter(reduction_data[:, 0], reduction_data[:, 1], c=target, s=15)

6.4.6.11获取聚类中心,并绘制聚类中心点

>>>center = model.cluster_centers_
>>>plt.scatter(center[:, 0], center[:, 1], marker='p', linewidths=2, color='b', edgecolors='w', zorder=20)

6.4.6.12设置x轴的刻度范围和y轴的刻度范围

>>>plt.xlim(x_min, x_max)
>>>plt.ylim(y_min, y_max)

6.4.6.13利用show输出图形,查看结果

>>>plt.show()

图 10

7、总结

本节实验我们通过scikit-learn库完成了非监督学习,学会KMeans算法中k值的选取方式、KMeans和k_means的区别、几种不同聚类分析算法的比较;如何使高维数据的维度降低从而能更加方便的处理和展示数据等。通过本节实验的学习,我们应当对非监督学习有了全面的认知,理解它与监督学习的区别,面临实际问题,能够快速分析并构建模型解决问题。

机器学习实践:非监督学习-8相关推荐

  1. 机器学习:非监督学习

    文章目录 机器学习:非监督学习 聚类Clustering Kmean聚类 层次聚类 (Hierarchical Clustering, HC) 单连接层次聚类(single link) 全连接层次聚类 ...

  2. 吴恩达机器学习笔记-非监督学习

    聚类 之前的课程中我们学习的都是监督学习相关的算法,现在来开始看非监督学习.非监督学习相对于监督非学习来看,其使用的是未标记的训练集而监督学习的是标记的训练集.换句话说,我们不知道向量y的预期结果,仅 ...

  3. 机器学习之非监督学习——(猫狗识别案例/搭建卷积神经网络)

    监督学习 监督学习的存在它的弊端,例如对我们人类还无法分辨和归类的事物,监督学习就无法完成,所以为了弥补这个缺陷,下面我们看一下新非监督学习,它可以让计算机学会进行更加复杂的分类. 分析过程 监督学习 ...

  4. 机器学习之非监督学习与强化学习

    非监督式学习: 在此学习方式下.输入数据部分被标识,部分没有被标识,这样的学习模型能够用来进行预測,可是模型首先须要学习数据的内在结构以便合理的组织数据来进行预測.应用场景包含分类和回归,算法包含一些 ...

  5. 机器学习之非监督学习(六)——聚类(K-Means)

    K-means算法 (无监督算法,聚类算法) 1-1 基本流程 一.概念: K-means中心思想:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之 ...

  6. 1 监督学习与非监督学习简介--机器学习基础理论入门

    1 监督学习与非监督学习简介–机器学习基础理论入门 1.1 机器学习基本概念 什么是机器学习 机器学习: 机器学习(machine learning,ML)是一门多领域交叉学科,设计概率论.统计学.逼 ...

  7. 机器学习非监督学习—k-means及案例分析

    一.非监督学习 无监督学习,顾名思义,就是不受监督的学习,一种自由的学习方式.该学习方式不需要先验知识进行指导,而是不断地自我认知,自我巩固,最后进行自我归纳,在机器学习中,无监督学习可以被简单理解为 ...

  8. 机器学习hierarchical clustering_材料学+AI:非监督学习预测新型固态锂离子导体材料...

    2019年11月20日,丰田北美研究院的凌晨博士与马里兰大学莫一非教授合作,使用非监督学习的方法,预测了固态电池中一些新的还未用实验验证过的固态电解质.从已知晶体库中选取几千种含锂材料,其中部分材料的 ...

  9. 机器学习实践—基于Scikit-Learn、Keras和TensorFlow2第二版—第9章 无监督学习技术(Chapter9_Unsupervised_Learning_Techniques)

    机器学习实践-基于Scikit-Learn.Keras和TensorFlow2第二版-第9章 无监督学习技术(Chapter9_Unsupervised_Learning_Techniques) 虽然 ...

最新文章

  1. ifdown eth0 idup eth0 ifdown --exclude=l0 -a ifup --exclude=lo -a
  2. 矩阵分析与多元统计11 Kronecker乘积
  3. three 天空球_javascript – 分配给相机的three.js天空盒
  4. Win2003下Exchange2003部署图解之七
  5. php判断服务器操作系统的类型
  6. Spring Boot、Spring Cloud、Dubbo的区别
  7. java设置按钮调用问题_按钮相关问题:尝试在空对象引用上调用虚方法
  8. 《javascript入门学习笔记全集》【汇总】
  9. python和区块链哪个好_10个最流行的Python区块链开源项目
  10. js 图片加载时 按比例设置图片宽高_JS自动等比例缩放图片,判断网页与图片加载完成。...
  11. 阿里、美团内部大数据资料!果然牛逼!
  12. 识人 用人 激人 留人 斩人
  13. 如何压缩图片?手把手教你三种图片缩小的办法
  14. 单实例安装elastic和启动报错解决
  15. 通俗理解ROC曲线(Receiver Operating Characteristic Curve)
  16. 云服务器安装frps实现内网穿透
  17. 【Block-Level Verification】 芯片开发通识_验证目标_ 验证语言_ 验证职业前景 _挑战和瓶颈_验证周期_功能描述文档_验证计划_回归测试_硅后测试_逃逸分析...
  18. nginx 静态资源优化配置
  19. 计算机中缺少mfc100.dll怎么办,缺少 mfc100u.dll,要怎么处理啊
  20. vue 数字日期时钟

热门文章

  1. DevC++实现代码高亮复制进word
  2. MVC ViewData和ViewBag
  3. 【带着canvas去流浪(12)】用Three.js制作简易的MARVEL片头动画(上)
  4. 第一篇:瑞吉外卖项目概述
  5. 计算机组成原理大题速成,计算机组成原理大题
  6. 大白菜U盘启动制作工具装机维护版V5.0–大白菜U盘下载中心
  7. 青梅竹马醉酒后背杀!他差点被……?!
  8. JavaScript小项目总结
  9. 极客时间限时免费开放全部课程!别纠结了选这几门!
  10. windows 重置路由表