在当今时代,数据是一个很重要的部分。随随便便比如医疗保障机构存储的问诊人的信息就要占很大的空间,因此如何管理数据就显得极为重要了。又比如奥巴马当初的胜选是以270选举人选票为目标函数,利用历史投票数据,对每个选民建立支持概率模型,说服可能性概率模型和投票率概率模型。
然后具体来说,线性回归是建立在有一堆数据集,然后建立了一个线性,模型,利用数据集对其进行不断的训练,得到最合适的参数列表,然后利用得到的参数计算测试集样例,考察准确性。
考虑只有一个特征的时候
假设
考虑成本函数最小
这里就要用到梯度下降的方法了。
alpha是学习率,然后theta就是我们要通过训练集得到的参数值了
但是如果学习率太低了会造成梯度下降太慢,
如果学习率太高了会造成震荡,甚至无法收敛
最后的做法就是直接套用公式了
附上自己写的matlab代码(因为直接用其中的矩阵运算可以省去很多麻烦==)
function [ reference ] = LR()
Matrix = csvread('save_train.csv', 1, 1);
[m,n] = size(Matrix);
alpha = 0.01;
X = ones(m,n);
Y = zeros(1,m);
X(1:m,2:n) = Matrix(1:m,1:n-1);
Y(1,:) = Matrix(:,n)';
theta = zeros(1,n);
result1 = zeros(1,m);
alpha = 0.5;
for j =1:1000 %循环迭代1000次
init = theta;
for i=1:m
result1(i) = theta*X(i,:)'-Y(i); %将中间结果存储下来
end
cost1 = sum(result1.*result1)/(2*m); %计算cost函数
tmp = zeros(1,n);
for i=1:n
tmp(i) = result1*X(:,i);
end
theta = theta-alpha.*tmp/m; %更新theta参数
for i=1:m
result2(i) = theta*X(i,:)'-Y(i);
end
cost2 = sum(result2.*result2)/(2*m); %计算更新后的cost值
if cost2>=cost1 %比较前后的cost,看是否应该减小alpha
alpha = alpha/3;
theta = init;
end
end
%Mtest = csvread('save_test.csv', 1, 1);
Mtest = Matrix(1:m,1:n-1);
[height,width] = size(Mtest);
MTest = ones(height,width+1);
MTest(1:height,2:width+1) = Mtest(:,:);
for i=1:height
reference(i) = theta*MTest(i,:)';
Id(i) = i-1;
end
rmse=sqrt(sum((Y-reference).^2)/m) ;%计算rmse(均方差)
disp(rmse);
%%构造表格
% reference = reference';
% Id = Id';
% columns={'Id', 'reference'};
% data=table(Id, reference,'VariableNames',columns);
% writetable(data,'submission.csv');
end
这里我直接用原数据集进行训练和检测==毕竟搞不到测试集的结果,无法对比效果。最后用梯度下降的方法可以使得rmse在9+。