监督学习之KNN算法

监督学习

原理

监督学习假定训练数据与真实预测数据属于同一分布且相互独立。监督学习通过训练学习到数据的概率分布,并应用到真实的预测上。监督学习可分为回归分析和分类。

回归分析(Regression Analysis):对训练数据进行分析,拟合出误差微小的函数模型 y = f ( x ) , y y=f(x),y y=f(x),y称为数据的标签,对于每个新的自变量 x , x, x,通过这个函数模型可以得到标签 y y y

分类(Classification):训练数据是特征向量与其对应的标签,同样要通过计算新的特征向量得到其所属的标签。

  1. 输入空间、特征空间和输出空间

    输入空间与输出空间可以相同,也可以不同,通常输出空间要远小于输入空间。每个具体输入称为一个实例(Instance),由特征向量(Feature Vector)表示。所有特征向量形成特征空间(Feature Space)。特征空间的每一维对应于一个特征。

    输入变量和输出变量均为连续变量的预测问题称为回归问题,输出变量为有限个离散变量的预测问题称为分类问题,输入变量与输出变量均为变量序列的预测问题称为标注问题。

  2. 遵循联合概率分布 P ( X , Y ) P(X,Y) P(X,Y)

    监督学习假设输入输出的随机变量 X , Y X,Y X,Y遵循联合概率分布 P ( X , Y ) P(X,Y) P(X,Y)。训练数据与测试数据被看作是依联合概率分布 P ( X , Y ) P(X,Y) P(X,Y)独立同分布的。

  3. 假设空间

    模型属于由输入空间到输出空间的映射集合,这个集合就是假设空间,意味着学习范围的确定即求解函数的一系列参数的决定,算法的作用就是找到参数向量。

KNN算法

定义及介绍

KNN算法又称K邻近分类(K-Nearest Neighbor Classification)算法,是根据不同特征值之间距离进行分类的机器学习方法。训练数据都是有标签的数据,即已经人工分类。KNN算法主要用于判断未知事物属于哪一类。它也可以用于回归,通过找出一个样本的 k k k个最近邻居,将这些邻居属性的平均值赋给该样本,就可以得到该样本的属性。

KNN的距离

X X X实例和 Y Y Y实例都包含了 N N N维特征即 X = ( x 1 , . . . , x n ) , Y = ( y 1 , . . . , y n ) X=(x_1,...,x_n),Y=(y_1,...,y_n) X=(x1,...,xn),Y=(y1,...,yn)。度量两者的差异主要分为距离度量相似度度量

距离度量(Distance)

借助几何空间距离概念,衡量实例的距离,距离越大,差别越大。

欧几里得距离(Euclidean Distance),简称欧氏距离,衡量多维空间各点之间的绝对距离。
d i s t ( X , Y ) = ∑ i = 1 n ( x i − y i ) 2 dist(X,Y)=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2} dist(X,Y)=i=1n(xiyi)2
标准化欧氏距离(Standardized Euclidean Distance),先将各个分量’‘标准化’’。假设样本集某一维度的均值为 u i u_i ui,标准差为 s i s_i si,则对应的标准化分布为标准正太分布:
x i ′ = x i − u i s i x_i^{'}=\frac{x_i-u_i}{s_i} xi=sixiui
注意,标注差为不同实例同一维度的标准差。

从而标准化欧氏距离为:
d = ∑ i = 1 n ( x i − y i ) 2 s i 2 d=\sqrt{\sum_{i=1}^n\frac{(x_i-y_i)^2}{s_i^2}} d=i=1nsi2(xiyi)2
明可夫斯基距离(Minkowski Distance),简称明氏距离,是欧氏距离的推广。
d i s t ( X , Y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p dist(X,Y)=(\sum_{i=1}^n|x_i-y_i|^p)^\frac{1}{p} dist(X,Y)=(i=1nxiyip)p1
曼哈顿距离(Manhattan Distance),是多维度上距离的求和,是 p = 1 p=1 p=1情况下的明氏距离。
d i s t ( X , Y ) = ∑ i = 1 n ∣ x i − y i ∣ dist(X,Y)=\sum_{i=1}^n|x_i-y_i| dist(X,Y)=i=1nxiyi
切比雪夫距离(Chebyshev Distance),是各坐标数值差的绝对值的最大值,是 p p p趋于无穷大的明氏距离。
d i s t ( X , Y ) = lim ⁡ p → ∞ ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p = m a x ∣ x i − y i ∣ dist(X,Y)=\lim_{p\rightarrow\infty}(\sum_{i=1}^n|x_i-y_i|^p)^\frac{1}{p}=max|x_i-y_i| dist(X,Y)=plim(i=1nxiyip)p1=maxxiyi
马哈拉诺比斯距离(Mahalanobis Distance),简称马氏距离,数据的协方差距离。不受量纲影响,是尺度无关的(scale-invariant)。设样本的协方差矩阵为 S S S,其马氏距离为:
D ( X , Y ) = ( X − Y ) T S − 1 ( X − Y ) D(X,Y)=\sqrt{(X-Y)^TS^{-1}(X-Y)} D(X,Y)=(XY)TS1(XY)
注意,马氏距离的计算是建立在总体样本的基础上的,也就是说,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同。在计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧式距离计算即可。

相似度度量(Similarity)

计算个体间的相似度,相似度越大差异越小。

向量空间余弦相似度(Cosine Similarity),用向量空间中的两个向量夹角的余弦值作为衡量个体间差异的大小。
s i m ( X , Y ) = c o s θ = X ⋅ Y ∣ X ∣ ⋅ ∣ Y ∣ sim(X,Y)=cos\theta=\frac{X\cdot Y}{|X|\cdot|Y|} sim(X,Y)=cosθ=XYXY
皮尔森相关系数(Pearson Correlation Coefficient),即相关分析中的相关系数 r r r,分别对 X , Y X,Y X,Y给予自身总体标准化后计算空间向量的余弦夹角。
r ( X , Y ) = n ∑ x y − ∑ x ∑ y n ∑ x 2 − ( ∑ x ) 2 ⋅ n ∑ y 2 − ( ∑ y ) 2 r(X,Y)=\frac{n\sum xy-\sum x\sum y}{\sqrt{n\sum x^2-(\sum x)^2}\cdot \sqrt{n\sum y^2-(\sum y)^2}} r(X,Y)=nx2(x)2 ny2(y)2 nxyxy
Jaccard相似系数(Jaccard Correlation Coefficient),主要用于计算符号度量或布尔值度量的个体间的相似度。因为个体的特征属性都是由符号度量或者布尔值标识的,因此只能获得“是否相同”的结果,所以Jaccard相似系数只关心特征值是否一致。
J a c c a r d ( X , Y ) = X ⋂ Y X ⋃ Y Jaccard(X,Y)=\frac{X\bigcap Y}{X\bigcup Y} Jaccard(X,Y)=XYXY

算法步骤
  • 计算测试数据与各个训练数据之间的距离
  • 按照距离从小到大排序
  • 选取距离最小的 k k k个点
  • 确定前 k k k个点所在类别的出现频率
  • 返回前 k k k个点中出现频率最高的类别作为测试数据的预测分类

KNN的距离和 k k k的选取直接决定算法的结果。

MATLAB伪代码实例
clc,clear;
trainData1=[0 0;0.1 0.3;0.2 0.1;0.2 0.2];%第一类训练数据
trainData2=[1 0;1.1 0.3;1.2 0.1;1.2 0.2];%第二类训练数据
trainData3=[0 1;0.1 1.3;0.2 1.1;0.2 1.2];%第三类训练数据
trainData(:,:,1)=trainData1;%设置第一类测试数据
trainData(:,:,2)=trainData2;%设置第二类测试数据
trainData(:,:,3)=trainData3;%设置第三类测试数据
trainDim=size(trainData);%获取训练集的维数
testData=[1.6 0.3];%设置1个测试点
k=7;
testData_rep=repmat(testData,trainDim(1),1);
diff1=(trainData(:,:,1)-testData_rep).^2;%diff存放的是测试点与训练数据的距离的平方,如diff1(:,1)存放测试点与训练数据在第一维度上差的平方
diff2=(trainData(:,:,2)-testData_rep).^2;
diff3=(trainData(:,:,3)-testData_rep).^2;
distance1=(diff1(:,1)+diff1(:,2)).^0.5;
distance2=(diff2(:,1)+diff2(:,2)).^0.5;
distance3=(diff3(:,1)+diff3(:,2)).^0.5;
temp=[distance1 distance2 distance3];
distance=reshape(temp,1,3*trainDim(1));%转换为一维数组,此时1至4为测试点到第一类各点的距离
[distance,ind]=sort(distance,'ascend');
num1=0;num2=0;num3=0;
for i=1:k
	if ind(i)<5
		num1=num1+1;
	elseif ind(i)<9 
		num2=num2+1;
	else 
		num3=num3+1;
	end
end
[m,ind]=max([num1 num2 num3])

reference:https://blog.csdn.net/queyuze/article/details/70195087

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值