前面有讲过线性回归,但是很多非线性问题不能用简单的线性回归来分类。这时需要用到逻辑回归,逻辑回归是一种非线性的回归。说到逻辑回归一定要说到概率问题,概率(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.
后续更新中。。。