1. 非监督学习
在大多数情况下,从现实世界获取的数据并没有标记,也就不能告诉你正确答案
因此非监督学习很重要
image.png
观察上面的图,可以认为数据中有簇或者聚类,如果我们能够辨别出这些簇或者聚类,则可能对未知的新数据点产生认识,并预测其附近数据点可能具有的特点
降维dimensionality reduction
可将二维平面降低为一维的线
在非监督学习中,数据没有标签,但能发现其结构
2. 聚类电影
image.png3. 多少个聚类?
最基本也是目前最常用的聚类算法:
K-Means k-均值
簇中心是我们找到的来表征数据的区域
image.png
4. 将点与聚类匹配
在K-Means中,首先画出聚类中心
然后两步:
- 分配
- 优化
练习:
对于center 1 ,选出距离center 1 比center 2更近的红色点
解法:
在两个集群中心间画一条线,然后画出这条线的等距垂直线,该垂线把红点分成了两部分,上面是距离center 1 更近的点,下面是距离center 2更近的点
image.png
5. 优化中心(橡皮筋)
分配:
上面的四个点对应于上面的聚类中心
下面的三个点对应于下面的聚类中心
优化:
将聚类中心到这些点的总二次距离最小化,这时需要移动聚类中心,使蓝色线条的总长度最短
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个测试点的聚类变了
-
□ 是的,有很多测试点的聚类变了
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]。这是我们所做的唯一更改。
在下一课中,你将详细了解特征缩放的含义,但现在,只需查看对聚类产生的影响--哪个/哪些点会切换它们关联的聚类?
特征缩放化之后,哪些数据点改变了聚类?
将此绘图与迷你项目开始时获取的绘图(对只两个特征进行聚类)进行比较以回答此问题。
网友评论