美文网首页
Matlab一元/多元回归(后续会有更新)

Matlab一元/多元回归(后续会有更新)

作者: 树里的熊 | 来源:发表于2021-09-25 23:30 被阅读0次

一元线性回归&一元非线性回归

clc,clear ,close all
x=[23.8,27.6,31.6,32.4,33.7,34.9,43.2,52.8,63.8,73.4];
y=[41.4,51.8,61.7,67.9,68.7,77.5,95.9,137.4,155.0,175.0];

%Figure
%先画散点图
plot(x,y,'r*')
%xlabel ylabel
set(gca,'linewidth',2);
Lxx=sum((x-mean(x)).^2);
Lxy=sum((x-mean(x)).*(y-mean(y)));
b1=Lxy/Lxx;
b0=mean(y)-b1*mean(x);
y1=b1*x+b0;
hold on
plot(x,y1,'linewidth',2);

%用linearModel
m2=LinearModel.fit(x,y);

%用regress
Y=y';
X=[ones(size(x,2),1),x'];
[b,bint,r,rint,s]=regress(Y,X);
clc,clear,close all
%一元非线性回归
%读入数据
x=[1.5,4.5,7.5,10.5,13.5,16.5,19.5,22.5,25.5];
y=[7.0,4.8,3.6,3.1,2.7,2.5,2.4,2.3,2.2];
plot(x,y,'*','linewidth',2);
set(gca,'linewidth',2);
%x y label
%对数型
m1=@(b,x)b(1)+b(2)*log(x);
nonlinfit1=fitnlm(x,y,m1,[0.01;0.01])
b=nonlinfit1.Coefficients.Estimate;
Y1=b(1,1)+b(2,1)*log(x);
hold on
plot(x,Y1,'--k','linewidth',2)
%指数型
m2='y~b1*x^b2';
nonlinfit2=fitnlm(x,y,m2,[1;1])
b1=nonlinfit2.Coefficients.Estimate(1,1);
b2=nonlinfit2.Coefficients.Estimate(2,1);
Y2=b1*x.^b2;
hold on
plot(x,Y2,'r','linewidth',2)
%图例
legend('原始数据','a+b*lnx','a*x^b')

多元回归/逐步回归

多元回归

  • 先画散点图,看有没有线性性质,再决定能不能用多元线性回归

  • 代数据

  • 模型检验

[b,bint,r,rint,s]=regress(Y',X,0.05)

一些参数解释

b:系数估计值

X:要自己加一个ones的列,这样常数项才能有系数

bint:系数估计值的 95% 置信区间的矩阵

r:由残差组成的向量

rint:其中包含可用于诊断离群值的区间

stats:包含 R2 统计量、F 统计量及其 p 值,以及误差方差的估计值。

一些概念解释
后面我都没贴概念解释了,因为感觉会涉及很多统计学知识,现在都要弄懂的话就会牵扯好多,所以打算先存疑。然后等这学期继续深入学概率论和自己看一些统计学书籍,到时候应该能用人话把这些概念复述出来

置信区间:

(默认95%)‘’我不知道真值是哪个,但我有95%的把握它在置信区间里‘’

F值表示整个拟合方程的显著性,F越大,表示方程越显著,拟合程度也就越好。

P值表示不拒绝原假设的程度。简而言之,P<0.5表示假设更可能是正确的,反之则可能是错误的。

r值是拟合优度指数,用来评价模型的拟合好坏等,取值范围是【-1,1】,越接近正负1越好。R平方=SSR/SST。其中SSR是回归平方和,SST是总离差平方和。

摘自卓金武《Matlab应用》.png

逐步回归

多元线性回归和多元多项式回归的结合:自动使得方程因子设置最合理

X= [7,26,6,60;1,29,15,52;11,56,8,20;11,31,8,47;7,52,6,33;11,55,9,22;3,71,17,6;1,31,22,44;

2,54,18,22;21,47,4,26;1,40,23,34;11,66,9,12];%自变量数据 
Y= [78.5,74.3,104.3,87.6,95.9,109.2,102.7,72.5,93.1,115.9,83.8,113.3]; %因变量数据 
stepwise (X, Y, [1,2,3,4],0.05,0.10) ;% in= [1,2,3,4] 表示 X1、X2、X3、X4 均保留在模型中
%进入页面后就是点next step然后导出得到一堆变量
logistic

以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等。因此因变量就为是否胃癌,值为“是”或“否”,自变量就可以包括很多了,如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。然后通过logistic回归分析,可以得到自变量的权重,从而可以大致了解到底哪些因素是胃癌的危险因素。同时根据该权值可以根据危险因素预测一个人患癌症的可能性。

Logistic回归模型的适用条件

1 因变量为二分类的分类变量或某事件的发生率,并且是数值型变量。但是需要注意,重复计数现象指标不适用于Logistic回归。

2 残差和因变量都要服从二项分布。二项分布对应的是分类变量,所以不是正态分布,进而不是用最小二乘法,而是最大似然法来解决方程估计和检验问题。

3 自变量和Logistic概率是线性关系

4 各观测对象间相互独立。

%logistic 回归 MATLAB 实现程序
%% 数据准备  
clc, clear, close all

 x0=xlsread ('logistic_exl. xlsx', 'A2: C21') ;
 Y0=xlsread ('logistic_exl. xlsx', 'D2: D21');
 X1=xlsread ('logistic_exl. xlsx', 'A2: C26');

%% logistics 函数

 GM =fitqlm (X0, Y0, 'Distribution', 'binomial');
 Y1= predict (GM, X1);

%% 模型的评估

NO=1: size (Y0,1); 
N1=1: size (Y1,1);  
plot (NO',Y0, '-kd');
hold on;
scatter (N1', Y1, 'b')
xlabe('数据点编号'); ylabel('输出值');

机器学习

数据量比较大,就有机器学习的用武之地

有监督学习:主要用于决策支持,比如分类和回归

无监督学习:主要用于知识发现,比如聚类

K-近邻分类方法:

初始化距离为最大值

计算未知样本和每个训练样本的距离dist

得到目前k个最邻近样本中的最大值maxdist

若dist小于maxdist,则将该样本作为K-邻近样本

重复上述步骤

统计k个邻近样本中每个类别出现的次数,选择频率最大的类别作为未知样本的类别

还有一种说法

是算距离,升序排列取前k个然后加权平均

最核心:k的选取

经验:直接试

均方根误差

适用于:样本容量比较大的自动分类问题

贝叶斯分类:就是我们学的那个贝叶斯

相关属性会降低朴素贝叶斯分类器的性能,因为对这些属性,条件独立的假设已经不成立

%% 准备环境
clear ,clc,close all
%% 导入数据及数据预处理
load bank.csv

%将分类变量转换成分类数组

names=bank.Properties.Variablenames;

category=varfun (@iscellstr,bank,' Output',' uniform');

for i = find (category)

bank.(names {i}) =categorical (bank. (names {i}));

end

%跟踪分类变量

catered =category (1: end- 1);

%设置默认随机数生成方式,确保该脚本中的结果是可以重现的 \
rng ('default');

%数据探索一数据可视化

figure (1)

gscatter (bank.balance, bank.duration, bank.Y, 'kk','xo') 
xlabel('年平均余额/万元', fontsize,12)

ylabel('上次接触时间/秒',fontsize,12)

title('数据可视化效果图',fontsize,12)  
set (gca, linewidth, 2);
%设置响应变量和预测变量

X= table2array (varun (double, bank (:,1: end-1))); 
%预测变量 Y=bank. Y;响应变量 
disp('数据中 Yes&No 的统计结果:')
tabulate(Y)
%将分类数组进一步转换成二进制数组,以便某些算法对分类变量的处理
XNum=[X(:,~catPred) dummyvar(X(:,catPred))];
YNum=double(Y)-1;
%% 设置交叉验证方式
cv= cvpartition (height (bank), holdout,0.40);

%训练集

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)

%% 训练K-NN分类器
knn =ClassificationKNN.fit(Xtrain, Ytrain, 'Distance', 'seuclidean',...
    'Numneighbors', 5);

%进行预测

[Y_knn, Yscore_knn]= knn.predict (Xtest);  
Yscore_knn=Yscore_knn (:, 2);
%计算混淆矩阵
disp('最近邻方法分类结果:')
C_knn =confusionmat (Ytest, Y_knn);

%% 训练朴素贝叶斯分类器
dist =repmat ({'normal'}, 1, width (bank) -1) ; 
dist (catPred) = {'mvmn'};
%训练分类器

Nb= Naivebayes.fit (Xtrain, Ytrain, 'Distribution',dist);
%进行预测

Y_Nb =Nb.predict (Xtest);
Yscore_Nb=Nb. Posterior (Xtest);
Yscore_Nb = Yscore_Nb (:, 2);
%计算混淆矩阵

disp ('贝叶斯方法分类结果:')
C_nb =confusionmat (Ytest, Y_Nb);

SVM p80(没咋看)

K-means 聚类

随机选点,表示聚类中心

不停迭代,直至收敛 《我的第一本算法书》讲的很好

% % k-means 方法的Matlab实现
% % 数据准备和初始化
clc,clear

x= [0 0;1 0;0 1;1 1;2 1;1 2;2 2;3 2;6 6;7 6;8 6;

6 7;7 7;8 7;9 7;7 8;8 8;9 8;8 9;9 9];

z= zeros (2, 2);
z1= zeros (2, 2);

z=x (1:2,1:2);%寻找聚类中心

while 1

count= zeros (2, 1);

allsum= zeros (2, 2);

for i=1:20%对每一个样本,计算到两个聚类中心的距离

temp1=sqrt ((z (1,1) -x (i,1)).^2+ (z (1,2)-x (1,2)).^2);
temp2=sqrt ((z (2,1)-x(i,1)).^2+ (z (2,2) -x (1,2)).^2);
if (temp1  <temp2)

count (1) = count (1) + 1;

allsum (1, 1) =allsum (1, 1) + x (i, 1);

allsum (1,2) =allsum (1,2) +x (i,2);

else

count (2) = count (2) + 1;

al1sum (2,1) = allsum (2,1) +x (i,1);

allsum (2, 2) = allsum (2, 2) +x (i, 2);

end
end

z1 (1,1) = allsum (1,1) / count (1);
Z1 (1,2) =allsum (1,2) / count (1) ;
z1 (2,1) = allsum (2,1)/count(2);
z1 (2,2) =allsum (2,2)/count(2);
if (z==Z1)

break;
else

z=z1;
end
end

% %结果显示
disp (z1);%输出聚类中心
plot (x (:,1), x(:,2),'k*','linewidth',2,'Markersize',10,'MarkerEdgeColor','k','MarkerFaceColor',[0.5,0.5,0.5])

hold on

plot (z1 (:,1),z1 (:,2), 'ko','linewidth',2,'Markersize',10,'MarkerEdgeColor','k','MarkerFaceColor',[0.5,0.5,0.5])

set (gca, linewidth, 2) ;
xlabel('特征 x1',' fontsize',12);  
ylabel('特征 x2', 'fontsize',12);
title('K- means 分类图', 'fontsize' ,12);

相关文章

网友评论

      本文标题:Matlab一元/多元回归(后续会有更新)

      本文链接:https://www.haomeiwen.com/subject/hbmfnltx.html