关于逻辑函数的导数计算过程,但是需要自己实践计算下。可以参考:https://blog.csdn.net/paopaohll/article/details/81807431
整体的逻辑函数过程可以参考吴恩达的课件(网易云课堂)
%入参:rap表示回归计算的步长
%入参:minvalues表示回归计算的最小偏差,如果小于该值则表示拟合成功,返回TheTa
%入参:maxtimes表示最大拟合次数,如果达到该次数,即使没有拟合成功,也返回最后一次的TheTa值
%入参:x表示x的矩阵,i*J的矩阵,代表训练集有I个,X有J-1个变更,其中X(0)=1
%入参:y表示结果集,i*1的矩阵,其中训练集有i个
%入参:theta表示参数集,j*1,表示有J个参数;
%出参:Theta表示经过训练后的参数结果,对应于theta
%出参:bResult表示经过训练后,是否达到目标的拟合结果,即两次的回归的最小偏差小于minvalues
%出参:Thsl表示训练结果,[n,2]其中n代表训练了多少次,第一列记录训练次数,第二列记录本次训练后的最小偏差。
function [TheTa,bResult,Thsl] = LogisticRegression(rap,minvalues,maxtimes,x,y,theta)
%m代表计算训练集的条数
m=size(x)(1);
curTimes=0;
bResult = false;
while curTimes<maxtimes,
curTimes=curTimes+1;
J1=LogisticCostFunctionJ(x,y,theta);
%得到一个1/1+e^theta'*x的矩阵,结果应该是(1*j)的矩阵,注:j是参数的个数,为了方便理解,我们转成倒置矩阵
tmp = (1./(1.+e.^(-theta'*x')));
theta = theta-((rap/m).*(tmp'-y)'*x)';
J2=LogisticCostFunctionJ(x,y,theta);
steperr=J2-J1;
Thsl(curTimes,:)=[curTimes,steperr];
if abs(steperr)<=minvalues,
bResult = true;
break;
end
end
TheTa = theta;
endfunction
function J=LogisticCostFunctionJ(x,y,theta)
%得到一个1/1+e^theta'*x的矩阵,结果应该是(1*j)的矩阵,注:j是参数的个数,为了方便理解,我们转成倒置矩阵
tmp = (1./(1.+e.^(-theta'*x')));
%y*log(tmp)
%计算求和
tmpsum = log(tmp)*y+log(1.-tmp)*(1.-y);
%m代表计算训练集的条数
m=size(x)(1);
J=-1*tmpsum/m
endfunction
其中涉及到逻辑回归的实现,需要理解并想通以下几个点:
1、为什么原来的线性回归的函数,
y=theta0+theta1x1+theta2x2
需要调整为:
y=1/(1+e^(-f(x))——设f(x)=theta0+theta1x1+theta2x2?
因为我们需要预测的值,并不是线性连续的,而是非0即1,可能是归于某几个值。
所以我们需要预测最终结果为0或者为1的机率是多少,所以我们的输出应该是0到1之间的。
2、为什么我们在构建代价函数时,又不能使用1/(1+e^(-f(x)),而需要使用:
上图直接使用吴恩达教授课程里面的h(x),也就是我们上面对于1/(1+e^(-f(x))。
因为我们需要构建的代价函数,是一个类似于y=x^2之间的函数。
而上面的函数是不平滑的,这就会导致我们在梯度下降时,很可能会直接找不到最低点。
另外y=a^x与x=log(a)y,是对函数
3、关于代价函数的求解,争取要自己解决。
具体的可以参见:【导数与求解】机器学习中的常用高等数学