大家好,又见面了,我是你们的朋友全栈君。
Lasso回归
clc,clear;
close all;
data=[1.54 1.61 1.62 1.66 1.71 1.72 1.73 1.86 1.92 2 2.21 2.29 2.34 2.38 2.42 2.44 2.57 2.64 2.71 2.85 2.93 3.01 3.14 3.22 3.34 3.49 3.55 3.79 3.99 4.12
20.1 20.1 20.3 20.4 20.4 20.5 20.6 20.7 20.9 21.1 21.3 21.5 21.7 21.9 22 22.2 22.4 22.5 22.7 22.7 22.8 22.9 23.4 23.7 24.4 24.9 25.3 27.4 28.4 29.1
5.17 5.14 5.13 5.10 5.08 5.03 5.01 4.99 4.93 4.91 4.89 4.81 4.77 4.75 4.62 4.56 4.5 4.48 4.46 4.31 4.28 4.19 4.12 3.99 3.91 3.84 3.75 3.64 3.51 3.5]';
m=size(data,1);
x=[ones(m,1),data(:,1:2)];%前两列为自变量,再添加一列常数项
y=data(:,3);%最后一列为因变量
runnums = 200000;%迭代的步数
eps = 0.0001;%调整步长
Res = StageWise(x, y, eps, runnums);
y1=x*Res(end,:)';
%根据Res画 参数收敛
figure
hold on
xAxis = 1:runnums;
plot(xAxis, Res(:,1),'r');
plot(xAxis, Res(:,2),'b');
plot(xAxis, Res(:,3),'k');
legend('x1参数','x2参数','x3参数')
%拟合
figure
hold on
plot(y,'b');
plot(y1,'r');
legend('原数据','拟合数据')
逐步回归
%逐步回归
function [ Res ] = StageWise( x, y, eps, runtime)
[m,n] = size(x);%数据集的大小
Res = zeros(runtime, n);%最终的结果
w = zeros(n,1);
wMax = zeros(n,1);
for i = 1:runtime
ws = w';%输出每一次计算出来的权重
lowestError = inf;%定义最小值
for j = 1:n
for sign = -1:2:1
wTest = w;%初始化
wTest(j) = wTest(j)+eps*sign;%只改变一维变量
yTest = x*wTest;
%求误差
rssE = RegressError(y, yTest);
if rssE < lowestError%如果好,就替换
lowestError = rssE;
wMax = wTest;
end
end
end
w = wMax;
Res(i,:) = w;
end
end
求误差平方和
function [ error ] = RegressError( y, yTest )
yDis = y-yTest;%误差
[m,n] = size(yDis);
%求平方
for i = 1:m
yDis(i) = yDis(i)^2;
end
error = sum(yDis);%求列和
end
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142850.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...