Stanford ML - Linear regression with multiple variables 多变量线性回归

时间:2021-07-23 17:33:26

同样的,先来一些定义:

Stanford ML - Linear regression with multiple variables 多变量线性回归

多变量线性回归方程为:

Stanford ML - Linear regression with multiple variables 多变量线性回归

相应的cost function为:

Stanford ML - Linear regression with multiple variables 多变量线性回归

把这个cost function代入梯度下降公式求偏导得:

Stanford ML - Linear regression with multiple variables 多变量线性回归

多变量线性回归有几点需要注意:

1. Feature scaling: 尽量使得各个变量的值域范围相近,比如 -1 < x < 1,这样可以加速梯度下降算法的收敛。

2. Mean normalization: 均值归一化,也就是使得每个feature的数据集均值大概为0.

3. Learning rate: 每次迭代都得保证J收敛,alpha太小收敛会很慢,太大可能不收敛。可以选择指数公式来尝试,比如0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, ...

根据前两点,training set的x可以转换为 (x-u)/S,这里u是均值,S可以是范围x(max) - x(min),也可以取标准差standard deviation。


对于多项式回归,我们也可以用线性回归的思想来解。这里feature(多项式)形式的选择,对拟合的准确性有较大的影响。

Stanford ML - Linear regression with multiple variables 多变量线性回归

对于线性回归,除了梯度下降算法,还可以用Normal equation(正规方程组)来求解,线性代数的重要性来了 - 两者联系起来,有一种豁然开朗的感觉,大学里的线性代数原来可以干这个,反正现在是一点都不记得了。慢慢拾起来吧。这里的思想呢,就是对各个feature求偏导,然后让它等于0,求解方程组,最终得到theta:

Stanford ML - Linear regression with multiple variables 多变量线性回归

怎么推导出来的,还不懂,后面看了线性代数再回头试着推一下吧。这个用Matlab就很容易算出来了。梯度下降得需要写个循环程序来实现,框架如下:

features = size(X, 2);
for iter = 1:num_iters    sum = zeros(features, 1);    for i = 1:m        delta = X(i,:)*theta - y(i);        for feature = 1:features            sum(feature) = sum(feature) + delta*X(i,feature);        end    end        sum = sum .* alpha ./ m;    theta = theta - sum;    % ============================================================    % Save the cost J in every iteration        J_history(iter) = computeCostMulti(X, y, theta);end

看起来感觉正规方程组更简单一些。不过它有一个求逆矩阵的步骤,是O(n^3)的时间复杂度,所以n太大,比如大于10000,速度会很慢,这时建议用gradient descent来求解。下图是讲义上的优劣比较:

Stanford ML - Linear regression with multiple variables 多变量线性回归