1、Sigmoid 函数:
hθ(x)=g(θTx)=11+e−θTx
设 g(z)=11+exp(−z)
g′(z)=(11+exp(−z))′=exp(−z)(1+exp(−z))2=11+exp(−z)∗(exp(−z)1+exp(−z))=g(z)∗(1−g(z))
2、二项 Logistic 回归模型:
二项分布 Logistic 回归模型是满足如下的条件概率分布:
P(y=1|x)=exp(w∗x+b)1+exp(w∗x+b)
P(y=0|x)=11+exp(w∗x+b)
我们可以写为如下的形式:
P(y=1|x;θ)=hθ(x)=11+e−θTx
P(y=0|x;θ)=1−hθ(x)
这里, x0=1
3、损失函数
似然函数是:
L(θ)=∏i=1NP(y(i)|x(i);θ)=∏iN(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)
对似然函数取对数:
l(θ)=log(L(θ))=∑i=1Ny(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))
对对数似然求极大值:
∂l(θ)∂θj=∑i=1N(y(i)hθ(x(i))−1−y(i)1−hθ(x(i)))∗∂hθ(x(i))∂θj
= ∑i=1N(y(i)g(θTx(i))−1−y(i)1−g(θTx(i)))∗∂g(θTx(i))∂θj
= ∑i=1N(y(i)g(θTx(i))−1−y(i)1−g(θTx(i)))∗g(θTx(i))∗(1−g(θTx(i)))∗∂θTx(i)∂θj
= ∑i=1N(y(i)(1−g(θTx(i)))−(1−y(i))g(θTx(i)))∗x(i)j
= ∑i=1N(y(i)−g(θTx(i)))∗x(i)j
取损失函数 loss=−L(θ) , 对似然函数取极大值,既是损失取得最小值,
∂loss(θ)∂θj⇒−∑iN(y(i)−g(θTx(i)))∗x(i)j
使用随机梯度下降算法:这里和线性回归的形式有些不同。线性回归中,似然函数取最大值时,损失函数(均方误差)需要取最小值才满足要求,使用随机梯度下降法。而在 Logistic 回归中,损失函数是似然函数的相反数,使用随机梯度上升法,更新公式中是加号。
参数优化公式:
θj=θj+α(y(i)−hθ(x))∗x(i)j
#-*- coding:utf-8 -*-
from numpy import *
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from math import *
def calSigmod(theta,inX):
return 1.0/(1+exp(-1*(theta*inX)))
if __name__=="__main__":
print "hello world"
data = pd.read_csv("testSet.txt",delimiter='\t',header=None)
m, n = shape(data) # data 的数据类型是:pandas.core.frame.DataFrame,按data[j] 是按列输出; data[i][j] 按照元素输出
print m,n
x = mat(ones((n,m))) # x 是 m 行 n 列的矩阵,按行输出为 x[j], 按列输出为 x[:,j],按照单个元素输出为 x[i,j]
x[1] = data[0]
x[2] = data[1]
y = data[[2]]
y = mat(y)
theta = mat(zeros((1,n)))
a = 0.001 # 步长,学习率
# 使用随机梯度下降优化参数
for i in range(1000):
for j in range(m):
hx = calSigmod(theta,x[:,j]) - y[j]
theta = theta - a*hx*x[:,j].T
# theta[0,0] = theta[0,0] + a*hx*x[0,j]
# theta[0,1] = theta[0,1] + a*hx*x[1,j]
# theta[0,2] = theta[0,2] + a*hx*x[2,j]
print theta
# 根据求到的参数theta,计算分界面
x1 = arange(-5,5,0.1)
x2 = (-1*theta[0,0] - theta[0,1]*x1)/theta[0,2]
# 根据标签,对样本点做标记,便于观察
x1_record = []; y1_record =[]
x2_record = []; y2_record =[]
for i in range(m):
if y[i]==1:
x1_record.append(x[1,i])
y1_record.append(x[2,i])
else:
x2_record.append(x[1,i])
y2_record.append(x[2,i])
# 画图
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False # 在图中加入汉字需要
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x1_record,y1_record,s=20,c='red')
ax.scatter(x2_record,y2_record,s=30,c='green')
ax.plot(x1,x2,'b-')
plt.xlabel(u'特征1',fontsize=15)
plt.ylabel(u'特征2',fontsize=15)
plt.show()
一个事件的几率(odds): 指该事件发生的概率(P)和该事件不发生的概率(1-P)的比值。即:
P1−P
.
事件的对数几率(log odds)或者logit 是:
logit(P)=logP1−P
.
对 Logistic 回归, logP(y=1|x;θ)1−P(y=1|x;θ)=θTx .
也就是说,在 Logistic回归模型中,输出 y=1 的对数几率是输入 x 的线性函数。
对图2,
当
当
P(y=1|x;θ)<0.5
时,
θTx<0
, 样本在分界线的下方。
参考:
《统计学习方法》 李航
《机器学习实战》