赞
踩
给算法一个数据集,其中包含着正确的答案;
该算法的目的:输入一组数,给出更多预测的正确答案。
回归问题就是监督学习中的某个分支,本篇文章以斯坦福大学的吴老师所讲的房价预测为例,解释多变量线性回归模型。


上面的图是视频上截图的,基本意思直接看下面的图吧:

最后的价格等于矩阵Xxtheta(列向量,就是权重),通常要把X矩阵的第一列置成1。因为一次函数的原型是f(X)=axX+b,如果我们要表示成上面形式的话,令x0等于1,等价于f(theta)=x0xtheta0+x1xtheta1(假设此时只有two variables)。
最后假设函数的公式就是hθ(X) = X x θ
Matlab可视化文件中的47个点。

多变量的假设函数(在本文也可以叫线性回归函数) ,用假设函数来模拟。下面要讲的梯度下降法和正则方程法都是试图找到一条直线,使所有样本到直线上的损失之和最小;
多变量的代价函数(这里用均方误差损失函数),用代价函数来表示误差值。打草稿的时候最后代价函数忘了平均了,忘记除以2m了。。。


手动求导:

计算损失函数的m文件:
function result = cost_1_FunctionJ( x,y,theta )
m=length(x(:,1));
n=length(x(1,:));
prediction=x*theta; %预测值,这里的theta是列向量
sqrErrors=(prediction-y).^2; %方差
result=1/(2*m)*sum(sqrErrors);
end
梯度下降的m文件:
function destination = gradient_decline( X,y,theta ) alpha=0.01; i=1; iter=1000; m=length(X(:,1)); %样本数 J=zeros(1,iter); while i<iter, %注释是当theta为列向量时候的做法 %J(i)=cost_1_FunctionJ(X,y,theta); %offset=((X*theta-y)'*X)'; J(i)=cost_1_FunctionJ(X,y,theta'); offset=(X*theta'-y)'*X; theta=theta-1/m*alpha*offset; i=i+1; end; plot(1:iter,J); title('loss funciton'); destination=theta; end
线性回归demo,此处采用最标准的特征缩放。当然也可以采用简单的缩放,比如直接除以那一列特征值中的最大数。
function theta_new = line_regression( ) x=load('D:\machineLearning\线性回归模型\ex3Data\ex3x.dat'); y=load('D:\machineLearning\线性回归模型\ex3Data\ex3y.dat'); plot3(x(:,1), x(:,2), y, 'r*'); n=length(x(1,:)); m=length(x(:,1)); %样本数 %x(:,2)=x(:,2)./max(x(:,2)); 较为简单的特征缩放 直接除以某个特征值中的最大值 %x(:,3)=x(:,3)./max(x(:,3)); x(:,1)=(x(:,1)-mean(x(:,1)))./std(x(:,1)); %特征缩放 mean表示某个特征值中的平均值,std表示某个特征值中的标准差 x(:,2)=(x(:,2)-mean(x(:,2)))./std(x(:,2)); x=[ones(m,1), x]; %x0为1 %theta=[0;0;0]; %theta为列向量时候做出相应修改 theta=[0 0 0]; theta_new=gradient_decline(x,y,theta); end


最后,这个误差值的数量级是非常大的,因为房价的都是百万为单位的,不是算法实现有问题。是data有问题。
第一次写博客,有点小激动!

当X的转置矩阵和X矩阵乘积的矩阵不可逆的时候,Matlab里面用pinv()函数可以解决这个问题。不可逆问题的本质是矩阵的特征值有相同的,所以只要去掉重复的特征值,确保特征值不同,在对矩阵缩放也可以搞出来。

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。