每天进步一点点《ML - KNN》

一些前提的约定,还是沿用上篇文章的哈。先来致敬下男神。

在这里插入图片描述

一:K最近邻(KNN)
KNN是一个监督学习方法,也是一种分类算法。这一篇比较简单,这是个比较古老的算法,其思想也是很简单朴素的,已知我们有一堆样本,都是已经分好了类,每样本都是有个标签的,代表了该样本是属于哪个类别。
KNN的思想就是,好了,我有一堆的样本,我也不管别的,你给我一个新的不带标签的样本A让我分类,我就用已有的分好类的样本集合去匹配。计算新的样本A到每一个已经分配好的样本B之间的距离,看看距离样本A最近最近的前K个样本的标签是什么,在前K个样本中找到最多的样本的标签就认为是该新样本的标签,分类结束。
在这里插入图片描述

把到所有点的距离按照从小到大的顺序进行排序,找到最近的前K的距离对应的样本以及对应的标签,对每个标签进行统计数量,选最数量最大的那个标签作为未知样本的分类标签和类别。

二:举例实践

在这里插入图片描述

途中红色是一个类别:0,蓝色是一个类别:1,对绿色标签进行分类。
我们选取K= 5,在前5个样本中进行选择。

clear all
clc

src_x1 = [1.3,1.35,1.4,1.45,1.5,     1.32,1.33,1.42,1.43,1.46];
src_y1 = [3.32, 3.15, 3.12, 3.41, 3.26    ,3.3, 3.5, 3.2, 3.4, 3.6];
src_x2 = [3.3, 3.35, 3.4, 3.45, 3.5,  3.32,3.352,3.42,3.47,3.52];
src_y2 = [5.3, 5.5, 5.2, 5.4, 5.6,    5.32, 5.35, 5.24, 5.34, 5.61];

src_x = [src_x1, src_x2]';
src_y = [src_y1, src_y2]';
tag = [ones(1, size(src_x1)(2)), zeros(1, size(src_x2)(2))];



% random to form some data
trainData = [src_x, src_y];
trainClass = tag';
testData = [3.0,3.7];


figure();
subplot(1, 1, 1);
hold on;

% 打点,画决策边界
scatter(src_x1, src_y1, 'b', 'linewidth', 3);
scatter(src_x2, src_y2, 'r', 'linewidth', 3);
scatter(testData(1), testData(2), 'g', 'linewidth', 3);
xlim([0,6]);
ylim([2,6]);
%axis equal;
grid on;
xlabel('x1');
ylabel('x2');





% set the K value
k = 5;

% calculate every sample to this testData's distance
% L2 distance
distance = sqrt(((trainData - testData) .^ 2) * ones(2,1));

%% sort
tmpDis = [distance, trainClass];
sortDis = sortrows(tmpDis);



% find its tag
% the most tag in kth label
classAll = unique(trainClass);
classNum = size(classAll)(1);

% first col is label, second col is count
classAll = [classAll, zeros(classNum, 1)];

maxCount = 0;
lableRes = 0;
for i = 1:k
    label = sortDis(i, 2);
	
    for j = 1: classNum
		if label == classAll(j, 1)
			classAll(j, 2) += 1;
			if maxCount < classAll(j, 2)
				maxCount = classAll(j, 2);
				lableRes = label;
			end;
		end;
	end;
end;


disp('After KNN, the result is:');
fprintf('%d\n', lableRes)

在这里插入图片描述
在这里插入图片描述
看来他是分类到了1这个标签,因为前五个标签中有三个是1,,占了多数。

三:进一步学习
1:KNN受K影响大。要选择合适的K值,K值不同,可能直接赢分类的结果。可以不断地调整K值,对进行交叉验证,选择饿一个误差最小的K值。

K值过小,那么模型就会变得复杂,容易导致过拟合,假设K=1,那就是找到离自己最近的样本所在的类别,容易受到噪声干扰,还会受到异常点的干扰。之所以变得复杂呢是因为,整个空间按照距离的划分,就分成了很多个特别复杂的区域,某个区域内的点属于某个样本,另外个区域内的属于另外个样本。比如下图,整个空间被两个样本划分了两个区域。大家可以在整个特征空间内找到很多点,都去计算下他英国属于的样本空间,在图中画出来就是一个很复杂的多区域。

在这里插入图片描述

如果K过大,整个模型又太简单,假设K=N,是全部训练样本空间的样本数量,那么最后整个分类就是简单的样本空间谁最多就是谁。也就是着呢个空间区域全部都是样本多的那个类别的区域范围,这时候就是高偏差就出现了。

它太多简单了。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值