raw-011
现在公司是做通信工程的,积累了很多工程数据,这里尝试用线性回归找出数据间规律。
选取了4个特征:合同工期,设备用量,线材用量,施工面积
假设函数:
成本函数:
期望:
优化方法-梯度下降:
随机初始化参数,然后选择0.1作为学习效率,带入数据循环计算,求得成本函数最小;
如果发现成本函数来回震荡,一直不收敛,可以尝试缩小学习效率为原来的1/3,直到收敛;
到这里模型建立好了,现在用Octave来实现模型,看看效果:
1. 编写成本函数
function J = costFunction1(X, y, theta)
%X ia the "input matrix" containing our training examples.
% y is the class labels
m = size(X, 1);
predictions = X * theta;
sqrERRORs = (predictions-y).^2;
J = 1/(2*m)*sum(sqrErrors);
检验一下:
跟直接计算结果一致:
2. 方法一:编写梯度下降函数
function [theta, J_history] = gradientDescent1(X,y,theta,alpha, num_iters)
m = length(y);
j_history = zeros(num_iters, 1);
for iter = 1:num_iters
partial1 = 0;
partial2 = 0;
partial3 = 0;
partial4 = 0;
partial5 = 0;
for i=1:m
xsub = X(i,:);
ysub = y(i,:);
partial1 += (dot(transpose(theta), xsub, 2) - ysub)*X(i,1);
partial2 += (dot(transpose(theta), xsub, 2) - ysub)*X(i,2);
partial3 += (dot(transpose(theta), xsub, 2) - ysub)*X(i,3);
partial4 += (dot(transpose(theta), xsub, 2) - ysub)*X(i,4);
partial5 += (dot(transpose(theta), xsub, 2) - ysub)*X(i,5);
endfor
theta(1,:) = theta(1,:) - alpha * partial1/m;
theta(2,:) = theta(2,:) - alpha * partial2/m;
theta(3,:) = theta(3,:) - alpha * partial3/m;
theta(4,:) = theta(4,:) - alpha * partial4/m;
theta(5,:) = theta(5,:) - alpha * partial5/m;
J_history(iter) = costFunction1(X, y, theta);
endfor
end
生成些随机数据求解测试:
查看结果:
100次迭代后偏差0.046,此时的theta:
从这个结果看,如果第三特征是『线材用量』,那么可以得出结论:项目预算与线材用量关系最紧密:
项目预算 = 0.378 + 0.096 * 合同工期 + 0.044 * 设备用量 + 0.304 * 线材用量 + 0.020 * 施工面积;
3. 方法二:使用Octave提供的梯度下降函数
首先需要修改成本函数,新的成本函数要返回预测偏差及梯度:
function [J, grad] = costFunction2(theta, X, y)
%X ia the "input matrix" containing our training examples.
% y is the class labels
m = size(X, 1);
predictions = X * theta;
sqrErrors = (predictions-y).^2;
J = 1/(2*m)*sum(sqrErrors);
grad = zeros(5,1);
for i=1:m
xsub = X(i,:);
ysub = y(i,:);
grad(1) += (dot(transpose(theta), xsub, 2) - ysub)*X(i,1);
grad(2) += (dot(transpose(theta), xsub, 2) - ysub)*X(i,2);
grad(3) += (dot(transpose(theta), xsub, 2) - ysub)*X(i,3);
grad(4) += (dot(transpose(theta), xsub, 2) - ysub)*X(i,4);
grad(5) += (dot(transpose(theta), xsub, 2) - ysub)*X(i,5);
endfor
end
然后设置options,初始化theta,调用fmnunc函数:
4. 来做下两种方式的效率对比:
首先,初始化相同的theta
然后先使用fminunc:
100次迭代后达到0.20734的偏差;
用自己写的函数:
981次迭代后达到0.20734的偏差;
还是内嵌的函数更高效:)fminunc函数比自己写的函数几乎快了10倍。
5.最终结果
项目预算 = -2.022 + 0.616 * 合同工期 + 0.540 * 设备用量 + 1.736 * 线材用量 + 2.179 * 施工面积;
相关阅读
多元线性回归的思路 和简单线性回归相比 x 由一个特征,变为一个向量 X,含有多个特征。 找出一条直线(多维度实际不是直线,只是为了
# Multiple Linear Regression # Importing the librariesimport numpy as npimport matplotlib.pyplot as pltimport pandas as
多项式回归(polynomial regression)转换为线性回归(linea
一、介绍一元m次多项式回归方程:二元二次多项式回归方程:多元多次的多项式回归方程较复杂,加之实际生产生活中一元m次多项式归回就已
线性回归 - 机器学习多元线性回归 - 一步一步详解 - P
目录 数据导入 单变量线性回归 绘制散点图 相关系数R 拆分训练集和测试集 多变量线性回归 数据检验(判断是否可以做线性回归) 训练
1.线性回归 1.1模型 1.1.1目标函数(损失函数、正则) a.无正则:最小二乘线性回归(OLS) b.L2正则:岭回归(Ridge Regression) c.L1正则:Lass