1、线性逻辑回归
系统函数
返回具有对象a的每个维度的大小(元素数量)的行向量。
options = optimset (par, val, …)
为优化功能创建选项结构。
在没有任何输入或输出参数的情况下调用时,optimset打印所有有效优化参数的列表。
当使用一个输出调用并且没有输入时,返回一个选项结构,其中所有有效选项参数初始化为[]。
当使用参数/值对列表进行调用时,只返回初始化了指定参数的选项结构。
参数列表
Display
要求详细显示优化结果。参数值是:
"off" [default]
没有显示。
“ITER”
显示每个循环迭代的中间结果。
"final"
显示最终循环迭代的结果。
"notify"
如果函数未能收敛,则显示最终循环迭代的结果。
FinDiffType
FunValCheck
启用后,如果目标函数返回无效值(复数,NaN或Inf),则显示错误。必须设置为“开”或“关”[默认]。注意:在这种情况下,函数fzero和fminbnd可以正确处理Inf值,只有复数值或NaN会导致错误。
GradObj
当设置为“on”时,要被最小化的函数必须返回第二个参数,该参数是点x处函数的梯度或一阶导数。如果设置为“关闭”[默认],则通过有限差分计算梯度。
Jacobian
当设置为“on”时,要被最小化的函数必须返回第二个参数,该参数是点x处函数的雅可比行列式或一阶导数。如果设置为“关闭”[默认],雅可比行列式通过有限差分计算。
MaxFunEvals
优化停止前,功能评估的最大数量。必须是正整数。
MAXITER
优化之前的最大算法迭代次数停止。必须是正整数。
OutputFcn
每个算法迭代执行一次用户定义的函数。
TolFun
功能输出的终止标准。如果一个算法迭代与下一个算法迭代之间计算出的目标函数的差值小于TolFun,则停止优化。必须是积极的标量。
TolX
功能输入的终止标准。如果一个算法迭代与下一个迭代之间的当前搜索点x的差值小于TolX,则优化停止。必须是积极的标量。
[theta,cost]=fminunc(@(t)(costFunction(t, X, y)), initial_theta, options)
解决由函数fcn定义的无约束优化问题。
fcn应该接受一个定义未知变量的向量(数组),并返回目标函数值,可选地带有渐变。 fminunc试图确定一个向量x,使得fcn(x)是一个局部最小值。
x0决定一个开始的猜测。所有对fcn的调用都会保留x0的形状,否则将被视为列向量。
选项是指定附加选项的结构。目前,fminunc可识别以下选项:“FunValCheck”,“OutputFcn”,“TolX”,“TolFun”,“MaxIter”,“MaxFunEvals”,“GradObj”,“FinDiffType”,“TypicalX”,“AutoScaling”。
如果“GradObj”为“on”,则它指定当用两个输出参数调用fcn时,还会返回请求点处的部分一阶导数的雅可比矩阵。 TolX指定未知变量x的终止容差,而TolFun是目标函数值fval的容限。两种选项的默认值均为1e-7。
或其他选项的说明,请参阅优化集。
返回时,x是最小值的位置,fval包含x处目标函数的值。
信息可能是以下值之一:
1
融合到解决方案点。相对梯度误差小于TolFun指定的误差。
2
最后的相对步长小于TolX。
3
函数值的最后相对变化小于TolFun。
0
超出迭代限制 - 最大算法迭代次数MaxIter或最大功能评估次数MaxFunEvals。
-1
算法由OutputFcn终止。
-3
信任区半径变得过小。
可选地,fminunc可以返回具有收敛统计量(输出),解x处的输出梯度(grad)和解x处的近似Hessian(hess)的结构。
应用笔记:如果目标函数是一个变量的单个非线性方程,那么使用fminbnd通常是一个更好的选择。
fminunc使用的算法是一种梯度搜索,它依赖于目标函数是可微分的。如果函数具有不连续性,则最好使用fminsearch之类的无衍生算法。
自定义函数
画散点图标记分类结果
plotData(X, y);
figure; hold on;
pos = find(y==1);
neg = find(y == 0);
plot(X(pos, 1), X(pos, 2), 'k+','LineWidth', 2, 'MarkerSize', 7);
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y','MarkerSize', 7);
hold off;
end
定义代价函
function [J, grad] = costFunction(theta, X, y)
m = length(y);
J = 0;
grad = zeros(size(theta));
h=sigmoid(X*theta);
J=1/m*sum((-y'*log(h)-(1-y)'*log(1-h)));
grad = 1 / m * X' * (sigmoid(X * theta) - y);
end
定义画分类边界线函数,函数如下:
function plotDecisionBoundary(theta, X, y)
plotData(X(:,2:3), y);
hold on
if size(X, 2) <= 3
plot_x = [min(X(:,2))-2, max(X(:,2))+2];
plot_y = (-1./theta(3)).*(theta(2).*plot_x + theta(1));
plot(plot_x, plot_y)
legend('Admitted', 'Not admitted', 'Decision Boundary')
axis([30, 100, 30, 100])
else
u = linspace(-1, 1.5, 50);
v = linspace(-1, 1.5, 50);
z = zeros(length(u), length(v));
for i = 1:length(u)
for j = 1:length(v)
z(i,j) = mapFeature(u(i), v(j))*theta;
end
end
z = z';
contour(u, v, z, [0, 0], 'LineWidth', 2)
end
hold off
end
定义预测函数
function p = predict(theta, X)
m = size(X, 1);
p = zeros(m, 1);
result = sigmoid(X * theta);
p = result > 0.5;
end
1、导入数据、变量命名
data = load('ex2data1.txt');
X = data(:, [1, 2]); y = data(:, 3);
2、画散点图,标记根据y标记分类结果
plotData(X, y);
3、指定坐标轴选项
hold on;
xlabel('Exam 1 score')
ylabel('Exam 2 score')
legend('Admitted', 'Not admitted')
hold off;
4、数据预处理
[m, n] = size(X);
X = [ones(m, 1) X];
initial_theta = zeros(n + 1, 1);
5、定义代价函数约束条件
[cost, grad] = costFunction(initial_theta, X, y);
6、无约束条件下计算theta,指定代价函数是costfunction为迭代起始函数,intitial_theta为初始值,options为参数进行无约束函数求解
options含义,打开梯度下降,最大迭代400次
options = optimset('GradObj', 'on', 'MaxIter', 400);
[theta, cost] = ...
fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);
7、增加分界线
plotDecisionBoundary(theta, X, y);
8、预测分类
prob = sigmoid([1 45 85] * theta);
predict(theta,[1 45 85])
p = predict(theta, X);
2、非线性逻辑回归
自定义函数
特征变量函数
function out = mapFeature(X1, X2)
函数如下:
degree = 6;
out = ones(size(X1(:,1)));
for i = 1:degree
for j = 0:i
out(:, end+1) = (X1.^(i-j)).*(X2.^j);
end
end
end
定义代价函数
函数如下,调用了函数costFunction(theta,X,y)
function [J, grad] = costFunctionReg(theta, X, y, lambda)
m = length(y);
J = 0;
grad = zeros(size(theta));
[J , grad] = costFunction(theta, X, y);
J = J + lambda / (2*m) * (sum(theta.^2) - theta(1)^2);
grad = grad + lambda / m * theta;
grad(1) = grad(1) - lambda / m * theta(1);
end
1、导入数据,变量赋值
data = load('ex2data2.txt');
X = data(:, [1, 2]); y = data(:, 3);
2、画图,标注坐标轴标签,图例
plotData(X, y);
hold on;
xlabel('Microchip Test 1')
ylabel('Microchip Test 2')
legend('y = 1', 'y = 0')
hold off;
3、定义特征变量
X = mapFeature(X(:,1), X(:,2));
4、初始化赋值
initial_theta = zeros(size(X, 2), 1);
lambda = 1;
5、代价函数cost约束条件和
[cost, grad] = costFunctionReg(initial_theta, X, y, lambda);
6、梯度下降计算grad和cost
options = optimset('GradObj', 'on', 'MaxIter', 400);
[theta, J, exit_flag] = ...
fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options);
7、画分界线
plotDecisionBoundary(theta, X, y);
hold on;
title(sprintf('lambda = %g', lambda))
xlabel('Microchip Test 1')
ylabel('Microchip Test 2')
legend('y = 1', 'y = 0', 'Decision boundary')
hold off;
8、预测
p = predict(theta, X);
fprintf('Train Accuracy: %f\n', mean(double(p == y)) * 100);
fprintf('Expected accuracy (with lambda = 1): 83.1 (approx)\n');