可以参考如下文章
https://blog.csdn.net/sinat_37965706/article/details/69204397
第一节中说了,logistic 回归和线性回归的区别是:线性回归是根据样本X各个维度的Xi的线性叠加(线性叠加的权重系数wi就是模型的参数)来得到预测值的Y,然后最小化所有的样本预测值Y与真实值y'的误差来求得模型参数。我们看到这里的模型的值Y是样本X各个维度的Xi的线性叠加,是线性的。
Y=WX (假设W>0),Y的大小是随着X各个维度的叠加和的大小线性增加的,如图(x为了方便取1维):
然后再来看看我们这里的logistic 回归模型,模型公式是:,这里假设W>0,Y与X各维度叠加和(这里都是线性叠加W)的图形关系,如图(x为了方便取1维):
我们看到Y的值大小不是随X叠加和的大小线性的变化了,而是一种平滑的变化,这种变化在x的叠加和为0附近的时候变化的很快,而在很大很大或很小很小的时候,X叠加和再大或再小,Y值的变化几乎就已经很小了。当X各维度叠加和取无穷大的时候,Y趋近于1,当X各维度叠加和取无穷小的时候,Y趋近于0.
这种变量与因变量的变化形式就叫做logistic变化。(注意不是说X各个维度和为无穷大的时候,Y值就趋近1,这是在基于W>0的基础上,(如果W<0,n那么Y趋近于0)而W是根据样本训练出来,可能是大于0,也可能是小0,还可能W1>0,W2<0…所以这个w值是样本自动训练出来的,也因此不是说你只要x1,x2,x3…各个维度都很大,那么Y值就趋近于1,这是错误的。凭直觉想一下也不对,因为你连样本都还没训练,你的模型就有一个特点:X很大的时候Y就很大。这种强假设肯定是不对的。因为可能样本的特点是X很大的时候Y就很小。)
所以我们看到,在logistic回归中,X各维度叠加和(或X各维度)与Y不是线性关系,而是logistic关系。而在线性回归中,X各维度叠加和就是Y,也就是Y与X就是线性的了。
X各维度叠加和Y的关系不只是这一种,还可能是其他的比如:
为什么变量与因变量要选用logistic关系呢,因为这里(1)我们需要Y代表的是概率即Y∈(0,1)。(2)我们需要X各维度叠加和在0附近变化幅度比较大,并且是非线性的变化。而在很大或很小的时候,几乎不变化,这是基于概率的一种认识与需要。感性的一个例子,想想你学习努力的程度与从60分提高到80分和80提高到100分并不是线性的。(3)这个关系的公式要在之后形成的cost function是凸函数。
所以就选择了logistic。
前面已经说了,我们使用logistic回归是用于二分类问题(y只有两个值A,B,也可以写成1和0,这都没关系),回归模型得到的结果不是预测样本X对应的y值(注意下,在logistic回归这里我们小写y表示某个样本Xi的类别,而大写Y或Y(Xi)表示logistic回归模型对某个样本Xi预测为1的概率。其实这里最好把Y用其他字母表示,以免混淆,但是已经这里写了,以后注意。),而是y=1的概率或y=0的概率。我们假设y=1的概率公式是:,那么y=0的概率就是
。(注意我们也可以y=0的概率公式为前面那一个,这里是任意的。这里不同的结果只是最终的W参数不同罢了。因为我们最终的W是训练出来的,不管怎么样,模型都会表现出样本的特点来。只是我们习惯了把Y(X)当成y=1的logistic模型映射的概率)
还要注意这里我们不是对一个Xi都要分别预测出来y=1的概率和y=0的概率。而是对于一个Xi,如果它的yi=1,那么我们就用这个公式映射所对应的概率,如果对于一个Xi,如果它的yi=0,那么我们就用
这个公式映射所对应的概率。都是根据yi的值映射出来一个概率。
因为我们的Y是概率,我们不能利用最小误差等,我们这里用的是极大化所有样本的对数似然函数:。
yi表示的是Xi真实所属的类别(1或0)。L(W)就是cost function。这里的目标函数值和W有关系,也就是X各维度线性叠加的那些权重有关系。
那么这些权重的物理意义是什么呢?就是X各维度与Y值关系的那个方向,听起来可能很抽象,现在看一下具体例子(X为二维,但考虑将常数项变成齐次后X就是三维了,第一维是1,因此W也是三维的,第一维是常数项,大小不影响那个方向,主要考虑后面的两个值的关系),比如:
当W=[-15 0.2 0.2],图形为:(一种45°方向的关系)
当W=[-15 -0.2 -0.2],图形为:(一种-45°方向的关系)
当W=[-15 0.2 0.01],图形为:(一种0°方向(沿x轴形成的logistic关系)的关系)
当W=[-15 0.01 0.2],图形为:(一种90°方向(沿y轴形成的logistic关系)的关系)
下面我们对L(W)求极值。
L(W)是negtive 的似然函数。只有是negtive的,才能用梯度下降法求最小值,如果不是negtive的,就要用梯度上升法求最大值了,我们一般不用那个。还要注意我们的代价函数不管是最小二乘法、误差均方、似然函数等,都要求平均,就是前面加上1/m.利用梯度下降法求得的迭代公式是:,其中wj代表的是模型参数向量W的第j个元素。
α代表的是学习速率,yi表示的是第i个样本向量的真实标签(label),也就是第i个样本向量所属的类别(0或1),Y(Xi)表示的是回归模型预测的第i个样本向量为1的概率。xij表示的第i个样本向量Xi的第j个元素。小心不要忘了Σ(i=1:m)。 还要注意因为梯度下降法梯度是目标函数分别对模型参数向量W的第每一个元素求偏导,所以这里W的第每一个元素的值是一个一个求出来的。当然在matlab中,虽然是按向量导入计算的数据,但是本质上还是一个一个计算的w的每个值,而不是直接求的这个向量是多少。后来又看了看,前面说的这就句话不对,虽然求偏导是分别对W的每一维度求,但是这个L(w)每一次迭代的梯度向量是可以一次求出来的,也是可以在公式里直接表达出来的。不是说公式中只能一次写一个向量的一维,可以写一个向量。而matlab与公式的区别在于,比如X这个样本可以把所有的n个样本都包括,不用Σ;而在公式中只能表示一个样本,然后用Σ表示出所有样本(正是这个原因,在matlab中写的代码才会和公式模样不一样)。而不是之前说的公式中只能表达一个样本的一维。
我们注意到这个迭代公式和线性回归的迭代公式形式是一样的,只是在线性回归中Y(Xi)为Xi的各维度线性叠加即WXi=WXi,而这里Xi的各维度线性叠加WXi以后,还要进行一次非线性映射(即logistic映射),非线性的映射到(0,1)之间Y(Xi)。所以也可以认为logstic回归也是处理的线性问题,即也是求的各维度线性叠加的权重系数,只是求得了各维度线性叠加和以后,不是与Xi所属的类别进行比较,而是非线性映射到所属类别的概率,然后最大似然函数法求模型参数(也就是那个各维度线性叠加的权重,而后面的非线性映射logstic那里没有参数)。
下面说一个例子:训练样本的特征为80个学生的两门功课的分数,样本值yi为对应的同学是否允许被上大学。训练好以后,用训练好的模型根据某个学生的成绩预测是否被允许上大学?数据中给出被允许上大学为1,不被允许上大学为0。
程序代码(梯度下降法):
1: clear all; close all; clc 2: x = load('ex4x.dat'); %每一行是一个样本 3: y = load('ex4y.dat'); 4: [m, n] = size(x); 5: sample_num = m; 6: x = [ones(m, 1), x]; %x增加一维。因为前面文字或前几节说了 7: % Plot the training data 8: % Use different markers for positives and negatives 9: figure; 10: pos = find(y == 1); neg = find(y == 0);%pos 和neg 分别是 y元素=1和0的所在的位置序号组成的向量 11: plot(x(pos, 2), x(pos,3), '+')%用+表示那些yi=1所对应的样本 12: hold on 13: plot(x(neg, 2), x(neg, 3), 'o') 14: hold on 15: xlabel('Exam 1 score') 16: ylabel('Exam 2 score') 17: itera_num=500;%迭代次数 18: g = inline('1.0 ./ (1.0 + exp(-z))'); %这个就相当于制造了一个function g(z)=1.0 ./ (1.0 + exp(-z)) 19: plotstyle = {'b', 'r', 'g', 'k', 'b--', 'r--'}; 20: figure;%建立新的窗口 21: alpha = [ 0.0009, 0.001,0.0011,0.0012,0.0013 ,0.0014 ];%下面就分别用这几个学习速率看看哪个更好 22: for alpha_i = 1:length(alpha) %alpha_i是1,2,...6,表示的是学习速率向量和曲线格式向量的坐标:alpha(alpha_i),plotstyle(alpha_i) 23: theta = zeros(n+1, 1);%thera表示样本Xi各个元素叠加的权重系数,这里以向量形式表示,且初始都为0,三维向量 24: J = zeros(itera_num, 1);%J是个100*1的向量,第n个元素代表第n次迭代cost function的值(下面用negtive 的对数似然函数, 25: %因为是negtive 的,所以是求得极小值) 26: for i = 1:itera_num %计算出某个学习速率alpha下迭代itera_num次数后的参数 27: z = x * theta;%这个z是一个列向量,每一个元素是每一个样本Xi的线性叠加和,因为X是所有的样本,因此这里不是一个一个样本算的, 28: %而是所有样本一块算的,因此z是一个包含所有样本Xi的线性叠加和的向量。在公式中,是单个样本表示法,而在matlab中都是所有的样本一块来。 29: h = g(z);%这个h就是样本Xi所对应的yi=1时,映射的概率。如果一个样本Xi所对应的yi=0时,对应的映射概率写成1-h。 30: J(i) =(1/sample_num).*sum(-y.*log(h) - (1-y).*log(1-h));%损失函数的矢量表示法 这里Jtheta是个100*1的列向量。 31: grad = (1/sample_num).*x'*(h-y);%在程序中X是包括所有的X样本,公式中只能是每一个样本Xi,所以不能直接把公式照搬,所以要认真看看,代码中相应改变一下。 33: theta = theta - alpha(alpha_i).*grad; 34: end 35: plot(0:itera_num-1, J(1:itera_num),char(plotstyle(alpha_i)),'LineWidth', 2) %此处一定要通过char函数来转换因为包用()索引后得到的还是包cell, 36: %所以才要用char函数转换,也可以用{}索引,这样就不用转换了。 37: %一个学习速率对应的图像画出来以后再画出下一个学习速率对应的图像。 38: hold on 39: if(1 == alpha(alpha_i)) %通过实验发现alpha为0.0013 时效果最好,则此时的迭代后的theta值为所求的值 40: theta_best = theta; 41: end 42: end 43: legend('0.0009', '0.001','0.0011','0.0012','0.0013' ,'0.0014');%给每一个线段格式标注上 44: xlabel('Number of iterations') 45: ylabel('Cost function') 46: prob = g([1, 20, 80]*theta); %把[1, 20, 80]*theta这个带入g(z)得到的就是在exam1=20、exam2=80的条件下,通过的概率(也就是Y=1)的概率是多少。 47: %画出分界面 48: % Only need 2 points to define a line, so choose two endpoints 49: plot_x = [min(x(:,2))-2, max(x(:,2))+2];%两个点就可以画出来直线,这里这么取x1坐标是让直接的视野更容易包含那些样本点。 50: plot_y = (-1./theta(3)).*(theta(2).*plot_x +theta(1));%分界面怎么画呢?问题也就是在x1,x2坐标图中找到 %那些将x1,x2带入1/(1+exp(-wx))后,使其值>0.5的(x1,x2) 51: %坐标形成的区域,因为我们知道1/(1+exp(-wx))>0.5 52: %意味着该区域的(x1,x2)表示的成绩允许上大学的概率>0.5,那么其他的区域就是不被允许上大学,那么1/(1+exp(-wx))=0.5解出来的一个关 %于x1,x2的方程就是那个分界面。 53: %我们解出来以后发现,这个方程是一个直线方程:w(2)x1+w(3)x2+w(1)=0 54: %注意我们不能因为这个分界面是直线,就认为logistic回归是一个线性分类器,注意logistic回归不是一个分类器,他没有分类的功能, %这个logistic回归是用来 55: %预测概率的,这里具有分类功能是因为我们硬性规定了一个分类标准:把>0.5的归为一类,<0.5的归于另一类。这是一个很强的假设, %因为本来我们可能预测了一个样本 56: %所属某个类别的概率是0.6,这是一个不怎么高的概率,但是我们还是把它预测为这个类别,只因为它>0.5.所以最后可能logistic回归加上这 %个假设以后形成的分类器 57: %的分界面对样本分类效果不是很好,这不能怪logistic回归,因为logistic回归本质不是用来分类的,而是求的概率。 58: figure; 59: plot(x(pos, 2), x(pos,3), '+')%把分界面呈现在样本点上面,所以还要把样本点画出来。 60: hold on 61: plot(x(neg, 2), x(neg, 3), 'o') 62: hold on 63: plot(plot_x, plot_y) 64: legend('Admitted', 'Not admitted', 'Decision Boundary') 65: hold off 66:
当学习速率取不同的值时,迭代次数与cost function形成的不同的曲线 如图所示:
当学习速率为0.0014时候,我们看到图像开始振荡,说明学习速率过大了。
当我们将logistic回归应用到分类器中时,如果我们假设p(Y(x)|x)>0.5归为一类,p(Y(x)|x)<0.5归为另一类。那么分类器分界面如图:
当我们看到这个图时,我们是不是有种感觉:这个logistic回归比线性回归复杂,为什么结果得到的那么差?
先说一句,我们不要用这个分界面来评价logistic回归模型的好坏!!! 这个一会再说,我们先说这个分界面公式是怎么产生的。
分界面怎么画呢?问题也就是在x1,x2坐标图中找到那些将x1,x2带入1/(1+exp(-wx))后,使其值>0.5的(x1,x2)坐标形成的区域,因为我们知道1/(1+exp(-wx))>0.5意味着该区域的(x1,x2)表示的成绩允许上大学的概率>0.5,那么其他的区域就是不被允许上大学,那么1/(1+exp(-wx))=0.5解出来的一个关于x1,x2的方程就是那个分界面。我们解出来以后发现,这个方程是一个直线方程:w(2)x1+w(3)x2+w(1)=0 注意我们不能因为这个分界面是直线,就认为logistic回归是一个线性分类器,注意logistic回归不是一个分类器,他没有分类的功能,这个logistic回归是用来预测概率的,这里具有分类功能是因为我们硬性规定了一个分类标准:把>0.5的归为一类,<0.5的归于另一类。这是一个很强的假设,因为本来我们可能预测了一个样本所属某个类别的概率是0.6,这是一个不怎么高的概率,但是我们还是把它预测为这个类别,只因为它>0.5.所以最后可能logistic回归加上这个假设以后形成的分类器
的分界面对样本分类效果不是很好,这不能怪logistic回归,因为logistic回归本质不是用来分类的,而是求的概率。
牛顿法
牛顿法的阐述可以看我写的梯度下降法与牛顿法的解释与对比 http://www.cnblogs.com/happylion/p/4172632.html
注意一下,在这个例子中,我们要求G,我们不是利用这个公式,这个太麻烦了,而是直接在刚才目标函数一次求导的基础上继续求导,二次导为:
matlab程序中的形式具体看程序。
牛顿法程序clear all; close all; clx = load('ex4x.dat');
y = load('ex4y.dat'); [m, n] = size(x); % Add intercept term to x x = [ones(m, 1), x]; % Plot the training data % Use different markers for positives and negatives figure pos = find(y); neg = find(y == 0);%find是找到的一个向量,其结果是find函数括号值为真时的值的编号 plot(x(pos, 2), x(pos,3), '+') hold on plot(x(neg, 2), x(neg, 3), 'o') hold on xlabel('Exam 1 score') ylabel('Exam 2 score') % Initialize fitting parameters theta = zeros(n+1, 1); % Define the sigmoid function g = inline('1.0 ./ (1.0 + exp(-z))'); % Newton's method MAX_ITR = 7; J = zeros(MAX_ITR, 1); for i = 1:MAX_ITR % Calculate the hypothesis function z = x * theta; h = g(z);%是可以以向量形式给g()函数输入的,不是因为所有函数都可以这么输,而是这个函数里面有个exp()函数, %是可以的。z的每一维在exp()中分别计算,对应h里的每一维。 % Calculate gradient and hessian. % The formulas below are equivalent to the summation formulas % given in the lecture videos. grad = (1/m).*x' * (h-y);% H = (1/m).*x' * diag(h) * diag(1-h) * x;%因为在matlab中,是以所有样本一块作为X输入的,所以这里的h是一个 %向量,里面的元素是每个样本映射的logistic回归模型的概率,这样两个对角矩阵乘出来,还是一个对角矩阵,每个对角 %元是每个样本的hi*(1-hi)。这样做就是适应公式在matlab下的表现形式,是正确的,我验算了。 % Calculate J (for testing convergence) J(i) =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h)); theta = theta - H\grad;%是这样的,matlab里 \ 是左除,/ 是右除。如果是数字计算,则左除和右除是等效的,例如 3/2 = 2\3。
%而对于矩阵运算,则二者不等效。矩阵除法在 matlab 里定义为矩阵求逆后相乘。例如 A的逆矩阵是 A1,则 B/A = B*A1,A\B = A1*B。
%矩阵乘法不满足交换律,因此需要有左右除法之分。矩阵求逆的命令是 inv矩阵乘法不满足交换律,因此需要有左右除法之分。
end % Display theta theta % Calculate the probability that a student with % Score 20 on exam 1 and score 80 on exam 2 % will not be admitted prob = 1 - g([1, 20, 80]*theta) %画出分界面 % Plot Newton's method result % Only need 2 points to define a line, so choose two endpoints plot_x = [min(x(:,2))-2, max(x(:,2))+2]; % Calculate the decision boundary line,plot_y的计算公式见博客下面的评论。 plot_y = (-1./theta(3)).*(theta(2).*plot_x +theta(1)); plot(plot_x, plot_y) legend('Admitted', 'Not admitted', 'Decision Boundary') hold off % Plot J figure plot(0:MAX_ITR-1, J, 'o--', 'MarkerFaceColor', 'r', 'MarkerSize', 8) xlabel('Iteration'); ylabel('J') % Display J J
结果可看 http://www.cnblogs.com/tornadomeet/archive/2013/03/16/2963919.html