Logistic Regression称为逻辑回归,简称LR,是机器学习中一个很基础的模型,是一种广义的线性回归模型,关于Logistic Regression的知识在这里就不再累述,我们一起来吧Logistic Regression进行一次数学推导来理解其中的原理。
Logistic Regression虽然中文名称带有“回归”二字,但是本质上是一个二分类模型,所以这里运用到了一个Logistic function(Sigmoid function):
用以下Python代码可以将此函数的图像输出:
import matplotlib.pyplot as plt
import numpy as np
z = np.linspace(-6, 6, 50)
y = 1/(1+np.exp(-z))
plt.plot(x, y)
plt.show()
得到sigmoid function的图像:
这是一个值域在(0,1)的函数,有一个预测函数h(x) (h for hypothesis),也就是预测y的值,一般来说y>0.5,y predict 1;y <0.5, y predict 0。
对于z来说:
由上述数学表达式对z做一下替换可得:
对于此数学表达式而言,对于x取值分别分类到0和1的概率分别是:
由上述式子可以合起来写出:
然后取上式的似然函数可以得到式子:
因为得到的此似然函数是连乘的,不方便计算,所以统一对此似然函数取对数,就可以得到:
然后此问题可以等价于求:
这时可以采用梯度下降算法,整个式子对θj求偏导可以得到:
对于上式的第三步推导到第四部有很多朋友都有所不解,我们来把最后一个偏导项展开来推导,就明白了:
综上所有的推导过程,我们可以得到梯度下降的结果:
其中α是learning rate,表示每次下降的幅度,这个α不能过大,过大的话会导致θj无法收敛,α过小的话会导致θj收敛的速度很慢,所以在收敛的过程中,需要朋友们自己来调整这个参数,如上就是LR的完整详细的推导过程,不知对你是否有帮助呢。
为了便于理解,我们一起来用Python来实现一个例子(我用的是jupyter notebook),在这里我先贴上我的代码,具体我们再来分析:
gradient decent method
theta := theta - alpha * (theta * X - Y) * X
alpha – learning rate
import numpy as np
from numpy.linalg import inv
from numpy import dot
from numpy import mat
dataset = pd.read_csv('./Desktop/dataset/data.csv')
tempx = dataset.iloc[:,0:3]
tempx['x0'] = 1
X = tempx.iloc[:,[3,0,1,2]]
Y = dataset.iloc[:, 3].values.reshape(200,1)
theta_gradient = np.array([1., 1., 1., 1.]).reshape(4,1)
alpha_new = 0.01
temp = theta_gradient
X0 = X.iloc[:, 0].values.reshape(200,1)
X1 = X.iloc[:, 1].values.reshape(200,1)
X2 = X.iloc[:, 2].values.reshape(200,1)
X3 = X.iloc[:, 3].values.reshape(200,1)
for i in range(10000):
temp[0] = theta_gradient[0] - alpha_new*np.sum(dot(X,theta_gradient)*X0 - Y)/200
temp[1] = theta_gradient[1] - alpha_new*np.sum(dot(X,theta_gradient)*X1 - Y)/200
temp[2] = theta_gradient[2] - alpha_new*np.sum(dot(X,theta_gradient)*X2 - Y)/200
temp[3] = theta_gradient[3] - alpha_new*np.sum(dot(X,theta_gradient)*X3 - Y)/200
theta_gradient = temp
print(theta_gradient)
在这段代码中的数据集是我自己生成的,生成数据集的代码如下:
import random
def Y(X1, X2, X3):
return 0.65 * X1 + 0.70 * X2 - 0.55 * X3 + 1.95
def Produce():
filename = 'data.csv'
with open(filename, 'w') as file:
file.write('X1,X2,X3,Y\n')
for i in range(200):
random.seed()
x1 = random.random()
x2 = random.random()
x3 = random.random()
y = Y(x1, x2, x3)
try:
file.write(str(x1) + ',' + str(x2) + ',' + str(x3) + ',' + str(y) + '\n')
except Exception, e:
print 'Write Error'
print str(e)
if __name__ == '__main__':
Produce()
我在LR的代码中对我的data.csv中的数据进行了处理,处理成我需要的格式,然后进行10000次梯度下降直到收敛为止,学习率是0.01,最终我们可以求出theta_gradient。我们一起动动手就可以完全理解Logistic Regression的原理了,希望这篇博客能对你有所帮助,本人水平有限,如有错误,希望读者轻喷,不吝指教,谢谢,如您有转载,请标明出处。