学习张敏灵老师的《ML-kNN: a lazy learning approach to multi-label learning》的学习笔记。
传统kNN
k近邻算法(k-Nearest Neighbour, KNN)是机器学习中最基础,最简单的常用算法之一。其思想非常直接:如果一个样本在特征空间中的k个最相似(即特征空间中距离最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
如下图的
Xu
,它最近的邻居中属于
ω1
的最多,因此他被归类于
ω1
类。
这个思想很容易理解,就是俗话中常说的“近朱者赤,近墨者黑”。在单标签学习中,与一个实例在特征空间中越相近(即距离越近)的实例,他们之间标签相同的可能性就越大。
多标签kNN
而在多标签问题中,我们仍可根据这个思想推导出多标签学习的kNN算法,即ML-kNN算法。
多标签kNN的主要思想是对于每一个新实例(instance),距离它最近的k个实例(特征空间中与它的距离最小的k个实例)可以首先得到,然后得到这些实例的标签集合,之后通过最大后验概率准则来确定新实例的标签集合。
这里给出算法的具体数学计算方法:
变量定义:
k
为取最近邻个数
Y
为所有标签的集合,总标签个数可以定义为
n
l
为一个标签,
l∈Y
x
为一个实例
Yx
为实例
x
对应的标签集合,
Yx∈Y
y⃗ x
为
x
的标记向量,是一个
1×n
的行向量,它的元素
y⃗ x(l)
若为1,代表
l∈Yx
,若为0,则
l∉Yx
N(x)
记录
x
的
k
个最近邻的索引
然后,我们可以得到对应 k 近邻实例的标签信息:
这里, C⃗ x 是一个 1×n 的行向量,它的元素 C⃗ x(l) 指的是对于标签 l , x 的 k 个近邻中有多少个近邻拥有这个标签。
则,对于新的实例 t ,首先得到其 k 个近邻索引集合 N(t) ,定义事件 Hl1 为 t 有标签 l ,事件 Hl0 为 t 无标签 l ,定义事件 Elj ( j∈{0,1,⋯,k}) 为对于标签 l , k 个近邻中有 j 个包含这个标签。则基于向量 C⃗ t ,可以通过最大后验概率准则和贝叶斯准则得到:
其中, y⃗ t(l) 即为我们要求的结果,代表 t 实例是否有 l 标签。
其中
P(Hlb)
代表
t
是否有
l
标签的先验概率,可以用
l
标签在整个训练集上出现的次数除以标签总次数来求出。
即样本中拥有 l 标签的向量数目除以向量总数。
后验概率 P(ElC⃗ t(l)|Hlb) 计算方法为:
其中 c[j] 的 j 等于 C⃗ t(l) ,即 t 的 k 近邻中有标签 l 的个数。
c[] 的意思是:若 xn 的 k 近邻中有 l 标签的个数为 δ ,且 xn 有标签 l ,则 c[δ]+1 , n∈{1,2,…,m} 。
则 c[j] 代表的就是所有向量中,其 k 近邻有 j 个 l 标签,且其自身也有 l 标签的向量的个数。
由此, ∑kp=0c[p] 即为这个向量有 l 标签,其 k 近邻有 0∼m 个有 l 标签的情况的向量个数总和。
算出 P(Hlb)P(ElC⃗ t(l)|Hlb) 之后,我们只需看 b={0,1} 中哪种情况使得这个乘积值最大,若 b=1 时最大,则向量 t 有 l 标签,反之则没有。