概述
对于二分类问题通常都会使用逻辑回归,逻辑回归虽然占了回归这两个字但是它确是一个非常流行的分类模型,后面的很多算法都是从逻辑回归延伸出来的。下面我们来推导一下线性逻辑回归模型。
公式推导
假设在给定一个人的身体状况等参数情况下预测一个人生病的概率,特征向量X(x0,x1,x2…xn) 表示这个人的身体状况,预测量y等于0或1,0表示不会生病,1表示会生病。那么这个人会生病的概率可以表示为:
f
(
x
)
=
p
(
y
=
1
∣
X
)
f(x)=p(y=1|X)
f(x)=p(y=1∣X)
反过来这个人不会生病的概率就是:
1
−
f
(
x
)
1-f(x)
1−f(x)
上述概率是服从伯努利概率分布的,也就是0-1分布,可以将概率表示为:
p
(
y
∣
X
)
=
f
(
x
)
y
(
1
−
f
(
x
)
)
1
−
y
p(y|X)=f(x)^y(1-f(x))^{1-y}
p(y∣X)=f(x)y(1−f(x))1−y
此时,我们需要得到的目标参数就变成了对 f(x) 的估计,采用最大似然估计法(假设样本空间具有N个数据):
a
r
g
m
a
x
∏
i
=
1
N
(
f
(
x
i
)
y
i
(
1
−
f
(
x
i
)
)
(
1
−
y
i
)
)
argmax ∏_{i=1}^N(f(x_i)^{y_i}(1-f(x_i))^{(1-y_i)})
argmaxi=1∏N(f(xi)yi(1−f(xi))(1−yi))
虽然这个目标函数是写出来了,但是现在有一个问题,在实际中很难得到f(x)的数值,在样本数据中只有0和1的概率,所以需要对f(x)进行建模。首先有一点可以确定f(x)是特征向量X的函数,将特征向量乘上权重可以得到:
s
=
W
T
X
s=W^TX
s=WTX
f(x)可以表示为f(s),最后为了表示0-1分布的概率特性,采用了sigmoid函数进行模型,最终转化为:
f
(
x
)
=
1
/
(
1
−
e
x
p
(
W
T
X
)
)
f(x)=1/(1-exp(W^TX))
f(x)=1/(1−exp(WTX))
有了f(x)的模型后,我们继续对目标函数进行处理,首先我们将连乘转化为求和:
a
r
g
m
a
x
∑
i
=
1
N
(
y
i
l
n
(
f
(
x
i
)
+
(
1
−
y
i
)
l
n
(
1
−
f
(
x
i
)
)
)
argmax \sum_{i=1}^N(y_iln(f(x_i)+(1-y_i)ln(1-f(x_i)))
argmaxi=1∑N(yiln(f(xi)+(1−yi)ln(1−f(xi)))
进一步转化得到:
a
r
g
m
a
x
∑
i
=
1
N
(
y
i
l
n
(
f
(
x
i
)
/
(
1
−
f
(
x
i
)
)
+
l
n
(
1
−
f
(
x
i
)
)
)
argmax \sum_{i=1}^N(y_iln(f(x_i)/(1-f(x_i))+ln(1-f(x_i)))
argmaxi=1∑N(yiln(f(xi)/(1−f(xi))+ln(1−f(xi)))
将sigmoid函数带入上式:
a
r
g
m
a
x
∑
i
=
1
N
(
y
i
W
T
X
i
−
W
T
X
i
−
l
n
(
1
+
e
x
p
(
−
W
T
X
i
)
)
)
argmax \sum_{i=1}^N(y_iW^TX_i-W^TX_i-ln(1+exp(-W^TX_i)))
argmaxi=1∑N(yiWTXi−WTXi−ln(1+exp(−WTXi)))
自此我们就只需要采用优化算法求解使得目标函数最大的WT就可以了。
代码
import numpy as np
#sigmoid函数
def sigmoid(Num):
"""sigmoid函数
input:Num(Mat):feature * W
Output:sigmoid(Num)(Mat):sigmoid值
"""
return 1.0/(1+exp(-Num))
def error_rate(h,label):
"""计算当前的损失函数(交叉熵)
input:h(Mat):--------->预测值
label(Mat):----->实际值
output:err/m(float):-->错误率
"""
m=np.shape(h)[0]#目标个数
sum_err=0.0
for i in xrange(m):
if h[i,0]>0 and (1-h[i,0])>0:
sum_err-=(label[i,0]*np.log(label[i,0])+(1-label[i,0]*np.log(1-h[i,0])))
else:
sum_err-=0
return sum_err/m
def lr_train_bgd(feature,label,maxCycle,alpha):
"""利用梯度下降法训练LR模型
input:feature(Mat)---->特征(n*1)
label(Mat)------>标签
maxCycle(int)--->最大迭代次数
alpha(float)---->学习率
"""
n=np.shape(feature)[1]#通过使用np的.shape函数得到特征个数
W=np.mat(np.ones((n,1)))#初始化权重(n*1)
i=0
while i<=maxCycle:
i+=1
h=sigmoid(feature*W)
err=label-h
if i%100==0:
print("\t-------iter="+str(i)+",train error rate="+str(error_rate(h,label)))
W=W+alpha*feature.T*err#权重修正,需要转秩,所以输入为np数据类型
return W
该代码参考了《Python 机器学习算法》,采用梯度下降法进行的优化。
总结
逻辑回归是一个很有用的二分类模型,使用核函数的方法可以进行非线性分类分析,此外它和SVM经常会联合在一起使用。
文章只是自己的一些理解,仅供参考,谢谢!