聚类

作者: esskeetit | 来源:发表于2018-03-15 21:26 被阅读0次

    1. 非监督学习

    在大多数情况下,从现实世界获取的数据并没有标记,也就不能告诉你正确答案
    因此非监督学习很重要


    image.png

    观察上面的图,可以认为数据中有簇或者聚类,如果我们能够辨别出这些簇或者聚类,则可能对未知的新数据点产生认识,并预测其附近数据点可能具有的特点

    降维dimensionality reduction
    可将二维平面降低为一维的线

    在非监督学习中,数据没有标签,但能发现其结构

    2. 聚类电影

    image.png

    3. 多少个聚类?

    最基本也是目前最常用的聚类算法:
    K-Means k-均值
    簇中心是我们找到的来表征数据的区域


    image.png

    4. 将点与聚类匹配

    在K-Means中,首先画出聚类中心
    然后两步:

    • 分配
    • 优化

    练习:
    对于center 1 ,选出距离center 1 比center 2更近的红色点
    解法:
    在两个集群中心间画一条线,然后画出这条线的等距垂直线,该垂线把红点分成了两部分,上面是距离center 1 更近的点,下面是距离center 2更近的点


    image.png

    5. 优化中心(橡皮筋)

    分配:
    上面的四个点对应于上面的聚类中心
    下面的三个点对应于下面的聚类中心

    image.png

    优化:
    将聚类中心到这些点的总二次距离最小化,这时需要移动聚类中心,使蓝色线条的总长度最短

    k-means的核心就是将聚类中心通过不断的迭代移动到正确的位置

    9. K-均值聚类可视化

    可在此处亲自尝试 K-均值聚类:http://www.naftaliharris.com/blog/visualizing-k-means-clustering/

    11. K-均值聚类可视化 3

    对于uniform points ,矩心初始放置的位置通常比较随机,但是也很重要
    因此根据某一确定的初始状况,最终可以使聚类的结果看起来完全不同

    12. Sklearn

    确定要尝试的聚类数是使用K-means时最具挑战性的工作之一

    算法过程:
    选择矩心,将点分配到矩心,调整矩心(循环)

    sklearn.cluster.KMeans(n_clusters=8, 
    init=’k-means++’,
    n_init=10,   #算法初始化的次数,即提出聚类的次数
    max_iter=300, 
    tol=0.0001, 
    precompute_distances='auto’,
    verbose=0, 
    random_state=None, 
    copy_x=True, 
    n_jobs=1, 
    algorithm=’auto’)
    

    本课讲了以下三个参数

    • n_clusters :
      int, optional, default: 8
      The number of clusters to form as well as the number of centroids to generate.

    • n_init :
      int, default: 10
      Number of time the k-means algorithm will be run with different centroid seeds. The final results will be the best output of n_init consecutive runs in terms of inertia.

    • max_iter :
      int, default: 300
      Maximum number of iterations of the k-means algorithm for a single run.

    14. K-均值的局限

    对于一个固定的数据集,一个固定的簇中心,在运行k-means算法时,是否总会得到相同的结果?

    K-means是所谓的爬山算法,它非常依赖于你的初始聚类中心所处的位置

    15. 反直觉的聚类

    根据你对k-means的了解,是否可能存在这样一种情况,即所有的数据点被分成如下图所示的两种聚类


    image.png

    如果你有越多的聚类中心,就能找到越多的局部最小解

    17. 聚类迷你项目视频

    下一课讲解特征缩放,特征缩放以某种方式对特征进行预处理,在执行特征缩放后,它实际上会改变聚类算法的输出,因此需要了解诸如特征缩放的操作的风险

    18.K-均值聚类迷你项目

    在此项目中,我们会将 k-均值聚类应用于安然财务数据。当然,我们最终的目标是识别相关人员;既然我们有了已标记数据,调用 k-均值聚类这种非监督式方法就不成问题。
    尽管如此,在此项目中,你仍然会获得 k-均值的一些实际操作经验并尝试特征缩放,这会让你预先了解下一课的材料。

    19. 聚类特征

    salary
    exercised_stock_options

    20. 部署聚类

    在 financial_features 数据上部署 k-均值聚类,并将 2 个聚类指定为参数。将聚类预测存储到名为 pred 的列表,以便脚本底部的 Draw() 命令正常工作。在弹出的散点图中,聚类是否是你预期的?

    feature_1 = "salary"
    feature_2 = "exercised_stock_options"
    poi  = "poi"
    features_list = [poi, feature_1, feature_2]
    data = featureFormat(data_dict, features_list )
    poi, finance_features = targetFeatureSplit( data )
    
    for f1, f2 in finance_features:
        plt.scatter( f1, f2 )
    plt.show()
    
    from sklearn.cluster import KMeans
    clf = KMeans(n_clusters=2)
    pred = clf.fit_predict(finance_features)
    

    21. 使用 3 个特征聚类

    向特征列表(features_list)中添加第三个特征:“total_payments”。现在使用 3 个,而不是 2 个输入特征重新运行聚类(很明显,我们仍然可以只显示原来的 2 个维度)。将聚类绘图与使用 2 个输入特征获取的绘图进行比较。是否有任何点切换群集?多少个点?这种使用 3 个牲的新聚类无法通过肉眼加以猜测——必须通过 k-均值算法才能识别它。

    (你需要更改创建散点图的代码,以便容纳 3 个特征而不是 2 个,有关操作说明,请参阅初始代码中的注释。)

    当你加入一些新的特征时,有测试点移动到不同的聚类中吗?

    • □ 没有,所有聚类都没变

    • □ 是的,有4个测试点的聚类变了

    • □ 是的,有7个测试点的聚类变了

    • □ 是的,有很多测试点的聚类变了

    image.png image.png
    feature_1 = "salary"
    feature_2 = "exercised_stock_options"
    feature_3 = "total_payments"
    poi  = "poi"
    features_list = [poi, feature_1, feature_2,feature_3]
    data = featureFormat(data_dict, features_list )
    poi, finance_features = targetFeatureSplit( data )
    
    for f1, f2,_ in finance_features:
        plt.scatter( f1, f2 )
    plt.show()
    
    ### cluster here; create predictions of the cluster labels
    ### for the data and store them to a list called pred
    
    from sklearn.cluster import KMeans
    clf = KMeans(n_clusters=2)
    pred = clf.fit_predict(finance_features)
    

    22. 股票期权范围

    在下一课中,我们将讨论特征缩放。它是一种特征预处理,应在执行某些分类和回归任务之前执行。这里只是快速预览,概述特征缩放的功能。

    本例中使用的“exercised_stock_options”特征取的最大值和最小值是什么?

    (注意:如果查看 finance_features,会发现有些“NaN”值已被清理并被零值取代——因此尽管那些值可能看起来像是最小值,但却具有欺骗性,因此它们更像是你不具有其相关信息而必须填入一个数字的点。对于此问题,请返回 data_dict 并查找显示的最大值和最小值,忽略所有“NaN”条目。)

    通过观察数据列表,“exercised_stock_options”的最大值和最小值分别是多少呢?(忽略“NaN”)

    data_dict = pickle.load( open("../final_project/final_project_dataset.pkl", "r") )
    data_dict.pop("TOTAL", 0)
    
    def find_max_and_min_est(data_dict):
        eso_list = []
        for i in data_dict:
            stock = data_dict[i]['exercised_stock_options']
            if stock !='NaN':
                eso_list.append(stock)
        print "max_stock_options",max(eso_list)      #34348384
        print "min_stock_options",min(eso_list)    #3285
    
    find_max_and_min_est(data_dict)
    

    23. 薪酬范围

    薪酬范围
    “salary”取的最大值和最小值是什么?
    (注意:与上一个测试题中的注意事项相同。如果查看 finance_features,会发现有些“NaN”值已被清理并被零值取代——因此尽管那些值可能看起来像是最小值,但却具有欺骗性,因此它们更像是你不具有其相关信息而必须填入一个数字的点。对于此问题,请返回 data_dict 并查找显示的最大值和最小值,忽略所有“NaN”条目。)

    def find_max_and_min_salary(data_dict):
        salary_list = []
        for i in data_dict:
            salary = data_dict[i]['salary']
            if salary !='NaN':
                salary_list.append(salary)
        print "max_stock_salary",max(salary_list)  #1111258
        print "min_stock_salary",min(salary_list)   #477
    find_max_and_min_salary(data_dict)
    

    24. 聚类更改

    旧图:


    image.png

    新图:


    image.png

    下一张幻灯片上的绘图会显示你刚刚编写的聚类代码,但在本例中,我们在执行聚类之前应用了特征缩放。

    我们希望你将(下一张幻灯片上)使用缩放的聚类与在聚类算法中使用*两个特征时生成的第一个聚类可视化效果进行比较。

    请注意,特征范围现在已更改为 [0.0, 1.0]。这是我们所做的唯一更改。

    在下一课中,你将详细了解特征缩放的含义,但现在,只需查看对聚类产生的影响--哪个/哪些点会切换它们关联的聚类?

    特征缩放化之后,哪些数据点改变了聚类?

    将此绘图与迷你项目开始时获取的绘图(对只两个特征进行聚类)进行比较以回答此问题。

    相关文章

      网友评论

          本文标题:聚类

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