社会责任
逻辑回归开端
2019-05-22 10:27:45 来源:www.gyyhd.com 作者:格兰特软件开发有限公司

1、总述


逻辑回归是利用异常普遍的一个分类机械进修算法,它将数据拟合到一个logit函数(或许叫做logistic函数)中,从而可以或许完成对变乱发生的几率停止猜测。




2、由来


   要说逻辑回归,咱们得追溯到线性回归,想必人人对线性回归都有必定的懂得,即对付多维空间中存在的样本点,咱们用特征的线性组合去拟合空间中点的散布和轨迹。以下图所示:








   线性回归能对持续值成果停止猜测,而实际生涯中罕见的别的一类成绩是,分类成绩。最简略的环境是是与否的二分类成绩。比如说大夫必要断定病人能否抱病,银行要断定一个人的信誉水平能否到达可以或许给他发信誉卡的水平,邮件收件箱要主动对邮件分类为失常邮件和渣滓邮件等等。




假如你感到这篇文章看起来轻微还有些费劲,或许想要体系地进修人工智能,那末保举你去看床长人工智能教程。异常棒的大神之作,教程不只通俗易懂,并且很幽默幽默。点击这里可以或许检查教程。




   固然,咱们最间接的设法主意是,既然可以或许用线性回归猜测出持续值成果,那依据成果设定一个阈值是不是就能够或许办理这个成绩了呢?事实是,对付很尺度的环境,确切可以或许的,这里咱们套用Andrew Ng先生的课件中的例子,下图中X为数据点肿瘤的巨细,Y为观察成果能否是恶性肿瘤。经由进程构建线性回归模子,如hθ(x)所示,构建线性回归模子后,咱们设定一个阈值0.5,猜测hθ(x)≥0.5的这些点为恶性肿瘤,而hθ(x)<0.5为良性肿瘤。








   但许多实际的环境下,咱们必要进修的分类数据并无这么精准,比如说上述例子中忽然有一个不按套路出牌的数据点呈现,以下图所示:








   你看,如今你再设定0.5,这个鉴定阈值就生效了,而实际生涯的分类成绩的数据,会比例子中这个更加繁杂,而这个时刻咱们借助于线性回归+阈值的方法,曾经很难完成一个鲁棒性很好的分类器了。




   在如许的场景下,逻辑回归就诞生了。它的焦点思惟是,假如线性回归的成果输入是一个持续值,而值的规模是无奈限定的,那咱们有无办法把这个成果值映照为可以或许赞助咱们断定的成果呢。而假如输入成果是 (0,1) 的一个几率值,这个成绩就很清晰了。咱们在数学上找了一圈,还真就找着如许一个简略的函数了,便是很奇异的sigmoid函数(以下):








   假如把sigmoid函数图像画进去,是以下的模样:








Sigmoid Logistic Function




   从函数图上可以或许看出,函数y=g(z)在z=0的时刻取值为1/2,而跟着z渐突变小,函数值趋于0,z渐突变大的同时函数值渐渐趋于1,而这恰是一个几率的规模。




   以是咱们界说线性回归的猜测函数为Y=WTX,那末逻辑回归的输入Y= g(WTX),此中y=g(z)函数恰是上述sigmoid函数(或许简略叫做S形函数)。








3、鉴定界限


   咱们如今再来看看,为何逻辑回归可以或许办理分类成绩。这里引入一个观点,叫做鉴定界限,可以或许懂得为是用以对分歧类其余数据朋分的界限,界限的两旁应当是分歧类其余数据。




   从二维直角坐标系中,举几个例子,大概是以下这个模样:








   有时刻是这个模样:




   




   乃至能够是这个模样:








   上述三幅图中的红绿样本点为分歧类其余样本,而咱们划出的线,不论是直线、圆或许是曲线,都能比较好地将图中的两类样本朋分开来。这便是咱们的鉴定界限,上面咱们来看看,逻辑回归是若何依据样本点得到这些鉴定界限的。




   咱们照旧借用Andrew Ng传授的课程中部门例子来报告这个成绩。




   回到sigmoid函数,咱们发明:  




       当g(z)≥0.5时, z≥0;




       对付hθ(x)=g(θTX)≥0.5, 则θTX≥0, 此时意味着预估y=1;




       反之,当猜测y = 0时,θTX<0;




   以是咱们觉得θTX =0是一个决议计划界限,当它大于0或小于0时,逻辑回归模子分离猜测分歧的分类成果。




   先看第一个例子hθ(x)=g(θ0+θ1X1+θ2X2),此中θ0 ,θ1 ,θ2分离取-3, 1, 1。则当−3+X1+X2≥0时, y = 1; 则X1+X2=3是一个决议计划界限,图形表现以下,恰好把图上的两类点辨别开来:








   例1只是一个线性的决议计划界限,当hθ(x)更繁杂的时刻,咱们可以或许得到非线性的决议计划界限,比方:








   这时候当x12+x22≥1时,咱们鉴定y=1,这时候的决议计划界限是一个圆形,以下图所示:








   以是咱们发明,理论上说,只需咱们的hθ(x)计划充足正当,精确的说是g(θTx)中θTx充足繁杂,咱们能在分歧的情况下,拟合出分歧的鉴定界限,从而把分歧的样本点分离隔来。




4、价值函数与梯度降低


   咱们经由进程对鉴定界限的阐明,晓得会有得当的参数θ使得θTx=0成为很好的分类鉴定界限,那末成绩就来了,咱们若何鉴定咱们的参数θ能否得当,有多得当呢?更进一步,咱们有无办法去求得如许的得当参数θ呢?




   这便是咱们要提到的价值函数与梯度降低了。




   所谓的价值函数Cost Function,其实是一种权衡咱们在这组参数下预估的成果和实际成果差距的函数,比如说线性回归的价值函数界说为:








固然咱们可以或许和线性回归类比得到一个价值函数,实际便是上述公式中hθ(x)取为逻辑回归中的g(θTx),然则这会激发价值函数为“非凸”函数的成绩,简略一点说便是这个函数有许多个部分最低点,以下图所示:








而咱们盼望咱们的价值函数是一个以下图所示,碗状布局的凸函数,如许咱们算法求解到部分最低点,就必定是全局最小值点。








     是以,上述的Cost Function对付逻辑回归是弗成行的,咱们必要其余情势的Cost Function来包管逻辑回归的本钱函数是凸函数。




     咱们跳过大批的数学推导,间接出论断了,咱们找到了一个得当逻辑回归的价值函数:








     Andrew Ng先生说明了一下这个价值函数的正当性,咱们首先看当y=1的环境:








      假如咱们的种别y = 1, 而鉴定的hθ(x)=1,则Cost = 0,此时猜测的值和实在的值完整相称,价值本该为0;而假如断定hθ(x)→0,价值->∞,这很好地处分了末了的成果。




      而对付y=0的环境,以下图所示,也异样正当:








      上面咱们说说梯度降低,梯度降低算法是调剂参数θ使得价值函数J(θ)得到最小值的最根本办法之一。从直观上懂得,便是咱们在碗状布局的凸函数上取一个初始值,而后移动这个值一步步接近最低点的进程,以下图所示:




   








     咱们先简化一下逻辑回归的价值函数:








      从数学上懂得,咱们为了找到最小值点,就应当朝着降低速率最快的偏向(导函数/偏导偏向)迈进,每次迈进一小步,再看看此时的降低最快偏向是哪,再朝着这个偏向迈进,直至最低点。




      用迭代公式表现进去的最小化J(θ)的梯度降低算法以下:












5、代码与完成


   咱们来一路看两个详细数据上做逻辑回归分类的例子,此中一份数据为线性鉴定界限,另一份为非线性。




   示例1。




   第一份数据为data1.txt,部门内容以下:








   咱们先来看看数据在空间的散布,代码以下。






from numpy import loadtxt, where


from pylab import scatter, show, legend, xlabel, ylabel



#load the dataset


data = loadtxt('/home/HanXiaoyang/data/data1.txt', delimiter=',')



X = data[:, 0:2]


y = data[:, 2]



pos = where(y == 1)


neg = where(y == 0)


scatter(X[pos, 0], X[pos, 1], marker='o', c='b')


scatter(X[neg, 0], X[neg, 1], marker='x', c='r')


xlabel('Feature1/Exam 1 score')


ylabel('Feature2/Exam 2 score')


legend(['Fail', 'Pass'])


show()


1


1






   得到的成果以下:








   上面咱们写好盘算sigmoid函数、价值函数、和梯度降低的法式:






def sigmoid(X):


   '''Compute sigmoid function '''


   den =1.0+ e **(-1.0* X)


   gz =1.0/ den


   return gz


def compute_cost(theta,X,y):


   '''computes cost given predicted and actual values'''


   m = X.shape[0]#number of training examples


   theta = reshape(theta,(len(theta),1))


   


   J =(1./m)*(-transpose(y).dot(log(sigmoid(X.dot(theta))))- transpose(1-y).dot(log(1-sigmoid(X.dot(theta)))))


   


   grad = transpose((1./m)*transpose(sigmoid(X.dot(theta))- y).dot(X))


   #optimize.fmin expects a single value, so cannot return grad


   return J[0][0]#,grad


def compute_grad(theta, X, y):


   '''compute gradient'''


   theta.shape =(1,3)


   grad = zeros(3)


   h = sigmoid(X.dot(theta.T))


   delta = h - y


   l = grad.size


   for i in range(l):


       sumdelta = delta.T.dot(X[:, i])


       grad[i]=(1.0/ m)* sumdelta *-1


   theta.shape =(3,)


   return  grad


1


1






   咱们用梯度降低算法得到的成果鉴定界限是以下的模样:








   末了咱们利用咱们的鉴定界限对training data做一个猜测,而后比对一下精确率:






def predict(theta, X):


   '''Predict label using learned logistic regression parameters'''


   m, n = X.shape


   p = zeros(shape=(m,1))


   h = sigmoid(X.dot(theta.T))


   for it in range(0, h.shape[0]):


       if h[it]>0.5:


           p[it,0]=1


       else:


           p[it,0]=0


   return p


#Compute accuracy on our training set


p = predict(array(theta), it)


print'Train Accuracy: %f'%((y[where(p == y)].size / float(y.size))*100.0)


1


1


   盘算进去的成果是89.2%








   示例2.




   第二份数据为data2.txt,部门内容以下:








   咱们异样把数据的散布画进去,以下:








   咱们发如今这个例子中,咱们没有办法再用一条直线把两类样本点类似分开了,以是咱们盘算尝尝多项式的鉴定界限,那末咱们先要对给定的两个feature做一个多项式特征的映照。比如说,咱们做了以下的一个映照:








   代码以下:






def map_feature(x1, x2):


   '''


   Maps the two input features to polonomial features.


   Returns a new feature array with more features of


   X1, X2, X1 ** 2, X2 ** 2, X1*X2, X1*X2 ** 2, etc...


   '''


   x1.shape =(x1.size,1)


   x2.shape =(x2.size,1)


   degree =6


   mapped_fea = ones(shape=(x1[:,0].size,1))


   m, n = mapped_fea.shape


   for i in range(1, degree +1):


       for j in range(i +1):


           r =(x1 **(i - j))*(x2 ** j)


           mapped_fea = append(mapped_fea, r, axis=1)


   return mapped_fea


mapped_fea = map_feature(X[:,0], X[:,1])


1


1


     接着做梯度降低:






def cost_function_reg(theta, X, y, l):


   '''Compute the cost and partial derivatives as grads


   '''


   h = sigmoid(X.dot(theta))


   thetaR = theta[1:,0]


   J =(1.0/ m)*((-y.T.dot(log(h)))-((1- y.T).dot(log(1.0- h)))) \


           +(l /(2.0* m))*(thetaR.T.dot(thetaR))


   delta = h - y


   sum_delta = delta.T.dot(X[:,1])


   grad1 =(1.0/ m)* sumdelta


   XR = X[:,1:X.shape[1]]


   sum_delta = delta.T.dot(XR)


   grad =(1.0/ m)*(sum_delta + l * thetaR)


   out = zeros(shape=(grad.shape[0], grad.shape[1]+1))


   out[:,0]= grad1


   out[:,1:]= grad


   return J.flatten(), out.T.flatten()


m, n = X.shape


y.shape =(m,1)


it = map_feature(X[:,0], X[:,1])


#Initialize theta parameters


initial_theta = zeros(shape=(it.shape[1],1))


#Use regularization and set parameter lambda to 1


l =1


# Compute and display initial cost and gradient for regularized logistic


# regression


cost, grad = cost_function_reg(initial_theta, it, y, l)


def decorated_cost(theta):


   return cost_function_reg(theta, it, y, l)


print fmin_bfgs(decorated_cost, initial_theta, maxfun=500)


1


1


     接着在数据点上画出鉴定界限:






#Plot Boundary


u = linspace(-1,1.5,50)


v = linspace(-1,1.5,50)


z = zeros(shape=(len(u), len(v)))


for i in range(len(u)):


   for j in range(len(v)):


       z[i, j]=(map_feature(array(u[i]), array(v[j])).dot(array(theta)))


z = z.T


contour(u, v, z)


title('lambda = %f'% l)


xlabel('Microchip Test 1')


ylabel('Microchip Test 2')


legend(['y = 1','y = 0','Decision boundary'])


show()


def predict(theta, X):


   '''Predict whether the label


   is 0 or 1 using learned logistic


   regression parameters '''


   m, n = X.shape


   p = zeros(shape=(m,1))


   h = sigmoid(X.dot(theta.T))


   for it in range(0, h.shape[0]):


       if h[it]>0.5:


           p[it,0]=1


       else:


           p[it,0]=0


   return p


#% Compute accuracy on our training set


p = predict(array(theta), it)


print'Train Accuracy: %f'%((y[where(p == y)].size / float(y.size))*100.0)


1


1


      得到的成果以下图所示:








      咱们发明咱们得到的这条曲线确切将两类点辨别开来了。




6、总结


      末了咱们总结一下逻辑回归。它始于输入成果为有实际意义的持续值的线性回归,然则线性回归对付分类的成绩没有办法精确而又具有鲁棒性地朋分,是以咱们计划出了逻辑回归如许一个算法,它的输入成果表征了某个样本属于某类其余几率。




      逻辑回归的胜利的地方在于,将底本输入成果规模可以或许异常大的θTX 经由进程sigmoid函数映照到(0,1),从而完成几率的估测。




       而直观地在二维空间懂得逻辑回归,是sigmoid函数的特征,使得鉴定的阈值可以或许映照为平面的一条鉴定界限,固然跟着特征的繁杂化,鉴定界限能够是多种多样的样貌,然则它可以或许较好地把两类样本点分离隔,办理分类成绩。




      求解逻辑回归参数的传统办法是梯度降低,结构为凸函数的价值函数后,每次沿着偏导偏向(降低速率最快偏向)迈进一小部门,直至N次迭代后到达最低点。


---------------------


作者:很大的vv下


起源:CSDN


原文:https://blog.csdn.net/qq_45078935/article/details/90410175


版权申明:本文为博主原创文章,转载请附上博文链接!