首先介绍一下Logistic函数
形状呢是一个S形
那么对一个二分类问题,考虑线性回归函数
,我们可以用Logistic函数将z转换为0, 1值,这样就得到了Logistic回归模型
那么接下来需要确定式中的w和b。通过极大似然法来估计w和b,给定数据集,Logistic回归模型最大化对数似然(log-likehood)
其中的似然项
将似然项代入对数似然,并且最大化对数似然,相当于最大化
这是一个凹函数,加个负号可以变成凸函数,就可以根据凸优化理论运用牛顿法来求最优解。在Logistic回归中,求w的迭代公式
其中是梯度算子,H()是Hessian矩阵
带到迭代公式里面
那么下面上代码。参考了《机器学习实战》,用的数据集是网上随便找的,一共三列,两个属性一个label,共100条记录
from numpy import *
import matplotlib.pyplot as plt
# 读取数据
def loadDataSet():
dataMat = []
labelMat = []
fr = open('D:/banana/test.txt')
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(float(lineArr[2])))
return dataMat, labelMat
# sigmoid函数
def sigmoid(inX):
return 1.0 / (1 + exp(-inX))
# 随机梯度上升优化算法
def stocGradAscent(dataMatrix, classLabels, numIter=150):
m, n = shape(dataMatrix)
weights = ones(n)
for j in range(numIter):
dataIndex = list(range(m))
for i in range(m):
alpha = 4 / (1.0 + j + i) + 0.01 # 每次迭代时需调整
randIndex = int(random.uniform(0, len(dataIndex))) # 随机选取更新
h = sigmoid(sum(dataMatrix[randIndex] * weights))
error = classLabels[randIndex] - h
weights = weights + alpha * dot(error, dataMatrix[randIndex])
del(dataIndex[randIndex])
return weights
# 画出决策边界
def plotBestFit(weights):
dataMat, labelMat = loadDataSet()
dataArr = array(dataMat)
n = shape(dataArr)[0]
xcord1 = []
ycord1 = []
xcord2 = []
ycord2 = []
for i in range(n): # 分类
if int(labelMat[i]) == 1:
xcord1.append(dataArr[i, 1])
ycord1.append(dataArr[i, 2])
else:
xcord2.append(dataArr[i, 1])
ycord2.append(dataArr[i, 2])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
ax.scatter(xcord2, ycord2, s=30, c='green')
x = arange(-4.0, 4.0, 0.1)
y = (-weights[0] - weights[1] * x) / weights[2] # 最佳拟合直线
ax.plot(x, y)
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
运行结果是这样