Deep KNN for Medical Image Classification
医学诊断通常需要大量的数据支撑,然而一般只有部分疾病拥有大量的数据。数据量过少限制了大多数神经网络在医学诊断方面的使用。面对小数据集,KNN是一个不错的方法。但是传统KNN中,分类器和特征提取器是分离的,这导致了KNN无法提取出具有针对性的特征。本文提出了一种改良的KNN——deep KNN,将分类器和特征提取器联合起来。
如图所示的数据分布,实心圆、空心圆和叉叉分别表示不同的分类。由于分类在特征空间中存在交叉是很正常的,因此对于一个数据来说,其近邻可能并不来自同一分类。
经过第t-1次迭代后,对于样本
x
i
x_i
xi,通过KNN找到的K个同类的近邻表示为
y
k
t
,
i
,
k
=
1
,
.
.
.
,
K
{y_k^{t,i},k=1,...,K}
ykt,i,k=1,...,K,找到M个不同类的近邻表示为
z
k
t
,
i
,
k
=
1
,
.
.
.
,
M
{z_k^{t,i},k=1,...,M}
zkt,i,k=1,...,M,则应满足下式
对于任一样本,该样本与其任一同类近邻的距离应该小于该样本与其任一不同类近邻的距离。
α
α
α是一个正常数。根据该式,得到损失函数为
其中
[
d
]
+
=
m
a
x
(
0
,
d
)
[d]_+=max(0,d)
[d]+=max(0,d),只要上述不等式恰好满足,损失函数值就为0;样本与其任一同类近邻的距离越大,损失函数的值就越大。对于N个训练样本,有
每一次迭代。更新了特征提取器后,就需要重新寻找每一个样本的K同分类近邻和M不同分类近邻。
类似于DNN,可以用stochastic gradient descent (SGD)对训练进行加速。但每一次迭代都需要将重新寻找所有样本的KNN和MNN,开销太大。每训练一次mini-batch的样本,就更新一次迭代器,然后对每一个样本,只在该mini-batch中寻找KNN和MNN。
传统的KNN思想是使得同一分类中任意两点的距离小于不同分组中任一两点的距离。Deep KNN的思想是任意一点和同分类K近邻的距离小于该点和不同分类M近邻的距离。
传统KNN的目的是使得各类数据的分布更加聚集,Deep KNN的目的是分离不同类的分布,使数据与其K近邻属于同一类,而不要求每一类的数据紧密地聚集。Deep KNN更容易训练。
deep KNN的结构如图
用CNN或DNN作为特征提取器,网络的输出是特征向量,代表输入图片。
CSDN-Ada助手: Python入门 技能树或许可以帮到你:https://edu.csdn.net/skill/python?utm_source=AI_act_python
你摇了我⑧: 这根本就不是同一篇文章吧 浪费时间