实现之前所说的上传Matlab实现随机森林、神经网络、Lasso回归的承诺。

Lasso

lasso具有降维的功能,但区别于PCA,lasso直接减少特征数,做的是特征选择,PCA是通过空间转换将特征空间从高维空间转换到低维空间,是降维(PCA的缺点是丢失语意)。当特征有很强的语意的时候,用LASSO更好,后续的分析会更高的保持可解释性,可以给出y=wx表达式(y、w、x均为向量);反之,数据的语意性不强,PCA更好。

%清空命令窗口
clc;
%清空工作区的变量和值
clear;
%关闭所有程序运行过程中打开的绘图窗口,此处为绘图窗口。
close all;
%读取excel数据,
x1=xlsread("C:\xxx.xlsx",'C4:J328');
y1=xlsread("C:\xxx.xlsx",'K4:K328');
%调用lasso函数,其中参数为(自变量x,因变量y,使用交叉验证,10折交叉验证,α,α=0为岭回归,α=1为lasso回归);返回值为(b:权重系数,fitinfo:模型信息)
[b,fitinfo] = lasso(x1,y1,'CV',10,'Alpha',1);
%画图
axTrace = lassoPlot(b,fitinfo,'PlotType','Lambda','XScale','log');
%为图像添加图例,位置在图的右侧外面
legend('show','Location','EastOutside');
axCV = lassoPlot(b,fitinfo,'PlotType','CV');
%寻找最小误差对应的迭代次数
lam1SE = fitinfo.Index1SE;
%最小误差的值
mse_1=fitinfo.MSE(lam1SE);
%取最小误差对应的系数;b矩阵lam1SE列所有行
mat=b(:,lam1SE);
%寻找系数中的非零项(~=0为不等于0)
[row1SE, ] = find(b(:,lam1SE)~=0);
%计算原来的最小均方误差
rhat = x1\y1;
res = x1*rhat - y1;
MSEmin_real= res'*res/325;
%最小均方误差对应的迭代次数,上面误差是1se这里是mse
lamMinMSE = fitinfo.IndexMinMSE;
%主成分的系数
matMinMSE = b(:,lamMinMSE);
%寻找非零自变量的下标(即主成分的下标)
[rowMinMSE, ] = find(b(:,lamMinMSE)~=0);
%两种计算误差方式使得所降成的维度不同,根据自己需求比较两个误差计算方式的差异选择留几个变量。

随机森林RF

随机森林可以计算对于最后的结果贡献率最高的特征,对于回归可以得出线性模型。

clc;
clear;
in=xlsread("C:\xxx.xlsx",'C4:J328');
Out=xlsread("C:\xxx.xlsx",'K4:K328');
%此处未进行归一化,切记,使用归一化的数据进行训练,后面要记得反归一化,且数据多处进行归一化,不可遗漏
nTree = 80;%树的个数
%训练模型
Factor = TreeBagger(nTree, In, Out,'Method','regression','NumPredictorsToSample',122,'OOBpredictorImportance','on','MinLeafSize',5);%
%性能评估,k-fold交叉验证法
[Predict_label,Scores] = predict(Factor, In);
%相关系数
cct=corrcoef(Out,Predict_label');
cct=cct(2,1);plot(Out,Out,'LineWidth',3);hold on
scatter(Out,Predict_label,'filled');
hold off
grid on
view(Factor.Trees{1},'Mode','graph')
%变量重要性直方图
weights=Factor.OOBPermutedVarDeltaError;
%重要性降序
[B,iranked] = sort(weights,'descend');
figure
xlabel('变量重要性','FontSize',30,'Interpreter','latex');
ylabel('排序','FontSize',30,'Interpreter','latex');
title('变量相对重要性展示','FontSize',17,'Interpreter','latex');
hold on
%45个数据为黄色
barh(weights(iranked(1:45)),'y');
%15个最重要属性为红色
barh(weights(iranked(1:15)),'r');grid on
xt = get(gca,'XTick');    %坐标轴刻度
xt_spacing=unique(diff(xt));
xt_spacing=xt_spacing(1);
yt = get(gca,'YTick');
ylim([0 40]); %y轴显示数目上限
xl=xlim;
xlim([0 2.5]);
%为直方图的每个线条添加文字for ii=1:40text( max([0 weights(iranked(ii))+0.02*max(weights)]),ii,['变量' num2str(iranked(ii))],'Interpreter','latex','FontSize',10);endset(gca,'FontSize',16)
set(gca,'XTick',0:2*xt_spacing:1.1*max(xl));
set(gca,'YTick',yt);
set(gca,'TickDir','out');%坐标轴刻度方向
set(gca, 'ydir', 'reverse' )%最大值在上方
set(gca,'LineWidth',2);   %设置线条粗细
drawnow%误差变化图
figure
plot(Factor.oobError,'LineWidth',2);
xlabel('生长树数量','FontSize',30)
ylabel('袋外错误率','FontSize',30)
title('袋外错误率','FontSize',30)
set(gca,'FontSize',16)
set(gca,'LineWidth',2);
grid on
drawnow

神经网络 NN

神经网络将数据进行糅合,最后所得为模型,具有不可解释性,只可实现输入数据并进行预测。
搬运工上线,很多解说该程序的博客,就不多bb啦~

clc;
clear;
close all;
sample=xlsread("C:\Users\CHANG\Desktop\c\sampleR_40.xlsx",'B2:AP326');
p=sample(:,1:end-1);
t=sample(:,end);
p=p';%神经网络输入的行为一个特征的所有样本值
t=t';%目标应为行向量
[p1,ps]=mapminmax(p);
[t1,ts]=mapminmax(t);
[trainsample.p1,valsample.p1,testsample.p1] =dividerand(p1,0.7,0.15,0.15);
[trainsample.t1,valsample.t1,testsample.t1] =dividerand(t1,0.7,0.15,0.15);
TF1='tansig';TF2='purelin';
net=newff(p1,t1,layer,{TF1 TF2},'traingdm');%网络创建
%网络参数的设置
net.trainParam.epochs=10000;%训练次数设置
net.trainParam.goal=1e-7;%训练目标设置
net.trainParam.lr=0.01;%学习率设置,应设置为较少值,太大虽然会在开始加快收敛速度,但临近最佳点时,会产生动荡,而致使无法收敛
net.trainParam.mc=0.9;%动量因子的设置,默认为0.9
net.trainParam.show=25;%显示的间隔次数
net.trainFcn='trainlm';
[net,tr]=train(net,trainsample.p1,trainsample.t1);
%计算仿真,其一般用sim函数
[normtrainoutput,trainPerf]=sim(net,trainsample.p1,[],[],trainsample.t1);%训练的数据,根据BP得到的结果
[normvalidateoutput,validatePerf]=sim(net,valsample.p1,[],[],valsample.t1);%验证的数据,经BP得到的结果
[normtestoutput,testPerf]=sim(net,testsample.p1,[],[],testsample.t1);
trainoutput=mapminmax('reverse',normtrainoutput,ts);
validateoutput=mapminmax('reverse',normvalidateoutput,ts);
testoutput=mapminmax('reverse',normtestoutput,ts);
%正常输入的数据的反归一化的处理,得到其正式值
trainvalue=mapminmax('reverse',trainsample.t1,ts);%正常的验证数据
validatevalue=mapminmax('reverse',valsample.t1,ts);%正常的验证的数据
testvalue=mapminmax('reverse',testsample.t1,ts);%正常的测试数据
pnew=[159.0     90.2    50.21   0.5680  1019.1993   206.8057    394.2145    102.1239    120.8178    51.6357     69.5808     60.4115     -0.1513     2.0921  -0.3742     49.9826     0.0000  282.6794    921079.3000     131.3584    25.8939     3.8522  24.4931     283.2769    -4.9646     66.4584     139.4476    70.4751     170.5868    0.2601  -5.1580     474.5039    12265800.0000   9.1833  18.7165     56.4848     3.1464  2.2574  31.8697     0.4928 ];
pnew=pnew';
%将输入数据归一化
pnewn=mapminmax(pnew);
anewn=sim(net,pnewn);
anew=mapminmax('reverse',anewn,ts);
predictA(layer-layerBegin+1,trainNum)=anew;
%绝对误差的计算
errorSquaresSum=zeros(layerEnd,trainEnd);
for i=1:(layerBegin-layerEnd+1)    for j=trainBegin:trainEnd       errorSquaresSum(i,j)=(predictA(i,j)-88.80)^2;  end
end
errors=trainvalue-trainoutput;
%plotregression拟合图
figure,plotregression(trainvalue,trainoutput)
%误差图
figure,plot(1:length(errors),errors,'-b')
title('误差变化图')
%误差值的正态性的检验
figure,hist(errors);%频数直方图
figure,normplot(errors);
figure,normplot(errors);%Q-Q图
[muhat,sigmahat,muci,sigmaci]=normfit(errors);
%参数估计 均值,方差,均值的0.95置信区间,方差的0.95置信区间
[h1,sig,ci]= ttest(errors,muhat);
%假设检验
figure, ploterrcorr(errors);
%绘制误差的自相关图
figure, parcorr(errors);
%绘制偏相关图% %输入数据
save p.mat;
save t.mat;

补充

当系数矩阵和y的维数不呼应时,求x*a=y最小二乘解,使用命令为:左除
代码:

x=xlsread("C:\xxx.xlsx",'B2:T326');
y=xlsread("C:\xxx.xlsx",'U2:U326');
//组成增广矩阵
plus=[x y];
//求x的秩
rX=rank(x);
//求增广矩阵的秩
rP=rank(plus);
k_Left=x\y;
y_new_Left=x*k_Left;
//计算误差。误差平方和
error_Left=sum((y-y_new_Left).^2);

Matlab实现随机森林、神经网络、Lasso回归相关推荐

  1. matlab中随机森林实现,随机森林实现 MATLAB

    matlab 中随机森林工具箱的下载地址: http://code.google.com/p/randomforest-matlab/downloads/detail?name=Windows-Pre ...

  2. Matlab之随机森林TreeBagger

    MATLAB之随机森林TreeBagger TreeBagger 1 方法: 2 属性: TreeBagger TreeBagger用来创建一个袋装决策树的集合. 1 方法: append compa ...

  3. xgboost、随机森林和逻辑回归的优缺点

    转载自https://www.nowcoder.com/ta/review-ml/review?query=&asc=true&order=&page=99 Xgboost: ...

  4. 使用matlab实现随机森林仿真

    这几天在网上看到一篇关于随机森林的文章,感觉挺有趣的,就在这简单地总结了一下随机森林,并使用matlab来仿真实现. 随机森林 随机森林使用了元胞自动机模型,其中每个元胞有三种状态:无树.着火.有树. ...

  5. 随机森林用matlab实现,matlab实现随机森林

    MATLAB中的分类器_金融/投资_经管营销_专业资料.MATLAB 中的分类器目前了解到的 MATLAB 中分类器有:K 近邻分类器,随机森林分类器,朴素贝叶斯,集成学习 方法,鉴别...... 机 ...

  6. python实现随机森林、逻辑回归和朴素贝叶斯的新闻文本分类

    实现本文的文本数据可以在THUCTC下载也可以自己手动爬虫生成, 本文主要参考:https://blog.csdn.net/hao5335156/article/details/82716923 nb ...

  7. sklearn 随机森林(分类器、回归器)的重要参数、属性、方法理解

    文章目录 随机森林分类器 引入 重要参数 1,n_estimators 2,criterion 3,max_depth 4,min_samples_leaf 5,min_samples_split 7 ...

  8. 【sklearn学习】随机森林分类、回归

    集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合结果,以此来获取比单个模型更好的回归或分类表现. 三类集成算法:装袋法(Bagging).提升法(Boosting).stacking 装袋法: ...

  9. 贷款利润最大化——利用随机森林和逻辑回归

    文章目录 分析目的 一.数据采集 1.数据来源 2.数据说明 二.数据传输 三.数据处理 1.查看数据 2.清理无用特征值 3.标签列分析 4.清理只单一值的列 5.空值处理 6.数据类型转换 四.数 ...

最新文章

  1. c语言编写弹窗提示是否确认退出_世人觉得C语言和C++太难?没前途?过来人告诉你真相...
  2. 网络招聘“草莽时代”该结束了
  3. Java 集合系列(3): fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)...
  4. linux命令的导入,[导入]Linux基本命令
  5. Linux增加虚拟内存的配置方案
  6. Paxos、Raft分布式一致性算法应用场景
  7. 算法工程师眼中的AI岗位
  8. async与await封装ajax请求
  9. python秒转化为时间格式_Python耗费时间秒转 天小时分钟秒 时间格式美化
  10. python解析http数据包_如何在python中嗅探HTTP数据包?
  11. [css] 浏览器是怎样判断元素是否和某个CSS选择器匹配?
  12. IO流--buffer
  13. Java NIO网络编程之Selector
  14. 中国恒大拟出售恒大汽车2.66%股权 配股金额约106亿港元
  15. MySQL从安装改密码到navicate远程连接,以及修改存储路径
  16. Javascript图形处理库 -- Raphaël
  17. 电商人:别再跟数据透视表苦苦挣扎,这个报表神器才是你最后出路
  18. android MemeoryFile和Parcel操作文件描述符fd
  19. 小程序毕设日志.2021.3.13
  20. 英雄无敌6服务器在哪个文件夹,魔法门英雄无敌6:生物-墓园资料

热门文章

  1. 2020年蓝桥杯C/C++省赛B组第二场D:跑步锻炼
  2. 还在担心学Linux懵圈吗?掌握这份Linux思维导图,你就能成为高手
  3. 中国蚁剑下载安装以及插件的安装教程
  4. WORD如何横竖页面混排
  5. 用户密码校验,至少包含大小写字母、数字、特殊字符其中三种,且不少于6位
  6. 使用Photovisi创建自定义桌面墙纸
  7. 【MQ】kafka(一)——什么是kafka?在系统中干什么用?
  8. 刚拿到护照,第一次出国应该从哪些国家开始?
  9. itemCF推荐算法的实现
  10. vue系列之----- px转rem配置