logistic回归简介
线性模型与回归
线性模型的一般形式为

其中的X1,X2....Xd是由d维属性描绘的样本,其中的Xi是表明在第i个属性的取值
它的向量形式为

其中的W1,W2.....Wd为待求解系数

线性学习的目的
学习一个线性模型尽可能预测实际输出

最小二乘
因为线性学习的目的
引入参数/模型估计:最小二乘法(least square method)
Xi是一堆数据,那么就有误差,设回归值f(Xi)和实际值yi的误差是ei
那么就要求误差的最小值


最小化均方误差

求最小值 求导
然后对w,b求偏导


使上面两个式子都等于0得出



对数线性回归
线性回归模型 f(x)=wx+b,取合适的w和b使得预测值逼近真实标记y
那么怎么通过线性模型预测非线性复杂的函数呢
将线性回归模型推广

其中g是单调可微函数
例如假设 取x的对数lny就可以得到对数线性回归模型


logistic回归(分类问题)
线性模型衍生出一般形式

g是lnx函数

寻找函数将分类标记与线性回归模型输出联系起来。
逻辑斯蒂函数(logistic/sigmoid function)
单调可微、任意阶可导

逻辑回归是拟合“y的sigmoid函数”
运用sigmoid函数


极大似然法

极大似然估计 recap
计算每个样本的X1,X2,,Xn的概率密度构造似然密度函数
通过似然函数最大化(求导为零),求解未知参数

梯度下降
求参数


求解得

牛顿法迭代t+1代后


的一阶和二阶导数如上


实例

import numpy as np
import array
import random
#数据加载
def loadDataSet():
dataMat = []
labelMat = []
fr = open('C:/Users/zhoutao/Desktop/testSet.txt')
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
labelMat.append(int(lineArr[2]))
return dataMat,labelMat
#Sigmoid函数
def sigmoid(inX):
return 1.0/(1+np.exp(-inX))
def gradAscent(dataMathIn,classLabel):
dataMatrix = np.mat(dataMathIn) #将列表转化为numpy的矩阵
labelMat = np.mat(classLabel).transpose() #将列表转化为矩阵,并求转置(transpose)
m,n = np.shape(dataMatrix)
alpha = 0.001
maxCycles = 500 #迭代次数
weight = np.ones((n,1))
for k in range(maxCycles):
h = sigmoid(dataMatrix*weight)
error = labelMat - h #(y-h)误差值
weight = weight + alpha*dataMatrix.transpose()*error #w=w+alpha*(y-h)*x梯度上升的迭代公式
return weight
#画出决策边界
def plotBestFit(weight):
import matplotlib.pyplot as plt
dataMat,labelMat = loadDataSet()
dataArr = np.array(dataMat)
n = np.shape(dataArr)[0] #[0]求dataArr的行数,1,是求列数
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) #添加subplot
ax.scatter(xcord1,ycord1,s = 30,c='red',marker = 's') #绘制正样本
ax.scatter(xcord2,ycord2,s = 30, c = 'green') #绘制负样本
w = np.array(weight)
x = np.arange(-3.0,3.0,0.1) #X轴的取值范围
y = (-w[0] - w[1] * x) / w[2] #设sigmoid =0,因为sigmoid = 0是两种类别的分界线 sigmoid = w0x0+w1x1+w2x2 = 0
ax.plot(x,y)
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
#随机梯度上升
def stoGradAscent0(dataMatrix,classLabels):
dataMatrix=np.array(dataMatrix)
m,n = np.shape(dataMatrix)
alpha = 0.01
weight = np.ones(n)
for i in range(m):
h = sigmoid(sum(dataMatrix[i]*weight))
error = classLabels[i] - h
weight = weight +alpha*error*dataMatrix[i]
return weight
#随机梯度算法的改进
def stoGradAscent1(dataMatrix,classLabels,numIter = 150):
dataMatrix=np.array(dataMatrix)
m,n = np.shape(dataMatrix)
weight = np.ones(n)
for j in range(numIter):
dataIndex = list(range(m))
for i in range(m):
alpha = 4/(1.0+j+i)+0.01 #降低alpha的大小,每次减小1/(j+i)。
randIndex = int(random.uniform(0,len(dataIndex))) #随机选取样本,可以实现随机选取更新
h = sigmoid(sum(dataMatrix[randIndex]*weight))
error = classLabels[randIndex] - h
weight = weight + alpha*error*dataMatrix[randIndex]
del(dataIndex[randIndex])
return weight
dataMat,labelMat = loadDataSet()
# weight=gradAscent(dataMat,labelMat)
weight = stoGradAscent1(dataMat,labelMat)
plotBestFit(weight)
小结
Logistic回归优点
无需事先假设数据分布
可得到“类别”的近似概率预测(概率值还可用于后续应用)
可直接应用现有数值优化算法(如牛顿法)求取最优解,具有快速、高效的特点
本文介绍了逻辑回归的基本概念,从线性模型出发,探讨了最小二乘法和极大似然估计在求解中的应用,包括梯度上升算法和随机梯度改进。重点讲解了sigmoid函数如何处理非线性问题,以及logistic回归的优点,如概率预测和优化算法的使用。

1883

被折叠的 条评论
为什么被折叠?



