机器学习系列(四)Logistc 回归
内容目录
1、数据类型2、算法概述:3、梯度上升算法4、Python代码
1、数据类型
一切数据都可以分为两种,即定性数据和定量数据。 定性数据: 没有数值特征,不能进行数学运算,分为分类数据和顺序数据两类, (1)分类数据如反映“性别”、“职业”等现象的属性特点的数据,只能用来区分事物,而不能用来表明实物之间的大小、优劣关系。 (2)顺序数据,是只能归于某一有序类别的非数字型数据。顺序数据虽然也是类别, 但这些类别是有序的。比如将产品分为一等品、二等品、三等品、次品等 ,相应的观察结果就是顺序数据,顺序数据的数据之间虽然可以比较大小,却无法计算相互之间的大小、高低或优劣的距离。 定量数据: 反应“考分”、“收入”等可以用数值表示的变量,具有明确的数值含义,不仅可以分类还可以具体计算大小和差异。 之所以介绍两种数据类型,是因为还有一个概念是线性回归,线性回归分析的是定量数据,而逻辑回归分析的是分类数据,属于定性数据。
2、算法概述
回归就是给定数据之后,求解这些数据的函数表达式的方法。 首先给出线性回归的模型,最常用的线性回归,包括一元和多元线性回归,区别仅在于X的数量不同,本质是完全相同的
写成向量形式:
以二元回归分类为例,我们需要的结果只有0和1两类,这种计算结果可能会存在值小于0或者大于1的情况,我们可以找到一个单调可微(连续且光滑)的函数来构建X和Y的关系,称为广义线性回归模型
logistic回归是处理二分类问题的,所以输出的标记y={0,1},并且线性回归模型产生的预测值y=wx b是一个实值,所以我们将实值z转化成0/1值便可,首先想到的是“单位阶跃函数”, 如果预测值大于0便判断为正例,小于0则判断为反例,等于0则可任意判断!但这个函数并非一个连续函数
进而引出连续的函数Sigmoid,
曲线形状如下
在原来的线性回归模型外面套上sigmoid函数便形成了logistic回归模型的预测函数,可以用于二分类问题:
上式可以变换为:
这里引入一个概念为事件的几率(odds),上指事件发生的概率与不发生的概率的比值,即p/(1-p),事件的对数几率(log odds)或logit函数为
通过取对数可以将几率输出转换到整个实数范围,这也是logistic回归又被称为对数几率回归的原因。
3、梯度上升算法
梯度上升算法的思想是沿着函数的梯度方向找到某个函数的最大值,如果梯度为,则函数(x,y)的梯度为
即沿着x的方向移动
,沿着y的方向移动
,梯度算子在每个位置都会重新计算梯度,总是指向函数值增长最快的方向,移动的步长为alpha,梯度上升算法的迭代公式为:
将梯度取反即可得到梯度下降算法的公式:
在不断迭代过程中,如果迭代次数达到给定值或者算法的结果误差到达可接受的误差范围即可停止迭代。
4、Python代码
下面是《机器学习实战》中的Python代码
代码语言:javascript复制from numpy import *
def loadDataSet():
dataMat = [];
labelMat = []
fr = open('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
def sigmoid(inX):
return 1.0 / (1 exp(-inX))
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn) # convert to NumPy matrix
labelMat = mat(classLabels).transpose() # convert to NumPy matrix
m, n = shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = ones((n, 1))
for k in range(maxCycles): # heavy on matrix operations
h = sigmoid(dataMatrix * weights) # matrix mult
error = (labelMat - h) # vector subtraction
weights = weights alpha * dataMatrix.transpose() * error # matrix mult
return weights
def plotBestFit(weights):
import matplotlib.pyplot as plt
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(-3.0, 3.0, 0.1)
y = (-weights[0] - weights[1] * x) / weights[2] #最佳拟合直线
ax.plot(x, y)
plt.xlabel('X1');
plt.ylabel('X2');
plt.show()
if __name__ =='__main__':
dataArr,labelMat=loadDataSet()
weights=gradAscent(dataArr,labelMat)
plotBestFit(weights.getA())
运行结果:
总结:logistc回归的目的是寻找一个非线性函数sigmoid的最佳拟合参数,求解过程可以由最优化算法来完成。在最优化算法中,最常用的就是梯度上升算法,而梯度上升算法又可以简化为随机梯度上升算法。