婴儿用品网站模板,wordpress 国内,网站开发和报价方案,wordpress店铺模板制作教程目录
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 N…目录
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为已标记的数据集算法原理的伪代码如下
遍历X_train中的所有样本计算每个样本与X_test的距离并把距离保存在Distance数组中。对Distance数组进行排序取距离最近的k个点记为X_knn。在X_knn中统计每个类别的个数即class0在X_knn中有几个样本class1在X_knn中有几个样本等。待标记样本的类别就是在X_knn中样本个数最多的那个类别。
2.1 算法优缺点
优点准确性高对异常值和噪声有较高的容忍度。缺点计算量较大对内存的需求也较大。
2.2 算法参数 其算法参数是k参数选择需要根据数据来决定。
k值越大模型的偏差越大对噪声数据越不敏感当k值很大时可能造成欠拟合k值越小模型的方差就会越大当k值太小就会造成过拟合。
2.3 变种 knn算法有一些变种其中之一是可以增加邻居的权重。默认情况下在计算距离时都是使用相同权重。实际上可以针对不同的邻居指定不同的距离权重如距离越近权重越高。这个可以通过指定算法的weights参数来实现。 另一个变种是使用一定半径内的点取代距离最近的k个点。当数据采样不均匀时可以有更好的性能。在scikit-learn里RadiusNeighborsClassifier类实现了这个算法变种。
3.算法中的距离公式 与我们的线性回归不同在这里我们并没有什么公式可以进行推导。KNN分类算法的核心就在于计算距离随后按照距离分类。 在二维笛卡尔坐标系相信初中同学应该对这个应该不陌生他有一个更加常见的名字直角坐标系。其中计算两个点之间的距离公式常用的有欧氏距离。点A(2,3)点B(5,6)那么AB的距离为 这便是欧氏距离。但和我们平常经常遇到的还是有一些区别的欧氏距离是可以计算多维数据的也就是矩阵(Matrix)。这可以帮我们解决很多问题那么公式也就变成了 4.案例实现
我们使用knn算法及其变种对Pina印第安人的糖尿病进行预测。数据集可从下面下载。 链接蓝奏云
4.1 读取数据
%读取数据
dataxlsread(D:\桌面\knn.xlsx);
4.2 分离训练集和测试集
ratio0.1;%测试数据所占比例
[N,M]size(data);
trainDatadata(:,1:8);
trainClassdata(:,9);
num_testN*ratio;
4.3 归一化处理
%归一化处理newData(oldData-minValue)/(maxValue-minValue);
minValuemin(trainData);
maxValuemax(trainData);
trainData(trainData-repmat(minValue,N,1))./(repmat(maxValue-minValue,N,1));
4.4 计算欧氏距离
%计算训练数据集与测试数据之间的欧氏距离dist
distzeros(N,1);
for i1:Ndist(i,:)norm(trainData(i,:)-testData);
end
4.5 排序和输出测试结果
%将dist从小到大进行排序
[Y,I]sort(dist,1);
Kmin(K,length(Y));
%将训练数据对应的类别与训练数据排序结果对应
labelstrainClass(I);
%确定前K个点所在类别的出现频率
idxmode(labels(1:K));%mode函数求众数
fprintf(该测试数据属于类 %d ,idx);
4.6 计算准确率
error0;
for i1:num_testidxKNN(trainData(num_test1:N,:),trainClass(num_test1:N,:),trainData(i,:),K);fprintf(该测试数据的真实类为%d\n,trainClass(i,:));if idx~trainClass(i,:);errorerror1;end
end
fprintf(准确率为%f\n,1-error/num_test);
总代码
clc;clear;
% 警告消息消除
warning(off);
%读取数据
dataxlsread(D:\桌面\knn.xlsx);
ratio0.1;%测试数据所占比例
[N,M]size(data);
K4;
trainDatadata(:,1:8);
trainClassdata(:,9);
num_testN*ratio;
%归一化处理newData(oldData-minValue)/(maxValue-minValue);
minValuemin(trainData);
maxValuemax(trainData);
trainData(trainData-repmat(minValue,N,1))./(repmat(maxValue-minValue,N,1));
error0;
for i1:num_testidxKNN(trainData(num_test1:N,:),trainClass(num_test1:N,:),trainData(i,:),K);fprintf(该测试数据的真实类为%d\n,trainClass(i,:));if idx~trainClass(i,:);errorerror1;end
end
fprintf(准确率为%f\n,1-error/num_test);
返回 其中 KNN 函数
function [ idx ] KNN( trainData,trainClass,testData,K )
%UNTITLED Summary of this function goes here
% Detailed explanation goes here[N,M]size(trainData);
%计算训练数据集与测试数据之间的欧氏距离dist
distzeros(N,1);
for i1:Ndist(i,:)norm(trainData(i,:)-testData);
end
%将dist从小到大进行排序
[Y,I]sort(dist,1);
Kmin(K,length(Y));
%将训练数据对应的类别与训练数据排序结果对应
labelstrainClass(I);
%{
%确定前K个点所在类别的出现频率
classNumlength(unique(trainClass));%取集合中的单值元素的个数
labelszeros(1,classNum);
for i1:KjtrainClass(i);labels(j)labels(j)1;
end
%返回前K个点中出现频率最高的类别作为测试数据的预测分类
[~,idx]max(labels);
%}
%确定前K个点所在类别的出现频率
idxmode(labels(1:K));%mode函数求众数
fprintf(该测试数据属于类 %d ,idx);
end