首先说一下线性回归模型:它试图学得一个通过属性的线性组合来进行预测的函数,即:
h(x) = w0 + w1x1 + w2x2 + ... + wnxn
写成向量形式为:h(x) = wTx
逻辑回归是一种分类算法,本质上是线性回归,它通过引入对数几率函数将线性回归得到的连续值映射到0~1之间,
从而可以用在分类问题上
逻辑回归的预测函数为:
对于任意确定的x和w,有:
可以合并写成:
对P(y|x,w)取极大似然函数:
取对数似然函数:
(即令每个样本属于其真实类别的概率总和越大越好)
上面的函数是关于w的凸函数,通过梯度上升法求对数似然函数的极大值(即最大值),
可以得到回归系数的更新方程为:
逻辑回归算法的优缺点:
优点:实现简单,易于理解和实现,计算代价不高,速度很快,存储资源低;
缺点:容易欠拟合,分类精度可能不高;
适用数据类型:数值型和标称型
逻辑回归算法的python实现
参考链接:http://blog.csdn.net/moxigandashu/article/details/72779856
1 #coding=utf-8 2 3 from numpy import * 4 5 # 创建测试数据 6 def loadDataSet(): 7 dataMat = []; labelMat = [] 8 fr = open(‘testSet.txt‘) # 测试数据的规格:100*3 9 for line in fr.readlines(): 10 lineArr = line.strip().split() # strip():删除首尾处的空格;split():不带参数时以空格进行分割 11 dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) 12 labelMat.append(int(lineArr[2])) 13 return dataMat,labelMat 14 15 def sigmoid(inX): 16 return 1.0/(1+exp(-inX)) 17 18 # 用梯度上升法求回归系数 19 def gradAscent(dataMatIn, classLabels): 20 dataMatrix = mat(dataMatIn) #将输入数据转换为矩阵 21 labelMat = mat(classLabels).transpose() #将分类标签的行向量转换为列向量 22 m,n = shape(dataMatrix) # 输入数据的规格:100*3 23 alpha = 0.001 #迭代步长 24 maxCycles = 500 #迭代次数 25 weights = ones((n,1)) #权重向量的初始值设为1,列向量 26 for k in range(maxCycles): 27 h = sigmoid(dataMatrix*weights) #计算预测函数的值 28 error = (labelMat - h) 29 weights = weights + alpha * dataMatrix.transpose()* error #更新权重向量 30 return weights 31 32 # 用学习到的回归系数来画出决策边界 33 def plotBestFit(weights): 34 import matplotlib.pyplot as plt 35 dataMat,labelMat=loadDataSet() 36 dataArr = array(dataMat) 37 n = shape(dataArr)[0] 38 xcord1 = []; ycord1 = [] 39 xcord2 = []; ycord2 = [] 40 for i in range(n): 41 if int(labelMat[i])== 1: 42 xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) 43 else: 44 xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) 45 fig = plt.figure() 46 ax = fig.add_subplot(111) 47 ax.scatter(xcord1, ycord1, s=30, c=‘red‘, marker=‘s‘) # marker=‘s‘:表示用小正方形画点 48 ax.scatter(xcord2, ycord2, s=30, c=‘green‘) 49 x = arange(-3.0, 3.0, 0.1) 50 y = (-weights[0,0]-weights[1,0]*x)/weights[2,0] # 得到最后的预测函数:f(x)=w0 + w1x1 + w2x2,令f(x)=0,得到:x2=(-w0-w1x1)/w2 51 ax.plot(x, y) 52 plt.xlabel(‘X1‘); plt.ylabel(‘X2‘); 53 plt.show() 54 55 # 测试逻辑回归算法 56 dataArr,labelMat=loadDataSet() 57 weights=gradAscent(dataArr,labelMat) 58 plotBestFit(weights)
测试的分类结果: