1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 逻辑回归(Logistic Regression)原理及Python实现

逻辑回归(Logistic Regression)原理及Python实现

时间:2022-12-04 14:58:20

相关推荐

逻辑回归(Logistic Regression)原理及Python实现

前面有讲过线性回归,但是很多非线性问题不能用简单的线性回归来分类。这时需要用到逻辑回归,逻辑回归是一种非线性的回归。说到逻辑回归一定要说到概率问题,概率(probability)就是对一件事发生的可能性的衡量。一个事件的概率 0≤P≤1 , 当事件必然发生时概率为1, 当事件为不可能事件时概率为0. 条件概率的表达式为: P(A∣B)=P(A⋂B)P(B) ,表达式的意思在条件B下,条件A发生的可能性。

逻辑回归的基本模型为:

Z=θ0x0+θ1x1+θ2x2+...+θnxn

用向量的形式可表示为:

Z=ΘTX

为了出来二值数据,需要引入sigmoid函数时曲线平滑化:

g(Z)=11+e−z

图像如下:

从图像中可以看出这个函数的性质:当Z=0时,g(Z)=1; 当Z趋近于正无穷时,g(Z)趋近于1;当Z趋近于负无穷时,g(Z)趋近于0.

将逻辑回归基本模型的向量表示形式带入到sigmoid函数中,可以得到预测函数: hθ(X)=g(ΘTX)=11+e−ΘTX

用概率来表示

(y=1):

hθ(X)=P(y=1∣X;Θ)

(y=0):

1−hθ(X)=P(y=0∣X;Θ)

模型参数的选取需要使用代价函数(cost function),在线性回归中我们使用sum of squares的方法来描述误差,表达式为:

∑i=1m(hθ(xi)−yi)2

hθ(xi)=θ0+θ1xi

我们就需要找到合适的 θ0和θ1 使sum of squares最小。

逻辑回归中的代价函数表示为:

Cost(hΘ(X),y)={−log(hΘ(X))当y=1时−log(1−hΘ(X))当y=0时

将上面的等式合并成一个等式可以得到:

J(Θ)=1m∑i=1mCost(hΘ(x(i)),y(i))=−1m[∑i=1m(y(i)log(hΘ(x(i))))+(1−y(i))log(1−hΘ(x(i))))]

得到的这个等式实际上是和上面的等式相等的,带入y=1或y=0既可得到和上面一样形式的等式。同样的,我们也是需要寻找到合适的 θ0,θ1 使上面的等式最小。为了寻找到最小的cost,这里也使用梯度下降的方法(gradient decent),在 人工神经网络(ANN)入门二中。

介绍过了具体的思想,实际上就是利用微分的性质求偏导数知道找到一个收敛的值为止,这里不再重复介绍。这里对 θj 求偏导数,每次更新 θj 为: θj=θj−α∂∂θjJ(θ),(j=0...n)

可以用Python来实现逻辑回归,代码如下:

# logistic regressionimport numpy as npimport random# m denotes the number of examples here, not the number of featuresdef gradientDescent(x, y, theta, alpha, m, numIterations):xTrans = x.transpose()for i in range(0, numIterations):hypothesis = np.dot(x, theta)loss = hypothesis - y# avg cost per example (the 2 in 2*m doesn't really matter here.# But to be consistent with the gradient, I include it)cost = np.sum(loss ** 2) / (2 * m)#print("Iteration %d | Cost: %f" % (i, cost))# avg gradient per examplegradient = np.dot(xTrans, loss) / m# updatetheta = theta - alpha * gradientreturn thetadef genData(numPoints, bias, variance):x = np.zeros(shape=(numPoints, 2))y = np.zeros(shape=numPoints)# basically a straight linefor i in range(0, numPoints):# bias featurex[i][0] = 1x[i][1] = i# our target variabley[i] = (i + bias) + random.uniform(0, 1) * variancereturn x, y# gen 100 points with a bias of 25 and 10 variance as a bit of noisex, y = genData(100, 25, 10)m, n = np.shape(x)numIterations = 100000alpha = 0.0005theta = np.ones(n)theta = gradientDescent(x, y, theta, alpha, m, numIterations)print(theta)

与回归相关的一个重要参数是皮尔逊相关系数(Pearson Correlation Coefficient), 它是衡量两个线性相关强度的量,取值范围为[-1, +1]。如图所示,如果相关系数大于0,就是正向相关;系数小于0,就是负向相关;系数等于0表示没有关系。

相关系数的公式为:

ρ=Cor(X,Y)=Cov(X,Y)Var(X)Var(Y)‾‾‾‾‾‾‾‾‾‾‾‾‾√Cov(X,Y)=∑nn=1(Xi−X⎯⎯⎯)(Yi−Y⎯⎯⎯)n−1

Var(X)=∑ni=1(Xi−X⎯⎯⎯)2n−1

最后可以得出

rxy=∑ni=1(xi−x⎯⎯)(yi−y⎯⎯)∑ni=1(xi−x⎯⎯)2∑ni=1(yi−y⎯⎯)2‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾√

下面是计算相关系数的代码

import numpy as npimport mathdef computeCorrelation(X, Y):xBar = np.mean(X)yBar = np.mean(Y)SSR = 0varX = 0varY = 0for i in range(0, len(X)):diffXXBar = X[i] - xBardiffYYBar = Y[i] - yBarSSR += (diffXXBar * diffYYBar)varX += diffXXBar ** 2varY += diffYYBar ** 2SST = math.sqrt(varX * varY)return SSR / SSTtestX = [1, 3, 8, 7, 9]testY = [10, 12, 24, 21, 34]print(computeCorrelation(testX, testY))

与相关系数对应的一个系数为R平方值,叫做决定系数,反应因变量的全部变异能通过回归关系被自变量解释的比例。例如如果R平方为0.8,则表示回归关系可以解释因变量80%的变异,换句话说,如果我们能控制自变量不变,则因变量的变异程度会减少80%。

简单线性回归 R2=r2 ,多元线性回归中, R2=SSRSST=∑(yi^−y⎯⎯)2∑(yi−y⎯⎯)2

另外一个重要的关系为:SST=SSR+SSE

SSE=∑(yi−yi^)2

R平方也有其局限性:R平方随着自变量的增大会变大,R平方和样本量是有关系的。因此,我们要对R平方进行修正,修正方法为:

R2adjusted=1−(1−R2)(N−1)N−p−1

这里 p=number of predictors, N=total sample size.

后续更新中。。。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。