Logistic Regression
逻辑回归是我接触机器学习之后学到的第二个算法,主要用于二分类问题
- 原理简介
- 我的理解
- 代码实现
逻辑回归原理简介
怎么说呢,其实对于逻辑回归,并没有一个明确的概念,更多的是一个过程性的描述:对于一个二分类问题,建立一个代价函数,通过最优化方法求解出参数,然后验证整个模型好坏的一个过程。
我的理解
我觉得搞懂逻辑回归,首先要明确两点:1.什么是Sigmoid函数,它的输入是什么;2.使用哪种最优化算法对参数进行求解。先说第一个问题,Sigmoid函数的公式如下:
σ(z)=11+e−z
σ
(
z
)
=
1
1
+
e
−
z
用python中的matplotlib给这个曲线画一个图,他的大致样子是这样的
可以观察到,当x为0时,函数值为0.5,随着x的增大,函数值逼近于1,随着x的减小,函数值逼近于0。其实他在大尺度下,看上去就是一个阶跃函数(可以想象把坐标轴的范围扩大到正负100,基本上就是左边是0,右边是1了,中间只有近似的一条竖线),但确是连续光滑的。所以任何大于0.5的数据被分入1类,小于0.5的被分入0类,因此也可以把逻辑回归看成一种概率估计。
Sigmoid函数的输入记为 z z ,由下面的公式得出:
写成向量形式为
z=WTX
z
=
W
T
X
,其中X是分类器的输入数据,W是我们要找的参数(W和X都是向量)。以上的论述就说明白了第一个问题,而如何得到我们想要的参数W,就要说一下第二个问题了,也就是用优化方法来求解参数。
在解决第二个问题前,我们需要构造一个损失函数,损失函数如下:
J(ω)=−1m[∑i=1m(yiloghω(xi)+(1−yi)log(1−hω(xi)))]
J
(
ω
)
=
−
1
m
[
∑
i
=
1
m
(
y
i
l
o
g
h
ω
(
x
i
)
+
(
1
−
y
i
)
l
o
g
(
1
−
h
ω
(
x
i
)
)
)
]
,其中,
hω(x)=σ(ωTx)=11+e−ωTx
h
ω
(
x
)
=
σ
(
ω
T
x
)
=
1
1
+
e
−
ω
T
x
,对于这个损失函数,我们通过梯度上升法来求解最优参数,在梯度上升法的过程中,取
ωj=ωj+αδδωjJ(ω)
ω
j
=
ω
j
+
α
δ
δ
ω
j
J
(
ω
)
,如此即可求出最优的参数
ω
ω
。有了最优的参数,带回原式,就得到了一个逻辑回归模型,进而可以对输入的数据进行分类了。 代码实现
import numpy as np
def loadData():
data = []
label = []
#这里使用的是machine learning in Action中的一个小数据集,里面存放了带label的点
#格式是像这样子的:-0.017612 14.053064 0 第一个是x坐标,第二个是y坐标,第三个是label
f = open('testSet.txt')
for line in f.readlines():
lineArr = line.strip().split()
data.append([1.0, float(lineArr[0]), float(lineArr[1])]) #这里把w0设为1
label.append(int(lineArr[2]))
return data, label
def sigmoid(x):
return 1.0 / (1 + np.exp(-x))
def gradAescent(data, label):
dataMat = np.mat(data)
labelMat = np.mat(label).transpose() #转变为列向量
m, n = np.shape(dataMat)
alpha = 0.01 #学习率
cycles = 500 #迭代次数
weights = np.ones((n, 1))
for i in range(cycles):
h = sigmoid(dataMat * weights)
error = labelMat - h
weights = weights + alpha * dataMat.transpose() * error #梯度上升求参数
return weights
if __name__ == "__main__":
dataArr, labelVec = loadData()
print gradAescent(dataArr, labelVec)