本文是基于Prof.Ng 的机器学习课程作业所作的解释,代码和解释都是自己写的,有错误还请谅解,转载请注明原文链接。
0 线性代数运算基础
- 实数*矩阵 = 实数.*矩阵
- 为了防止混淆,可以如下记忆
.*
就是每个对应每个元素相乘,结果还是一个向量或者矩阵;*
是矩阵乘法,在本文中很多先乘再连加的算法都是用的矩阵乘法。 - 很多时候由公式到代码的实现会一下子恰住该用哪个乘法?这时候可以看结果的维度。
1.代价函数 Cost Function
function [J, grad] = costFunctionReg(theta, X, y, lambda)
m = length(y); % 训练集数量
J = 0;
grad = zeros(size(theta));
h = sigmoid(X*theta); %X[m*n] theta[n*1] [m*1]
c1 = -y'*log(h);
c2 = (1-y)'*log(1-h);
theta(1) = 0; %默认的theta0不参与正规化,因为每次迭代都会重新传入theta参数,所以也不会对后续迭代的theta产生影响
r = lambda / (2*m) * (theta'*theta); %正规化
J = (1/m) * (c1-c2) + r; %不加r部分就是不包含正规化的代价函数
grad = (1.0/m) .* X' * (h - y) + lambda / m * theta; %包含正规化的偏导计算
2. 梯度下降 Gradient Descent
这里没有手动编写下降算法,而是用自带的fminunc()函数。
initial_theta = zeros(size(X, 2), 1); %训练集列数就是不包含θ0的参数个数,所以还要+1
options = optimset('GradObj', 'on', 'MaxIter', 400); %提供偏导值;最高迭代次数400
% Optimize
[theta, J, exit_flag] = fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options);
3. 准确性校验
校验可以采用如下方法。
把梯度下降得出的theta值与原来的训练集作为参数重新计算,将结果与训练集的结果做对比。
function p = predict(theta, X)
prediction = sigmoid(X*theta);%此处theta为最后的梯度下降得出的结果
p = floor(prediction/0.5); %>=0.5 输出1,
end;
p = predict(theta, X) %theta 为之前计算出来的结果s
accuracy = mean(double(p==y)) * 100 %百分比形式
网友评论