MATLAB初学_分类方法_4.0

一 K—近邻分类

    K—近邻算法是一种基于实例的非参数的分类方法。其作用原理是计算每个训练样例到待分类样品间的距离,取和待分类样品距离最近的看k个训练样例,k个样品中那个类别的训练样例占多数,则待分类元组就属于该类。

2.1 K-NN算法具体步骤

  1. 初始化距离为最大值;
  2. 计算未知样本和每个训练样本的距离dist;
  3. 得到目前k个最临近样本中的最大距离maxdist;
  4. 如果dist小于maxdist,则将该训练样本作为K-近邻样本;
  5. 重复步骤2、3、4,直到未知样本和所有训练样本的距离都计算完;
  6. 统计k个最近邻样本中每个类别出现的次数;
  7. 选择出现频率最大的类别作为未知样本中每个类别出现的次数。

2.2 编写程序

数据的预处理

clc,clear all,close all;
load F:\MATLAB_test\bank.mat
names=bank.Properties.VariableNames;

    提取表格中的数据并将bank文件中的属性名称给names;

category=varfun(@iscellstr,bank,'Output','uniform');
for i=find(category)                %找到非零元素的索引向量
    bank.(names{i})=categorical(bank.(names{i}));       %建立分类数组
end
catPred=category(1:end-1);
rng('default');        %产生随机数,方式为default
figure(1)
gscatter(bank.balance,bank.duration,bank.y,'br','xo')
xlabel('年平均余额/万元','fontsize',12)
ylabel('上次接触时间/秒','fontsize',12)
title('数据可视化效果','fontsize',12)
set(gca,'linewidth',2)

    处理数据,将字符串与数组分类处理。并将余额以及接触时间作为对顾客是否愿意购买新产品的重要标准建立可视化图;

X=table2array(varfun(@double,bank(:,1:end-1)));
Y=bank.y;
disp('数据中Yes&No的统计结果:')
tabulate(Y)
XNum=[X(:,~catPred) dummyvar(X(:,catPred))];
YNum=double(Y)-1;

 

将字符串转化为数组,并将X中的数据数组为虚拟变量方便后续处理;

结果如下:

cv=cvpartition(height(bank),'holdout',0.58);%创建交叉验证分区
Xtrain=X(training(cv),:);
Ytrain=Y(training(cv),:);
XtrainNum=XNum(training(cv),:);
YtrainNum=YNum(training(cv),:);

Xtest=X(test(cv),:);
Ytest=Y(test(cv),:);
XtestNum=XNum(test(cv),:);
YtestNum=YNum(test(cv),:);

disp('训练集:')
tabulate(Ytrain)
disp('测试集:')
tabulate(Ytest)

    交叉验证分区中选择58%的样本作为测试样本,可以很大程度上使得测试结果接近总体水准。(不同总体样本大小所选的测试样本比例不同)

结果如下:

knn=ClassificationKNN.fit(Xtrain,Ytrain,'Distance','seuclidean','NumNeighbors',5);
[Y_knn,Yscore_knn,Cost]=knn.predict(Xtest);
Yscore_knn=Yscore_knn(:,2);
disp('最近邻方法分类结果:')
C_knn=confusionmat(Ytest,Y_knn)

训练K-NN分类器后,通过混淆矩阵计算出结果:

    K-NN分类只与极少量相邻样本有关,可以避免样本不平衡问题。但是,只适合样本不大的情况,由于计算量大可以对样本进行剪辑,去除作用不大的样本,或者对样本分类整理计算样本领域小范围内的数据。


???

kk=training(cv);
ka=Y(training(cv),:);

 

kkka

    通过图可以看出kk的值是逻辑值0和1,而ka表示的是元包中的字符串。trainning发生了变化。或者可以理解为在用cvpartition中返回的trainingtest直接表示数组时作为逻辑量,但是在数组中作为间接量时返回的是数组的指针。

 

seuclidean—标准化欧式距离

首先将所计算的数据X进行标准化:

X^{\ast }=\frac{X-\mbox{mean}}{\mbox{std}}

mean:表示数据的均值;

std:表示数据的标准差。

计算标准化欧式距离:

将已知的两个N维向量X(x11,x12,x13,……,x1n)和Y(y21,y22,y23,……,y2n),公式如下:

dis=\sqrt{\sum_{k=1}^{n}(\frac{x_{1k}-x_{2k}}{s_{k}})^2}

s_k:表示对应标准差。


[1]卓金武,王鸿钧等,《MATLAB数学建模方法与实践》(第三版)

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值