降维与度量学习
k近邻学习
k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督算法,其工作机制非常简单:给定测试样本,基于某种距离度量找到训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。
在分类任务中可使用“投票法”,即选择这k个样本中出现最多的类别标记作为预测结果;在回归任务中可使用“平均法”,即将这k个样本的实际输出标记的平均值作为预测结果;还可以基于距离远近进行平均加权或加权投票,距离越近的样本权重越大。
KNN学习是“ 懒惰学习 \textcolor{red}{懒惰学习} 懒惰学习”的著名代表,此类学习技术在训练阶段仅仅是把样本保存起来,训练时间开销为零,待收到测试样本后再进行处理;相应的,那些在训练阶段就对样本进行学习处理的方法,称为“ 急切学习 \textcolor{red}{急切学习} 急切学习”。
算法流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JEc9DYDq-1662601990424)(F:\Typora\机器学习(西瓜书)\image\屏幕截图 2022-08-06 190022.png)]
代码实现
function [ idx ] = KNN( trainData,trainClass,testData,K )
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
[N,M]=size(trainData);
%计算训练数据集与测试数据之间的欧氏距离dist
dist=zeros(N,1);
for i=1:N
dist(i,:)=norm(trainData(i,:)-testData);
end
%将dist从小到大进行排序
[Y,I]=sort(dist,1);
K=min(K,length(Y));
%将训练数据对应的类别与训练数据排序结果对应
labels=trainClass(I);
%确定前K个点所在类别的出现频率
classNum=length(unique(trainClass));%取集合中的单值元素的个数
labels=zeros(1,classNum);
for i=1:K
j=trainClass(i);
labels(j)=labels(j)+1;
end
%返回前K个点中出现频率最高的类别作为测试数据的预测分类
[~,idx]=max(labels);
%确定前K个点所在类别的出现频率
idx=mode(labels(1:K));%mode函数求众数
fprintf('该测试数据属于类 %d ',idx);
end
低维嵌入
上一节的讨论是基于一个重要假设:任意测试样本x附近任意小的δ距离范围内总能找到一个训练样本,即训练样本的采样密度足够大,或称为“密度采样”。然而,这个假设在现实任务中通常很难满足。
维数灾难:在高维情形下出现的数据样本稀疏、距离计算困难等问题,是所有机器学习方法共同面临的严重障碍。
缓解维数灾难的一个重要途径是 降维 \textcolor{red}{降维} 降维,亦称“维数简约”,即通过某种数学变换将原始高维属性空间转变为一个低维“子空间”。
若要求原始空间中的样本之间的距离在低维空间中得以保持,如图可知,即得到“多维缩放”。高维空间中的一个低维“嵌入”。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xuY8Qxci-1662601990425)(F:\Typora\机器学习(西瓜书)\image\屏幕截图 2022-08-06 112918.png)]
在现实应用中为了有效降维,往往仅需降维后的距离与原始空间中的距离尽可能接近,而不必严格相等。
$dist_{i \cdot }^2 = \frac{1}{m}\sum\limits_{j = 1}^m {dist_{ij}^2} $ (10.7)
$dist_{ \cdot j}^2 = \frac{1}{m}\sum\limits_{i = 1}^m {dist_{ij}^2} $ (10.8)
$dist_{ \cdot \cdot }^2 = \frac{1}{
{
{m^2}}}\sum\limits_{i = 1}^m {\sum\limits_{j = 1}^m {dist_{ij}^2} } $ (10.9)
b i j = − 1 2 ( d i s t i j 2 − d i s t i ⋅ 2 − d i s t j ⋅ 2 + d i s t ⋅ ⋅ 2 ) {b_{ij}} = - \frac{1}{2}(dist_{ij}^2 - dist_{i \cdot }^2 - dist_{j \cdot }^2 + dist_{ \cdot \cdot }^2) bij=−21(distij2−disti⋅2