聚类

作者: 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