大体上是Ng课week2的编程作业总结,作业中给出了实现非常好(主要是正常人都能看得懂。。)的linear regression比较完整的代码。
因为是在MATLAB/Octave环境下编程,要面对的最大的一个问题同时也是这类数学语言最大的优点就是将数据的处理全都转换成矩阵形式,即Ng所说的Vectorization,这样似乎就和传统的高级语言编程思维上有所不同,一开始这点是要注意的。本文就挑一些重点函数的实现进行讲解。
(一)CostFunction
即在MATLAB中给出X,y和一个theta向量,返回J函数的值。
function J = computeCostMulti(X, y, theta)
J = (X*theta-y)'*(X*theta-y)/2*m;
此处X为m*n的矩阵,m为training set的个数,n为我们用来进行预测的属性个数;y是m*1矩阵,即trainning set一开始给定的原始正确预测数据。
一开始实现的时候看到累加的第一反应就是用for。。。结果还忘写end,找了好久才发现错误,后来用矩阵表示一行代码就出来了。
(二)Gradient Descend
function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters) for iter = 1:num_iters theta = theta - alpha * 1/m * X'*(X*theta-y); J_history(iter) = computeCostMulti(X, y, theta); end
关于核心功能行的代码没什么好说的,就是按照公式然后写成矩阵的表达形式即可。倒是想着重说一下J_history这个矩阵,或者说,向量。它的概念很好理解,其实就是一个J和iterations的函数。每次迭代都通过前面提到costFunction来计算J的值,然后存起来,这些数据在稍后用来画图的时候会很有用。
(三)feature normalize
function [X_norm, mu, sigma] = featureNormalize(X) mu = mean(X); sigma = std(X); X_norm -= mu; X_norm ./= sigma;
就是一些基础的矩阵运算,分别求出每个属性的mean和sigma,然后保存起来,返回去,并对X做好相应的修改。
此处注意在用feature normalize求得的theta,在稍后带入新的数据进行预测时,还是要对新数据进行feature normalize的。