knn(k近邻算法)——matlab

目录

1. 基本定义

2. 算法原理

2.1 算法优缺点

2.2 算法参数

2.3 变种

3.算法中的距离公式

4.案例实现

4.1 读取数据 

4.2 分离训练集和测试集

4.3 归一化处理 

4.4 计算欧氏距离

4.5 排序和输出测试结果

4.6 计算准确率

总代码


1. 基本定义

        k最近邻(k-Nearest Ne ighbor)算法是比较简单的机器学习算法。它采用测量不同特征值之间的距离方法进行分类。它的思想很简单:如果一个样本在特征空间中的多个最近邻(最相似〉的样本中的大多数都属于某一个类别,则该样本也属于这个类别。第一个字母k可以小写,表示外部定义的近邻数量。

        简而言之,就是让机器自己按照每一个点的距离,距离近的为一类。

2. 算法原理

        knn算法的核心思想是未标记样本的类别,由距离其最近的k个邻居投票来决定。
        具体的,假设我们有一个已标记好的数据集。此时有一个未标记的数据样本,我们的任务是预测出这个数据样本所属的类别。knn的原理是,计算待标记样本和数据集中每个样本的距离,取距离最近的k个样本。待标记的样本所属类别就由这k个距离最近的样本投票产生。
假设X_test为待标记的样本,X_train为已标记的数据集,算法原理的伪代码如下:

  1. 遍历X_train中的所有样本,计算每个样本与X_test的距离,并把距离保存在Distance数组中。
  2. 对Distance数组进行排序,取距离最近的k个点,记为X_knn。
  3. 在X_knn中统计每个类别的个数,即class0在X_knn中有几个样本,class1在X_knn中有几个样本等。
  4. 待标记样本的类别,就是在X_knn中样本个数最多的那个类别。

2.1 算法优缺点

  • 优点:准确性高,对异常值和噪声有较高的容忍度。
  • 缺点:计算量较大,对内存的需求也较大。

2.2 算法参数

        其算法参数是k,参数选择需要根据数据来决定。

  • k值越大,模型的偏差越大,对噪声数据越不敏感,当k值很大时,可能造成欠拟合;
  • k值越小,模型的方差就会越大,当k值太小,就会造成过拟合。

2.3 变种

        knn算法有一些变种,其中之一是可以增加邻居的权重。默认情况下,在计算距离时,都是使用相同权重。实际上,可以针对不同的邻居指定不同的距离权重,如距离越近权重越高。这个可以通过指定算法的weights参数来实现。
        另一个变种是,使用一定半径内的点取代距离最近的k个点。当数据采样不均匀时,可以有更好的性能。在scikit-learn里,<

### K近邻算法 MATLAB 实现 K近邻(KNN)是一种简单而有效的分类方法,在MATLAB中可以通过编写自定义函数来实现这一算法。下面提供了一个完整的基于穷举法的KNN实现示例。 #### 数据准备 为了便于理解,先创建一些模拟数据作为训练集和测试样本: ```matlab % 创建随机二维空间内的点作为训练数据 X = rand(100, 2); % 训练数据特征矩阵 (100个实例, 每个有两个属性) Y = randi([0, 1], 100, 1); % 对应标签向量 (二元分类) % 测试样本 testPoint = [0.5; 0.5]; ``` #### 距离计算 接下来定义一个用于测量两点间欧氏距离的功能模块: ```matlab function d = euclideanDistance(p1, p2) % 输入参数p1,p2分别为两个坐标点 d = sqrt(sum((p1(:)-p2(:)).^2)); end ``` #### 查找最接近邻居并投票决定类别 这里实现了核心逻辑——对于给定的新样本`testPoint`, 找到与其最近的k个邻居,并通过多数表决机制确定其所属类别: ```matlab function predictedClass = knnClassifier(X, Y, testPoint, k) distances = arrayfun(@(rowIdx)euclideanDistance(testPoint,X(rowIdx,:)), 1:size(X,1)); [~, sortedIndices] = sort(distances); closestLabels = Y(sortedIndices(1:k), :); uniqueClasses = unique(closestLabels); counts = histc(closestLabels', uniqueClasses'); [~, maxIndex] = max(counts); predictedClass = uniqueClasses(maxIndex); end ``` 调用上述编写的`knnClassifier()` 函数来进行预测操作[^1]: ```matlab predictedLabel = knnClassifier(X,Y,testPoint,3); disp(['Predicted class:', num2str(predictedLabel)]); ``` 此段代码展示了如何利用基础编程技巧构建一个简单的KNN分类器。当然,在实际应用中可以考虑优化性能以及处理更复杂的情况,比如加权投票等改进措施。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值