逻辑回归是一种分类算法,用于2元分类两种情况,也可以使用‘一对余’的思想来实现多元分类
sigmoid function、logistic function
sigmoid function、logistic function都是同一种函数,如下:
y
=
1
1
+
e
−
x
y=\dfrac{1}{1+e^{-x}}
y=1+e−x1
函数值范围在(0,1),图像如下:
假设函数
h
θ
(
x
)
=
1
1
+
e
−
F
θ
(
x
)
h_θ(x)=\dfrac{1}{1+e^{-F_θ(x)}}
hθ(x)=1+e−Fθ(x)1
说明
- h θ ( x ) h_θ(x) hθ(x)表示条件概率P(y=1|x;θ)(给定参数θ,具有x特征的条件下发生y=1的概率)
-
F
θ
(
x
)
=
0
F_θ(x)=0
Fθ(x)=0为决策边界,决策边界就是区分y=0、1这两种情况的边界。
如下图:
− 1 + x 1 2 + x 2 2 = 1 -1+x_1^2+x_2^2=1 −1+x12+x22=1为区分o和x的决策边界。该决策边界以外的是y=1的情况,以内是y=0的情况。
注意,决策边界是假设函数及其参数的一个属性,不是训练集的属性。
逻辑回归的单样本代价函数
c o s t ( h θ ( x ) , y ) = { − l o g ( h θ ( x ) ) , y = 1 − l o g ( 1 − h θ ( x ) ) , y = 0 cost(h_θ(x),y)= \begin{cases} -log(h_θ(x)),y=1\\ -log(1-h_θ(x)),y=0\\ \end{cases} cost(hθ(x),y)={−log(hθ(x)),y=1−log(1−hθ(x)),y=0
可以合并成 c o s t ( h θ ( x ) , y ) = − y l o g ( h θ ( x ) ) − ( 1 − y ) l o g ( 1 − h θ ( x ) ) cost(h_θ(x),y)=-ylog(h_θ(x))-(1-y)log(1-h_θ(x)) cost(hθ(x),y)=−ylog(hθ(x))−(1−y)log(1−hθ(x))
整体代价函数
J ( θ ) = 1 m c o s t ( h θ ( x ) , y ) J(θ)=\dfrac{1}{m}cost(h_θ(x),y) J(θ)=m1cost(hθ(x),y)
例子代码
import numpy as np
import random
from dask.array.routines import gradient
from blaze.expr.expressions import shape
# 梯度下降算法,返回接近theta的局部最优解
def gradientDescent(x,y,theta,alpha,m,numIterartions):
xTrains = x.transpose() #x转置
for i in range(0,numIterartions):
hypothesis = np.dot(x,theta) #hypothesis是y的估计值
loss = hypothesis - y #误 差
cost = np.sum(loss **2)/(2*m)
print("Iteration %d | Cost: %f"%(i,cost))
gradient = np.dot(xTrains,loss) / m #gradient是梯度
theta = theta -alpha*gradient
return theta
#该函数用于构造数据
def genData(numPoints,bias,variance):
x = np.zeros(shape=(numPoints,2))
y = np.zeros(shape=numPoints)
for i in range(0,numPoints):
x[i][0]=1
x[i][1]=i
y[i] = (i + bias) + random.uniform(0,1)*variance
return x,y
x,y = genData(100, 25, 10)
print("x")
print(x)
print("y")
print(y)
print("x.transpose()")
print(x.T)
m,n = np.shape(x)
n_y = np.shape(y)
print("x shape:"+str(m)+","+str(n))
print("y length:"+str(n_y))
numIterartions = 100000
alpha = 0.0005#学习率
theta = np.ones(n)
# x是实例,y是标记,theta是参数,alpha是学习率,m是实例个数,numIterartions是更新次数
theta = gradientDescent(x, y, theta, alpha, m, numIterartions)
print(theta)