Andrew NgML第十四章无监督学习

1.无监督学习概述

 图1.无监督学习

 有监督学习中,数据是有标签的,而无监督学习中的训练集是没有标签的,比如聚类算法。

 2.k-means算法

k-means算法应用是十分广泛的聚类方法,它包括两个过程,首先是选取聚类中心,然后遍历每一个点,决定其属于哪个类;第二步是移动聚类中心点,根据刚才的聚类情况将聚类中心点移动,下面三个图很好地说明了这个过程:

 

图2.初始化,并且计算距离。

图3.计算距离后

 

图4.根据最小化均方误差移动聚类中心点

 根据新的聚类中心点,再次重复这个过程,

图5.迭代之后最终结果

 迭代之后最终结果,就算再运行k-means聚类算法,聚类中心点也不会改变了,

图6.k-means算法输入

 输入包括k,之后会讲解如何选择k,训练集,x(i)是n维的,不是n+1维,通常舍去x_0=1项。

图7.k-means算法过程

 K是指一共分为几簇,k是指每个聚类中心。

首先随机初始化k各聚类中心点,循环以下过程:

1.将m个样本点遍历,分到k个聚类中心中;

2.根据各个簇中的点到聚类中心点的距离并取均值。

对于聚类结果中,没有点的簇,通常是直接删去,那么K就变成了K-1簇。

3.优化目标

图8.k-means优化目标

就是最小化代价函数,也叫失真代价函数。优化目标就是使点到聚类中心的平均距离最小。

4.随机初始化

这节会讲如何避开局部最优。

图9.局部最优化情况

 如图就是局部最优化情况,两个类被分成了一个簇,一个簇被分开成了两份,这是不好的,是因为聚类中心店的初始化的问题。解决办法就是初始化多次,并且运行多次k-means聚类算法,得到结果,保证得到一个足够好的结果。

图10.运行局部最优化算法

 随机初始化,重复k-means算法100次,通常是在50-1000之间,运行结束后,选取一个失真函数最小的聚类结果。

随机初始化的情况,适用于K在2-10之间,多次随机初始化会比较好的得到正确的聚类结果,但是当不在此区间内,聚类结果并不会有很大的改善,K很大时一次聚类结果即可。

5.选择簇的数量

目前来说,还都是通过可视化的方法手动选择的。

图11.如何选择聚类K的值

 选择K个聚类的值,并以损失函数为纵轴来判断,肘形函数,但是有时会像有部,是平滑的,也不好确定最终分为几类,所以这个肘形曲线并不能成为好的判断方法。

但是最终的应用结果会告诉你应该分为几类。

2020-4-13更新————————

1.k-means继续学习

看了上面之前的笔记,就发现,学习还停留在概念上面,没有具体的数学公式和实现代码,这就比较飘了。

https://blog.csdn.net/huangfei711/article/details/78480078 这个讲的还是挺通俗易懂的,原来在计算过程中会出现虚拟的中心点啊,直到分类结果没有什么变化就认为是收敛了。

首先随机选取K个点,然后计算所有其他点到这两个点的距离,根据小的确定分类,然后在各个类中再选出中心点,计算中心点是通过x/y轴的均值计算出一个可能是虚拟的点的坐标(重心),计算所有距离将点再分类,然后这样循环下去。

https://blog.csdn.net/sinat_26917383/article/details/70240628,给出了使用sklearn实现的例子:

import numpy as np
from sklearn.cluster import KMeans
data = np.random.rand(100, 3) #生成一个随机数据,样本大小为100, 特征数为3

#假如我要构造一个聚类数为3的聚类器
estimator = KMeans(n_clusters=3)#构造聚类器
estimator.fit(data)#聚类
label_pred = estimator.labels_ #获取聚类标签
centroids = estimator.cluster_centers_ #获取聚类中心
inertia = estimator.inertia_ # 获取聚类准则的总和

#输出:
>>> centroids
array([[0.42927216, 0.57043035, 0.19739574],
       [0.76233694, 0.46150249, 0.69253087],
       [0.25571954, 0.41477208, 0.79997927]])
>>> inertia
13.015626730491624
原文地址:https://www.cnblogs.com/BlueBlueSea/p/9447180.html