机器学习(三)——K最临近方法构建分类模型(matlab)

matlab · 浏览次数 : 0

小编点评

本文介绍了K最临近(K-Nearest Neighbors,KNN)方法及其在MATLAB中的实现。KNN是一种简单直观的分类和回归算法,通过寻找最近K个样本的标签进行表决来预测未知样本的类别。 1. **KNN算法原理**:KNN算法基于投票方法,通过计算待分类样本与已知样本之间的距离,找到最近的K个样本,并根据这K个样本的标签进行表决,将投票最多的类别作为预测结果。 2. **距离度量**:KNN算法中,样本之间的距离可以用多种方式表示,如欧氏距离、曼哈顿距离和闵可夫斯基距离等。不同的距离度量对应不同的K值选择。 3. **MATLAB实现**:文章提供了在MATLAB中实现KNN算法的代码示例,包括特征归一化、欧式距离、曼哈顿距离和闵可夫斯基距离的计算,以及留一交叉验证的实现。 4. **分类准确度计算**:通过留一交叉验证的方式,计算KNN算法的分类准确度,并通过`disp`函数输出分类准确度结果。 5. **KD树搜索方法**:文章还提到了使用KD树搜索方法改进KNN算法的实现,这种方法可以提高查找最近邻居的速度,从而提高分类性能。 综上所述,本文详细介绍了KNN算法的基本原理、距离度量方法、在MATLAB中的实现以及不同距离度量下的KNN算法实现,并通过实验展示了分类准确度的计算方法。

正文

K最临近(K-Nearest Neighbors,KNN)方法是一种简单且直观的分类和回归算法,主要用于分类任务。其基本原理是用到表决的方法,找到距离其最近的K个样本,然后通过K个样本的标签进行表决,预测结果给出的标签是表决多的一方。
在使用K最临近方法的时候,有两个方面可调:
一是K值的大小,K一般选用单数,这样不会导致在进行表决时出现概率相等的情况。
二是样本之间的距离,由于样本特征的分布不同,因此在描述两样本之间的距离时有多种方式可以描述,例如:欧氏距离(Euclidean Distance)、曼哈顿距离(Manhattan Distance)和闵可夫斯基距离(Minkowski Distance)等。而且往往由于选择的距离不同,对应的K值也不一样,大家可以根据自己的数据特点尝试用不用的距离构建分类模型。本文提供了这些方法供大家选择。

在matlab中实现K最临近方法构建分类模型的代码如下:

labels = res(:, 1);  % 第一列是标签
features = res(:, 2:end);  % 后面的列是特征
features = zscore(features);   %归一化处理



% %% 欧式距离
%
% 
% % 设置 K 值
% K = 7;
% 
% % 初始化分类准确度
% accuracy = 0;
% 
% % 留一交叉验证
% for i = 1:size(features, 1)
%     % 从样本中选择一个作为验证样本,其余作为训练样本
%     validation_sample = features(i, :);
%     validation_label = labels(i);
%     
%     train_samples = features([1:i-1, i+1:end], :);
%     train_labels = labels([1:i-1, i+1:end]);
%     
%     % 计算验证样本与训练样本的距离
%     distances = sqrt(sum((train_samples - validation_sample).^2, 2));
%     
%     % 寻找最近的 K 个邻居
%     [~, idx] = mink(distances, K);
%     
%     % 投票确定验证样本的类别
%     predicted_label = mode(train_labels(idx));
%     
%     % 检查预测结果是否正确
%     if predicted_label == validation_label
%         accuracy = accuracy + 1;
%     end
% end
% 
% % 计算分类准确度
% accuracy = accuracy / size(features, 1);
% disp(['分类准确度:', num2str(accuracy)]);

% 
% 
% % 曼哈顿距离
% 
% 
% % 设置 K 值
% K = 9;
% 
% % 初始化分类准确度
% accuracy = 0;
% 
% % 留一交叉验证
% for i = 1:size(features, 1)
%     % 从样本中选择一个作为验证样本,其余作为训练样本
%     validation_sample = features(i, :);
%     validation_label = labels(i);
%     
%     train_samples = features([1:i-1, i+1:end], :);
%     train_labels = labels([1:i-1, i+1:end]);
%     
%     % 计算曼哈顿距离
%     distances = sum(abs(train_samples - validation_sample), 2);
%     
%     % 寻找最近的 K 个邻居
%     [~, idx] = mink(distances, K);
%     
%     % 投票确定验证样本的类别
%     predicted_label = mode(train_labels(idx));
%     
%     % 检查预测结果是否正确
%     if predicted_label == validation_label
%         accuracy = accuracy + 1;
%     end
% end
% 
% % 计算分类准确度
% accuracy = accuracy / size(features, 1);
% disp(['分类准确度:', num2str(accuracy)]);


% %% 闵可夫斯基距离
% 
% % 设置 K 值
% K = 5;
% 
% % 初始化分类准确度
% accuracy = 0;
% 
% % 留一交叉验证
% for i = 1:size(features, 1)
%     % 从样本中选择一个作为验证样本,其余作为训练样本
%     validation_sample = features(i, :);
%     validation_label = labels(i);
%     
%     train_samples = features([1:i-1, i+1:end], :);
%     train_labels = labels([1:i-1, i+1:end]);
%     
%     % 计算闵可夫斯基距离
%     distances = pdist2(train_samples, validation_sample, 'minkowski', 1); % p=1, 曼哈顿距离
%     
%     % 寻找最近的 K 个邻居
%     [~, idx] = mink(distances, K);
%     
%     % 投票确定验证样本的类别
%     predicted_label = mode(train_labels(idx));
%     
%     % 检查预测结果是否正确
%     if predicted_label == validation_label
%         accuracy = accuracy + 1;
%     end
% end
% 
% % 计算分类准确度
% accuracy = accuracy / size(features, 1);
% disp(['分类准确度:', num2str(accuracy)]);
% 





 %% KD树搜索方法


% 设置 K 值
K = 5;

% 初始化分类准确度
accuracy = 0;
predictedScores=zeros(56,2);

% 留一交叉验证
for i = 1:size(features, 1)
    % 从样本中选择一个作为验证样本,其余作为训练样本
    validation_sample = features(i, :);
    validation_label = labels(i);
    
    train_samples = features([1:i-1, i+1:end], :);
    train_labels = labels([1:i-1, i+1:end]);
    
    % 创建KD树
    mdl = fitcknn(train_samples, train_labels, 'NumNeighbors', K, 'Distance', 'euclidean', 'NSMethod', 'kdtree');
    
    % 预测验证样本的类别
    %predicted_label = predict(mdl, validation_sample);

    [predicted_label,predictedScore] = predict(mdl, validation_sample);
    predictedScores(i,:)=predictedScore;
    
    % 检查预测结果是否正确
    if predicted_label == validation_label
        accuracy = accuracy + 1;
    end
end

% 计算分类准确度
accuracy = accuracy / size(features, 1);
disp(['分类准确度:', num2str(accuracy)]);


与机器学习(三)——K最临近方法构建分类模型(matlab)相似的内容:

机器学习(三)——K最临近方法构建分类模型(matlab)

K最临近(K-Nearest Neighbors,KNN)方法是一种简单且直观的分类和回归算法,主要用于分类任务。其基本原理是用到表决的方法,找到距离其最近的K个样本,然后通过K个样本的标签进行表决,预测结果给出的标签是表决多的一方。 在使用K最临近方法的时候,有两个方面可调: 一是K值的大小,K一

聚类模型的算法性能评价

一、概述 作为机器学习领域的重要内容之一,聚类模型在许多方面能够发挥举足轻重的作用。所谓聚类,就是通过一定的技术方法将一堆数据样本依照其特性划分为不同的簇类,使得同一个簇内的样本有着更相近的属性。依不同的实现策略,聚类算法有很多种,如基于距离的k-means、基于密度的DBSCAN等。在聚类完成之后

基于K-means聚类算法进行客户人群分析

摘要:在本案例中,我们使用人工智能技术的聚类算法去分析超市购物中心客户的一些基本数据,把客户分成不同的群体,供营销团队参考并相应地制定营销策略。 本文分享自华为云社区《基于K-means聚类算法进行客户人群分析》,作者:HWCloudAI 。 实验目标 掌握如何通过机器学习算法进行用户群体分析; 掌

牛逼!50.3K Star!一个自动将屏幕截图转换为代码的开源工具

1、背景 在当今快节奏的软件开发环境中,设计师与开发者之间的协同工作显得尤为重要。然而,理解并准确实现设计稿的意图常常需要耗费大量的时间和沟通成本。为此,开源社区中出现了一个引人注目的项目——screenshot-to-code,它利用AI人工智能技术(机器学习算法和视觉分析技术),将屏幕截图自动转

[转帖]Redis学习四(运维指南).

阅读目录 一、上线规划 二、常见运维操作 三、测试方法 回到顶部 一、上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性。 redis 的运行机器 CPU 不求核数多,但求主频高,Cache大,因为 redis

2024年,AI驱动测试管理工具会有哪些发展前景呢?

随着人工智能技术的日新月异,2024年的测试管理工具将迎来全新的发展机遇。AI赋能将助力测试管理工具实现前所未有的智能化升级,为软件研发团队带来革命性的变革。 一、什么是AI? 人工智能(AI)是一种能够模仿人类智能行为的技术。它通过模拟人类大脑的功能来解决复杂问题,具有学习、推理、感知、预测等能力

机器学习(四)——Lasso线性回归预测构建分类模型(matlab)

Lasso线性回归(Least Absolute Shrinkage and Selection Operator)是一种能够进行特征选择和正则化的线性回归方法。其重要的思想是L1正则化:其基本原理为在损失函数中加上模型权重系数的绝对值,要想让模型的拟合效果比较好,就要使损失函数尽可能的小,因此这样

机器学习(一)——递归特征消除法实现SVM(matlab)

机器学习方法对多维特征数据进行分类:本文用到非常经典的机器学习方法,使用递归特征消除进行特征选择,使用支持向量机构建分类模型,使用留一交叉验证的方法来评判模型的性能。 构建模型:支持向量机(Support Vector Machine,SVM); 特征选择:递归特征消除(Recursive Feat

机器学习笔记(3): 神经网络初步

神经网络应该由若干神经元组成。 前面的每一个神经元都会给到一个参数,将传递的所有参数看作一个向量 \(\vec x\),那么此神经元的净输入为: \[z = x \omega + b \]其中 \(\omega\) 称为权重向量。 这里认为 \(x\) 是行向量,而 \(\omega\) 是列向量。

国产大模型参加高考,同写2024年高考作文,及格分(通义千问、Kimi、智谱清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)

大家好,我是章北海 今天高考,上午的语文结束,市面上又要来一场大模型参考的文章了。 我也凑凑热闹,让通义千问、Kimi、智谱清言一起来写一下高考作文。 公平起见,不加任何其他prompt,直接把题目甩过去。 感觉写的都很一般,通篇口水文,都能拿个及格分吧。 有点好奇,就加了几个国外选手参赛:Gemi