机器学习(十一):K-Means算法

1. K-Means

1.1 核函数的另一种观点

之前我们提到过高斯核函数:

K(x1,x2)=ϕ(x1)ϕ(x2)=exp(η||x1x2||2)
当时我们是把 ϕ(x) 当做对x进行无限维的特征转换。
其实根据高斯函数的形状,我们可以将其视为:对 x1,x2 相似性的度量/距离的度量。
那么这样再来看SVM的话:
gSVM=sign(SVαnynexp(η||xxn||2)+b)
那么我们重新解决SVM,如果 x,xn 相似度很高,那么 αnexp(η||xxn||2) 就会很多,从而导致x的类别与 yn 的相似度更高。这符合我们的直觉和常理。
高斯核函数又叫Radial Basis Function (RBF) kernel,
h(x)=Output(i=1nβiRBF(x,u(i))+b)

上述这种形式的函数称为RBF network。
这里写图片描述
RBF network中有组参数需要确定:centers μ 和votes β

1.2 Full RBF Network

cnters的个数等于训练集数据的个数;而且每个 μ(i)=x(i) ,这时候的RBF网络就叫做Full RBF网络。

1.2.1 K近邻算法

βm=y(m) ,且

h(x)=sign(i=1my(i)exp(η||xx(i)||2))
这是什么意思呢?如果我们不是来Aggregation而是selection,选择与x相似度最高的那个 x(m) ,令 h(x)=y(m) 那么,这就是最近邻算法。如果是选择与x相似度最高的k个 x(i) ,将这k个 y(i) Aggregation,那么就是K近邻算法。

1.2.2 Full RBF网络的含义

如果仅仅令

h(x)=i=1mβiRBF(x,x(i))
使用二次代价函数来训练模型,很自然地,此模型相当于是linear regression模型,其中对于输入x,先做特征转换:
z=ϕ(x)=(RBF(x,x(1)),...,RBF(x,x(m)))T
然后使用二次代价函数训练 h(x)=βTz ,这是一个linear regression问题,令
β=(ZTZ)1ZTy
如果训练集中所有的x都不同,那么Z是可逆的,有 β=Z1y .
如果Z可逆,那么必然有 Ein(h)=0 ,很容易过拟合。怎么办呢?正则化即可。
β=(ZTZ+λI)1ZTy

要解决Full RBF的过拟合问题,也可以减小centers的个数,譬如SVM。

1.3 K-Means 算法

1.3.1 K-Means算法原理

K-Means算法的主要作用是聚类分析。给定一组数据,我们能把它们如何分组?
这里写图片描述
那么如何分组呢?假设我有一组数据,要分成K个cluster,其中每一个cluster的中心点为 μk ,那么x应该输入哪个cluster?
我们采用如下符号:
这里写图片描述
因为这里有两组变量;且 c(i) :将数据分到某个cluster是一个组合问题,所以非常难以最优化。我们采用alternating optimization的形式:

  1. 首先固定 c(i) ,最优化 μk ;
  2. 然后固定 μk ,最优化 c(i)

很明显当 c(i) 固定之后,那么 μk 就是k cluster中所有数据的均值。
μk 固定之后,数据x当然要分到离它最近的 μk 所代表的第k个cluster。

这里写图片描述
循环什么时候结束?等到 c(i) 不会再变化为止。

1.3.2 如何初始化 μk

首先是选择一个K——究竟分成多少个cluster合适?
很多情况下,根绝我们的目的来分类,譬如根据人的身高和体重分成衣服尺码:有多少个尺码是已经提前确定好的:
这里写图片描述

否则的话,可以根据“拐点”来判断:
这里写图片描述
画出代价函数随着k的变化图,如果存在一个“拐点K”:当 k<K 时,代价函数下降非常快;当 k>K 时,代价函数下降速度变慢,则选择拐点作为cluster的个数。当然很多情况下,并不会有如此清晰的拐点。

当选定了K之后,如何选定 μk 呢?
从训练集中随机选择K个数据作为 muk ,这种方法非常容易导致局部最优化,严重依赖于 muk 初始值的选取:
这里写图片描述

1.4 RBF网络与K-Means的关系

之前我们提到过,减小中心点的数量,可以减小RBF网络的过拟合情况。那么如何减小中心点数量?使用K-Means算法。此处的K-Means算法的功能就像之前自动编码器的功能一样:
这里写图片描述

2. 异常检测

2.1 异常检测原理

如何检测出异常的数据?
其实Anomaly detection与 density estimation一脉相承。
我们建立一个概率模型 p(x) 来表示数据出现的概率(拟合的是数据的概率模型),如果 p(x)<ϵ ,那么这个数据x就是异常的。
我们假设x的每一个维度 xi 都服从高斯分布且相互独立,那么:
这里写图片描述

有了这个算法,我们如何知道它的表现良不良好?必然要使用带标签的数据对其性能进行评估:
(注意:其训练数据是无标签的)
这里写图片描述

一个自然而言产生的问题是:为什么不用监督式算法?为什么不用分类算法?
我们可以从算法的名字可见一斑:异常检测——就是这种情况出现的比较少,不足以作为一个类别。
这里写图片描述
可以看出,当异常类别的数据量比较少时;监督算法不足以学习出“什么样的输入特征下是异常情况”时,应当用异常检测算法。

2.2 上述算法的两个问题

上述算法依赖于假设:x每个输入特征维度都是高斯分布且相互独立。

2.2.1 不是高斯分布的情况

这时候我们需要对特征做一些处理:
这里写图片描述

当我们发现:算法效果不好的时候,需要使用error analysis寻找新的特征:
这里写图片描述

2.2.2 不是相互独立的时候

很明显这一假设是不合理的,这会导致如下情况:
这里写图片描述
无法准确拟合上述情况。

由此,我们引入多维高斯分布:
这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/wangyanphp/article/details/54957438