监督学习
原理
监督学习假定训练数据与真实预测数据属于同一分布且相互独立。监督学习通过训练学习到数据的概率分布,并应用到真实的预测上。监督学习可分为回归分析和分类。
回归分析(Regression Analysis):对训练数据进行分析,拟合出误差微小的函数模型 y = f ( x ) , y y=f(x),y y=f(x),y称为数据的标签,对于每个新的自变量 x , x, x,通过这个函数模型可以得到标签 y y y。
分类(Classification):训练数据是特征向量与其对应的标签,同样要通过计算新的特征向量得到其所属的标签。
-
输入空间、特征空间和输出空间
输入空间与输出空间可以相同,也可以不同,通常输出空间要远小于输入空间。每个具体输入称为一个实例(Instance),由特征向量(Feature Vector)表示。所有特征向量形成特征空间(Feature Space)。特征空间的每一维对应于一个特征。
输入变量和输出变量均为连续变量的预测问题称为回归问题,输出变量为有限个离散变量的预测问题称为分类问题,输入变量与输出变量均为变量序列的预测问题称为标注问题。
-
遵循联合概率分布 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)独立同分布的。
-
假设空间
模型属于由输入空间到输出空间的映射集合,这个集合就是假设空间,意味着学习范围的确定即求解函数的一系列参数的决定,算法的作用就是找到参数向量。
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=1∑n(xi−yi)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′=sixi−ui
注意,标注差为不同实例同一维度的标准差。
从而标准化欧氏距离为:
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=1∑nsi2(xi−yi)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=1∑n∣xi−yi∣p)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=1∑n∣xi−yi∣
切比雪夫距离(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)=p→∞lim(i=1∑n∣xi−yi∣p)p1=max∣xi−yi∣
马哈拉诺比斯距离(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)=(X−Y)TS−1(X−Y)
注意,马氏距离的计算是建立在总体样本的基础上的,也就是说,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同。在计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧式距离计算即可。
相似度度量(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θ=∣X∣⋅∣Y∣X⋅Y
皮尔森相关系数(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)=n∑x2−(∑x)2⋅n∑y2−(∑y)2n∑xy−∑x∑y
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)=X⋃YX⋂Y
算法步骤
- 计算测试数据与各个训练数据之间的距离
- 按照距离从小到大排序
- 选取距离最小的 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