1 逻辑回归的意义
回归就是发现变量之间的关系,也就是求回归系数,是分类和预测算法中的一种。通过历史数据的表现对未来结果发生的概率进行预测。经常用回归来预测目标值。回归和 分类同属于监督学习,所不同的是回归的目标变量必须是连续数值型。 logistic 回归的主要思想是根据现有的数据对分类边界线建立回归公式,以此进行分类。

2 逻辑回归模型适用条件
(1)因变量为二分类的分类变量或某事件的发生率,并且是数值型变量。但是需要注意,重复计数现象指标不适用于逻辑回归。
(2)残差和因变量都要服从二项分布。二项分布对应的是分类变量,所以不是正态分布,进而不是用最小二乘法,而是最大似然法来解决方程估计和检验问题。
(3)自变量和Logistic概率是线性关系
(4)各观测参数间相互独立。
3 逻辑回归的主要应用
目前逻辑回归主要在流行病学中应用较多,比较常用的情形是探索某疾病的危险因素,根据危险因素预测 某疾病发生的概率等等。logistic 回归的因变量可以是二分类的,也可以是多分类的,但是二 分类的更为常用,也更加容易解释,所以实际中最为常用的就是二分类的 logistic 回归。

下面就二分类进行分析,我们在回归分析中需要一个函数可以接受所有的输入然后预测 出类别,假定用 0 和 1 分别表示两个类别,logistic 函数曲线很像 S 型,故此我们可以联系 sigmoid 函数:σ = 1/(1/(1+e-z))。为了实现 logistic 回归分类器,我们可以在每个特征上 乘以一个回归系数,将所有的乘积相加,将和值代入 sigmoid 函数中,得到一个范围为 0-1 之间的数,如果该数值大于 0.5 则被归入 1 类,否则被归为 0 类。 基于之前的分析,需要找到回归系数,首先我们可以将 sigmoid 函数的输入形式记为: z = w0x0+ w1x1 +...+wnxn,,其中 x 为输入数据,相应的 w 就是我们要求的系数,为了求 得最佳系数,结合最优化理论,我们可以选取梯度上升法优化算法。梯度上升法的基本思想 是:要找到函数的最大值,最好的方法是沿着该函数的梯度方向寻找。要想更进一步的了解 这个方法,建议去看 Andew Ng 的机器学习课程。
4 逻辑回归的python实现
#coding:utf-8 from numpy import * import math import matplotlib.pyplot as plt
#导入数据 def loadDataSet():
dataMat = []
labelMat = []
fr = open('testSet.txt')
for line in fr.readlines():
lineArr = line.strip().split()#将文本中的每行中的字符一个个分开,变成 list 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+exp(-inX))
#梯度上升方法求出回归系数
def gradAscent(data,label):
dataMat = mat(data)
labelMat = mat(label).transpose()
m,n = shape(dataMat)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
for item in range(maxCycles):
h = sigmoid(dataMat * weights)
error = (labelMat - h)#注意 labelMat 中的元素的数据类型应为 int
weights = weights + alpha * dataMat.transpose() * error
return weights
''' #测试 data,label = loadDataSet() print gradAscent(data,label) '''
##求出回归系数之后,就确定了不同数据类别之间的分隔线,为了便于理解,可以画出 那条线
def plotBestFit(weights):
dataMat,labelMat = loadDataSet()
dataArr = array(dataMat)
n = shape(dataArr)[0]
xcode1 = [] ycode1 = []
xcode2 = [] ycode2 = []
for i in range(n):
if int(labelMat[i]) == 1:
xcode1.append(dataArr[i,1])
ycode1.append(dataArr[i,2])
else: xcode2.append(dataArr[i,1])
ycode2.append(dataArr[i,2])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcode1,ycode1,s = 30,c = 'red',marker = 's')
ax.scatter(xcode2,ycode2,s = 30,c = 'green')
x = arange(-3.0,3.0,0.1)
y = (-weights[0] - weights[1] * x) / weights[2]
ax.plot(x,y)
plt.xlabel('x1')
plt.ylabel('y1')
plt.show()
''' #测试
data,label = loadDataSet() weights = gradAscent(data,label) plotBestFit(weights.getA()) '''
##改进的梯度上升法
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
m,n = shape(dataMatrix)
weights = ones(n)
#initialize to all ones
for j in range(numIter):
dataIndex = range(m)
for i in range(m):
alpha = 4/(1.0+j+i)+0.0001
randIndex = int(random.uniform(0,len(dataIndex)))
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex] - h
weights = weights + alpha * error * dataMatrix[randIndex] del(dataIndex[randIndex])
return weights
''' #测试 data,label = loadDataSet()
weights = stocGradAscent1(array(data),label)
plotBestFit(weights) '''