多变量的回归问题中,feature有多个,比如房屋价格预测问题,feature除了房屋的面积,还可能有房子的间数、房子的地段、房子的层数等因素所影响。在多变量回归问题中,我们的假设函数如下:
在此基础上,计算回归的代价函数为:
根据上面的公式,在Octave中,一行代码即可实现:
1
2
3
4
|
function J = computeCost(X, y, theta)
m = length(y); % 训练集数目
J = 1/(2*m) * sum((X*theta - y) .^ 2) ; % 代价函数
end
|
X为feature的矩阵(房子的面积、层面等),y为训练集结果矩阵(即训练集中的真实房价),theta为回归的参数(有多个)。
我们知道,对于回归模型,其核心是在求合适的各个theta参数。
在求回归模型中合适的参数时,通常使用梯度下降算法,公式如下:
这里需要注意的是,对于n+1个参数,theta1为1是恒定的,不用处理,其余n个参数进行同时更新
。
对于单变量的梯度下降算法,Octave代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1:num_iters,
% 同步更新
t1 = theta(1) - alpha * (1/m) * sum((X*theta - y));
t2 = theta(2) - alpha * (1/m) * sum((X*theta - y) .* X(:,2)) ;
theta(1) = t1 ;
theta(2) = t2 ;
J_history(iter) = computeCost(X, y, theta);
end;
end;
|
在求theta(1)
和theta(2)
时,使用了两个temp
变量,是为了对两个theta的值进行同时更新操作(先更新后赋值)。
在多变量的梯度下降算法实现中,只需要同时更新各个theta即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
temp = zeros(size(theta,1), 1);
% 同时更新theta值
for i=1:size(theta,1),
temp(i) = theta(i) - alpha * (1/m) * sum((X*theta - y).* X(:,i)) ;
end;
% 更新之后进行赋值操作
for i=1:size(theta,1),
theta(i) = temp(i);
end;
J_history(iter) = computeCostMulti(X, y, theta);
end
end
|
这里举出单变量拟合的例子,对于多变量回归,其实是一回事儿。可以看到,经过算法运行,求取了合适的参数组合,图中的蓝色直线即拟合的结果。
右图即代价函数的等高线,上的点是最终的minJ取值。
综上所述,对于多变量回归问题,我们的处理思路是寻找feature,求出假设函数,求出代价函数,在代价函数基础上利用梯度下降算法,最后验证模型的效果。实际上,在机器学习算法的逻辑回归模型中,也是这个过程。
[via@ExploitCat-91ri团队]
Copyright © hongdaChiaki. All Rights Reserved. 鸿大千秋 版权所有
联系方式:
地址: 深圳市南山区招商街道沿山社区沿山路43号创业壹号大楼A栋107室
邮箱:service@hongdaqianqiu.com
备案号:粤ICP备15078875号