K K K近邻算法
一、 K K K近邻算法的优势
寻常对分类器会将全部的数据都记下来,把当前的测试对象和某个训练对象的属性进行比较,当完全匹配时就可以进行分类。但是这样有很大的问题:有的测试对象可能与任何的训练对象都不匹配,同时也有可能发生一个测试对象与若干个训练对象的类别标记都匹配,这样就无法很好的实现分类问题。
而
K
N
N
KNN
KNN算法是从训练集中找出
K
K
K个最接近测试对象的训练对象,再从这
K
K
K个训练对象中找到居于主导地位的类别,然后将其赋给测试对象。
二、 K K K近邻算法的关键
(1)用于决策的已经被标记的对象集合
(2)用于计算对象之间临近程度的距离或者类似的相似性指标
(3)最近邻的个数
K
K
K
(4)基于
K
K
K个最近邻及其类别来判定目标对象类别的方法
K
N
N
KNN
KNN也是一种惰性的学习方法,也就是说直到预测阶段时才会去处理训练数据。
三、K近邻算法算法描述
———————————————————————————————————
输入:
D
D
D是训练集;
z
z
z是待测试对象(是由属性值构成的向量);
L
L
L,是对象的类别标签集合
输出:
c
z
∈
L
c_z\in{L}
cz∈L,即
z
z
z的类别
foreach
y
∈
D
y\in{D}
y∈D do
计算
d
(
y
,
z
)
d(y,z)
d(y,z),即
y
y
y和
z
z
z的距离;
end
从数据集
D
D
D中选出子集
N
N
N,其中
N
N
N包含
K
K
K个距离
z
z
z最近的训练对象
c
z
=
a
r
g
m
a
x
v
∈
L
∑
y
∈
N
I
(
v
=
c
l
a
s
s
(
c
y
)
)
c_z={argmax}_{v\in{L}}\sum_{y\in{N}}\mathbb{I}(v=class(c_y))
cz=argmaxv∈Ly∈N∑I(v=class(cy))
其中,
I
(
.
)
\mathbb{I}(.)
I(.)是一个指示函数,当内部的表达式取值为
T
r
u
e
True
True就返回值为
1
1
1,否则返回
0
0
0.
———————————————————————————————————
四、KNN的距离度量方式
这里的距离度量方式也是一个重要的因素,通常会使用欧氏距离或者曼哈顿距离
对于给定的具有
n
n
n个属性的两点
x
x
x和
y
y
y,欧式距离和曼哈顿距离公式如下:
欧氏距离:
d
(
x
,
y
)
=
∑
k
=
1
n
(
x
k
−
y
k
)
2
d(x,y)=\sqrt{\sum_{k=1}^{n}(x_k-y_k)^2}
d(x,y)=k=1∑n(xk−yk)2
曼哈顿距离:
d
(
x
,
y
)
=
∑
k
=
1
n
∣
x
k
−
y
k
∣
d(x,y)=\sqrt{\sum_{k=1}^{n}\vert{x_k-y_k\vert}}
d(x,y)=k=1∑n∣xk−yk∣
下图是分别给出不同尺度的
K
K
K进行最近邻分类:
这样看来,算法
K
K
K值的大小对分类结果有着重大的影响。当选择的
K
K
K值较小的情况下,就相当于用较小的邻域中的训练实例进行预测,只有当与输入实例较近的训练实例才会对预测结果起作用。但与此同时预测结果会对实例点非常敏感,分类器抗噪能力较差,因而容易产生过拟合,所以一般而言
K
K
K值的选择不宜过小。但如果选择较大的
K
K
K值,就相当于在用较大邻域中的训练实例进行预测,但相应的分类误差也会增大,模型整体变得简单,会产生一定程度的欠拟合。所以一般而言,我们需要采用交叉验证的方式来选择合适的
K
K
K值。