【3】无监督学习概述

一、无监督学习的目标

利用无标签的数据学习数据的分布或数据与数据之间的关系被称作无监 督学习。

  • 有监督学习和无监督学习的最大区别在于数据是否有标签
  • 无监督学习最常应用的场景是聚类(clustering)和降维(Dimension Reduction)

二、聚类(clustering)

见聚类章节内容

三、降维

降维,就是在保证数据所具有的代表性 特性或者分布的情况下,将高维数据转化为 低维数据的过程:

  • 数据的可视化
  • 精简数据

聚类 vs.降维

聚类和降维都是无监督学习的典型任务,任务之间存在关联,比如某些高维数据的聚类可以通过降维处理更好的获得,另外学界研究也表明代表性 的聚类算法如k-means与降维算法如NMF之间存在等价性,在此我们就不展 开讨论了,有兴趣的同学可以参考我们推荐的阅读内容。

sklearn vs.降维

降维是机器学习领域的一个重要研究内容,有很多被工业界和学术界接受 的典型算法,截止到目前sklearn库提供7种降维算法。 降维过程也可以被理解为对数据集的组成成份进行分解(decomposition) 的过程,因此sklearn为降维模块命名为decomposition, 在对降维算法调用需要使用sklearn.decomposition模块

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

1 主成分分析(PCA)

主成分分析(Principal Component Analysis,PCA)是最常用的 一种降维方法,通常用于高维数据集的探索与可视化,还可以用作数 据压缩和预处理等。 PCA可以把具有相关性的高维变量合成为线性无关的低维变量,称为 主成分。主成分能够尽可能保留原始数据的信息。

在介绍PCA的原理之前需要回顾涉及到的相关术语:

  • 方差: 是各个样本和样本均值的差的平方和的均值,用来度量一组数据的分散程度
  • 协方差: 用于度量两个变量之间的线性相关性程度,若两个变量的 协方差为0,则可认为二者线性无关。协方差矩阵则是由变量的协方差值 构成的矩阵(对称阵)。
  • 协方差矩阵: 矩阵的特征向量是描述数据集结构的非零向量,并满足如下公式: 𝑨𝒗 = 𝝀𝒗(A是方阵, 𝒗是特征向量,𝝀是特征值。)
  • 特征向量和特征值

原理:矩阵的主成分就是其协方差矩阵对应的特征向量,按照对应的特征值大小进行排序,最大的特征值就是第一主成分,其次是第二主成分,以此类推。

主成分分析-算法过程 略 图. PCA算法(《机器学习 周志华》)

sklearn中主成分分析

在sklearn库中,可以使用sklearn.decomposition.PCA加载PCA进行 降维,主要参数有:

  • n_components:指定主成分的个数,即降维后数据的维度
  • svd_solver :设置特征值分解的方法,默认为‘auto’,其他可选有 ‘full’, ‘arpack’, ‘randomized’。

PCA实现高维数据可视化

目标:已知鸢尾花数据是4维的, 共三类样本。使用PCA实现对鸢尾花 数据进行降维,实现在二维平面上的 可视化。

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
 
data = load_iris()
y = data.target
X = data.data
pca = PCA(n_components=2)
reduced_X = pca.fit_transform(X)
 
red_x, red_y = [], []
blue_x, blue_y = [], []
green_x, green_y = [], []
 
for i in range(len(reduced_X)):
    if y[i] == 0:
        red_x.append(reduced_X[i][0])
        red_y.append(reduced_X[i][1])
    elif y[i] == 1:
        blue_x.append(reduced_X[i][0])
        blue_y.append(reduced_X[i][1])
    else:
        green_x.append(reduced_X[i][0])
        green_y.append(reduced_X[i][1])
 
plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(blue_x, blue_y, c='b', marker='D')
plt.scatter(green_x, green_y, c='g', marker='.')
plt.show()

2.非负矩阵分解(NMF)

非负矩阵分解(Non-negative Matrix Factorization ,NMF) 是在矩阵中所有元素均为非负数约束条件之下的矩阵分解方法。 基本思想:给定一个非负矩阵V,NMF能够找到一个非负矩阵W和一个 非负矩阵H,使得矩阵W和H的乘积近似等于矩阵V中的值。

  • W矩阵:基础图像矩阵,相当于从原 矩阵V中抽取出来的特征
  • H矩阵:系数矩阵。
  • NMF能够广泛应用于图像分析、文本挖掘和语音处理等领域。

矩阵分解优化目标:最小化W矩阵H矩阵的乘积和原始矩阵之间的差 别,目标函数如下:

基于KL散度的优化目标,损失函数如下:

至于公式的推导,就不在课程中讲述了,有兴趣的同学可以参考下 面的链接。

http://blog.csdn.net/acdreamers/article/details/44663421/

sklearn中非负矩阵分解 在sklearn库中,可以使用sklearn.decomposition.NMF加载NMF算 法,主要参数有:

  • n_components:用于指定分解后矩阵的单个维度k;
  • init:W矩阵和H矩阵的初始化方式,默认为‘nndsvdar’。

NMF人脸数据特征提取

目标:已知Olivetti人脸数据共 400个,每个数据是64*64大小。由 于NMF分解得到的W矩阵相当于从 原始矩阵中提取的特征,那么就可 以使用NMF对400个人脸数据进行 特征提取。

通过设置k的大小,设置提取的 特征的数目。在本实验中设置k=6, 随后将提取的特征以图像的形式展示 出来。

from numpy.random import RandomState
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_olivetti_faces
from sklearn import decomposition
 
 
n_row, n_col = 2, 3
n_components = n_row * n_col
image_shape = (64, 64)
 
 
###############################################################################
# Load faces data
dataset = fetch_olivetti_faces(shuffle=True, random_state=RandomState(0))
faces = dataset.data
 
###############################################################################
def plot_gallery(title, images, n_col=n_col, n_row=n_row):
    plt.figure(figsize=(2. * n_col, 2.26 * n_row)) 
    plt.suptitle(title, size=16)
 
    for i, comp in enumerate(images):
        plt.subplot(n_row, n_col, i + 1)
        vmax = max(comp.max(), -comp.min())
 
        plt.imshow(comp.reshape(image_shape), cmap=plt.cm.gray,
                   interpolation='nearest', vmin=-vmax, vmax=vmax)
        plt.xticks(())
        plt.yticks(())
    plt.subplots_adjust(0.01, 0.05, 0.99, 0.94, 0.04, 0.)
 
     
plot_gallery("First centered Olivetti faces", faces[:n_components])
###############################################################################
 
estimators = [
    ('Eigenfaces - PCA using randomized SVD',
         decomposition.PCA(n_components=6,whiten=True)),
 
    ('Non-negative components - NMF',
         decomposition.NMF(n_components=6, init='nndsvda', tol=5e-3))
]
 
###############################################################################
 
for name, estimator in estimators:
    print("Extracting the top %d %s..." % (n_components, name))
    print(faces.shape)
    estimator.fit(faces)
    components_ = estimator.components_
    plot_gallery(name, components_[:n_components])
 
plt.show()

四、图像分割

图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分成若 干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区 域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域 提取出来用于不同的研究。 图像分割技术已在实际生活中得到广泛的应用。例如:在机车检验领域, 可以应用到轮毂裂纹图像的分割,及时发现裂纹,保证行车安全;在生物医 学工程方面,对肝脏CT图像进行分割,为临床治疗和病理学研究提供帮助

图像分割常用方法:

  1. 阈值分割:对图像灰度值进行度量,设置不同类别的阈值,达到分割的目的。
  2. 边缘分割:对图像边缘进行检测,即检测图像中灰度值发生跳变的地方,则为一片 区域的边缘。
  3. 直方图法:对图像的颜色建立直方图,而直方图的波峰波谷能够表示一块区域的颜 色值的范围,来达到分割的目的。
  4. 特定理论:基于聚类分析、小波变换等理论完成图像分割。

实例描述

目标:利用K-means聚类算法对图像像素点颜色进行聚类实现简单的图像分割

输出:同一聚类中的点使用相同颜色标记,不同聚类颜色不同

技术路线:sklearn.cluster.KMeans

实例数据:本实例中的数据可以是任意大 小的图片,为了使效果更佳直观, 可以采用区分度比较明显的图片。

实验分析

通过设置不同的k值,能够得到不同的聚类结果。同时,k值的不确定也 是Kmeans算法的一个缺点。往往为了达到好的实验结果,需要进行多次尝 试才能够选取最优的k值。而像层次聚类的算法,就无需指定k值,只要给 定限制条件,就能自动地得到类别数k。

import numpy as np
import PIL.Image as image  #加载PIL包,用于加载创建图片
from sklearn.cluster import KMeans
 
def loadData(filePath):
    f = open(filePath,'rb')
    data = []
    img = image.open(f)
    m,n = img.size
    for i in range(m):
        for j in range(n):
            x,y,z = img.getpixel((i,j))
            data.append([x/256.0,y/256.0,z/256.0])
    f.close()
    return np.mat(data),m,n
 
imgData,row,col = loadData('kmeans/bull.jpg')
label = KMeans(n_clusters=4).fit_predict(imgData)
 
label = label.reshape([row,col])
pic_new = image.new("L", (row, col))
for i in range(row):
    for j in range(col):
        pic_new.putpixel((i,j), int(256/(label[i][j]+1)))
pic_new.save("result-bull-4.jpg", "JPEG")

参考资料

北京理工大学 礼欣 www.python123.org

这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn