美文网首页Python机器学习
机器学习笔记 - 18. 聚类实践(讲师:邹博)

机器学习笔记 - 18. 聚类实践(讲师:邹博)

作者: blade_he | 来源:发表于2018-08-05 18:46 被阅读1次

    本次目标

    2018-07-23 19_54_56-【邹博_chinahadoop】机器学习升级版VII(七).png

    K-Means (K均值)

    2018-07-23 19_58_14-【邹博_chinahadoop】机器学习升级版VII(七).png

    Vector Quantization(矢量量化)

    2018-07-23 19_58_33-【邹博_chinahadoop】机器学习升级版VII(七).png

    传统模型

    2018-07-23 19_59_50-【邹博_chinahadoop】机器学习升级版VII(七).png

    传统图像分类

    2018-07-24 10_01_16-【邹博_chinahadoop】机器学习升级版VII(七).png 2018-08-05 18_51_36-【邹博_chinahadoop】机器学习升级版VII(七).png

    如图,下面三个样本的维度不同:
    第一个是20x144维
    第二个是10x144维
    第三个是15x144维
    因为维度不同,所以无法喂给Logistic回归(LR)。
    但是换一个思路,因为都是x144,所以可以将20,10,15看成各自独立的样本。每一张图片,看成是一个词袋,第一个袋子放了20个样本,第二个袋子放了10个样本,第三个袋子放了15个样本。
    然后对于这45个样本,做一个聚类。
    如中间部分,做了5种聚类,即5个簇。(K=5)
    然后观察三张图片各自样本,落在这5个簇的聚类情况。
    即特征变成了5维的向量。
    即各个图片,在分类器看来,就是长度为5的列向量。
    然后将列向量横过来,就形成3行(3张图片)五列的数据,如此即可将其喂给SVM或者随机森林都是可以的。
    当然也可以映射为1000个数的向量,即变成3x1000。
    无论是映射成5个还是1000个,其实都比原始维度要低的多。即通过聚类,达到降维的目的。
    而中间这一步(即聚类),是一个无监督的学习。可以看做对144维向量,映射到某一个数字上去。对Vector做了量化,即矢量量化,即VQ。

    2018-08-05 19_02_48-【邹博_chinahadoop】机器学习升级版VII(七).png

    然后回过头来看Vector Quantization这张ppt,
    任何一张图片可以看成RGB三通道的彩色图像,任何一个像素点是三维的一个数字,换句话说,任何一个像素点其实是一个向量。
    假定是800x600的图片,有48万个向量,将这项矢量做聚类,用簇的中心代替原始的像素。即可以用调色板,将图像压缩了。


    2018-08-05 19_17_14-【邹博_chinahadoop】机器学习升级版VII(七).png

    课堂问答

    问:图像有噪声会有影响么?
    答: 应该有影响,但这个影响,有些时候可以自适应。比如图像偏红,其中有一片是绿色的,作为噪声。如果将噪声作为一个簇,则问题不大。但是椒盐噪声,而且颜色随机,会影响很大。不过椒盐噪声,如果颜色一致,则会聚类,影响就不会很大。

    问:聚类跟PCA类似么?
    答:不类似。

    问:聚类主要用在哪?
    答:一般不会把聚类作为主算法。比如用卷积网络,识别物体,有可能把聚类当成中间环节,对数据做变换。此时聚类会产生价值。比如预处理,中间预处理,或者后处理的一个步骤。完善整个环节中的其中一环。聚类可以帮助选择特征。

    问:聚类可以达到降维的目的?
    答:是的

    问:如果是RGB,是RGB一起聚类,还是RGB各自聚类?
    答:是一起聚类。

    问:如果是多张图片,是一起聚类,还是各自聚类?
    答:多张图片,也是一起聚类,一起做特征。

    问:选特征与VQ是什么关系呢?
    答:我们是利用VQ来最终选特征,选出来这1000个数(特征)。

    问:在应用中,具体如何选择使用Kmeans最大密度聚类,谱聚类,DBScan哪个算法?需要逐个尝试么?
    答:如果数据量特别大,只能选Kmeans;
    如果数据量不是特别大,可以选密度最大聚类,或DBSCAN。
    如果数据量中等或偏小,可使用谱聚类试一试。因为谱聚类不会过分探讨特征距离是怎么来的。

    问:图像压缩是不是把图像所有的颜色压缩到100种颜色中去?
    答:是的

    问:可否理解为处理后的结果就是把占据图像主要色彩的部分给留下来?
    答:不是。我们是把所有的像素给替换了。

    问:聚类之后的操作是干什么?
    答:之后的操作,可能是做SVM, Logisitc回归,或者将特征喂给卷积网络。具体问题具体处理。

    问:能用聚类做二值化么?
    答:当然能。比如可以选择黑白图像做二值化。

    问:把图像变成字符的图像,是不是也可以用VQ?


    2018-08-05 19_43_18-【邹博_chinahadoop】机器学习升级版VII(七).png

    答:先用VQ,倒是有可能。

    问:聚类可以用于一致性问题么?就是把所有点演化成最终汇聚到一个点上?
    答:这个取决于应用场景。

    AP聚类

    2018-08-05 19_12_38-【邹博_chinahadoop】机器学习升级版VII(七).png

    时间复杂度太高,计算速度慢一些,只能适用于中小型数据。
    调参还好。

    MeanShift

    把均值做移动,然后生成下面的结果


    2018-08-05 19_46_40-【邹博_chinahadoop】机器学习升级版VII(七)png.png

    密度聚类

    参数有ε, m以及聚类数目。


    2018-08-05 19_47_44-【邹博_chinahadoop】机器学习升级版VII(七).png

    谱聚类

    参数为给出相似度的值,实际上就是标准差。

    2018-08-05 19_49_15-【邹博_chinahadoop】机器学习升级版VII(七).png

    用处,在于做分隔:


    2018-08-05 19_50_23-【邹博_chinahadoop】机器学习升级版VII(七).png

    代码解析

    视频对应的代码:链接:https://pan.baidu.com/s/1LOeY5sWr7dyX-LBhSFI9WQ 密码:cipq
    参见:第十八课_代码.zip

    Kmeans

    # !/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import numpy as np
    import matplotlib.colors
    import matplotlib.pyplot as plt
    import sklearn.datasets as ds
    from sklearn.metrics import homogeneity_score, completeness_score, v_measure_score, adjusted_mutual_info_score,\
        adjusted_rand_score, silhouette_score
    from sklearn.cluster import KMeans
    
    
    def expand(a, b):
        d = (b - a) * 0.1
        return a-d, b+d
    
    
    if __name__ == "__main__":
        N = 400
        centers = 4
        data, y = ds.make_blobs(N, n_features=2, centers=centers, random_state=2)
        data2, y2 = ds.make_blobs(N, n_features=2, centers=centers, cluster_std=(1,2.5,0.5,2), random_state=2)
        data3 = np.vstack((data[y == 0][:], data[y == 1][:50], data[y == 2][:20], data[y == 3][:5]))
        y3 = np.array([0] * 100 + [1] * 50 + [2] * 20 + [3] * 5)
        m = np.array(((1, 1), (1, 3)))
        data_r = data.dot(m)
    
        matplotlib.rcParams['font.sans-serif'] = ['SimHei']
        matplotlib.rcParams['axes.unicode_minus'] = False
        cm = matplotlib.colors.ListedColormap(list('rgbm'))
        data_list = data, data, data_r, data_r, data2, data2, data3, data3
        y_list = y, y, y, y, y2, y2, y3, y3
        titles = '原始数据', 'KMeans++聚类', '旋转后数据', '旋转后KMeans++聚类',\
                 '方差不相等数据', '方差不相等KMeans++聚类', '数量不相等数据', '数量不相等KMeans++聚类'
    
        model = KMeans(n_clusters=4, init='k-means++', n_init=5)
        plt.figure(figsize=(8, 9), facecolor='w')
        for i, (x, y, title) in enumerate(zip(data_list, y_list, titles), start=1):
            plt.subplot(4, 2, i)
            plt.title(title)
            if i % 2 == 1:
                y_pred = y
            else:
                y_pred = model.fit_predict(x)
            print(i)
            print('Homogeneity:', homogeneity_score(y, y_pred))
            print('completeness:', completeness_score(y, y_pred))
            print('V measure:', v_measure_score(y, y_pred))
            print('AMI:', adjusted_mutual_info_score(y, y_pred))
            print('ARI:', adjusted_rand_score(y, y_pred))
            print('Silhouette:', silhouette_score(x, y_pred), '\n')
            plt.scatter(x[:, 0], x[:, 1], c=y_pred, s=30, cmap=cm, edgecolors='none')
            x1_min, x2_min = np.min(x, axis=0)
            x1_max, x2_max = np.max(x, axis=0)
            x1_min, x1_max = expand(x1_min, x1_max)
            x2_min, x2_max = expand(x2_min, x2_max)
            plt.xlim((x1_min, x1_max))
            plt.ylim((x2_min, x2_max))
            plt.grid(b=True, ls=':')
        plt.tight_layout(2, rect=(0, 0, 1, 0.97))
        plt.suptitle('数据分布对KMeans聚类的影响', fontsize=18)
        plt.show()
    

    结果如下:


    2018-08-05 19_54_52-Figure 1.png

    相关文章

      网友评论

        本文标题:机器学习笔记 - 18. 聚类实践(讲师:邹博)

        本文链接:https://www.haomeiwen.com/subject/gkxsmftx.html