目录
概念
Logistics回归
逻辑回归是用来做分类算法的,大家都熟悉线性回归,一般形式是Y=aX+b,y的取值范围是[-∞, +∞],有这么多取值,怎么进行分类呢?不用担心,伟大的数学家已经为我们找到了一个方法。
也就是把Y的结果带入一个非线性变换的Sigmoid函数中,即可得到[0,1]之间取值范围的数S,S可以把它看成是一个概率值,如果我们设置概率阈值为0.5,那么S大于0.5可以看成是正样本,小于0.5看成是负样本,就可以进行分类了。
Sigmoid函数
Sigmoid函数是一种阶跃函数( step function )。在数学中,如果实数域上的某个函数可以用半开区间上的指示函数的有限次线性组合来表示,那么这个函数就是阶跃函数。而数学中指示函数(indicator function)是定义在某集合X上的函数,表示其中有哪些元素属于某一子集A。
具体计算公式为:
为了实现Logistic回归分类器,我们在每个特征上都乘以一个回归系数,然后把所有的结果值相加,将这个总和代人Sigmoid函数中,进而得到一个范围在0~1之间的数值。任何大于0.5的数据被分入1类,小于0.5即被归入0类。所以,Logistic回归也可以被看成是一种概率估计。
优缺点
优点 :计算代价不高,易于理解和实现
缺点 :容易欠拟合,分类精度可能不高
使用数据类型:数值型和标称型数据
基于最优化方法的最佳回归系数确定
梯度上升法
主要思想
要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。
梯度上升算法到达每个点后都会重新估计移动方向。从P0开始,计算完该点的梯度,函数就根据梯度移动到P2。如此循环知道满足停止条件。
Logistic回归梯度上升优化算法
下面展示一些 内联代码片
。
// A code block
var foo = 'bar';
# 加载数据函数
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])) #添加标签
fr.close()
return dataMat,labelMat
#sigimod函数
def sigmoid(inX):
return 1.0/(1+np.exp(-inX))
#梯度上升算法
def gradAscent(dataMatIn,classLabels):
dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
labelMat = np.mat(classLabels).transpose() #转换后进行转置
m,n = np.shape(dataMatrix) #返回dataMatrix的大小,m为函数,n为列数
alpha = 0.001 #移动步长
maxCycles = 500 #最大迭代次数
weights = np.ones((n,1))
for k in range(maxCycles):
h = sigmoid(dataMatrix * weights)
error = labelMat - h
weights = weights + alpha * dataMatrix.transpose() * error
return weights.getA()
结果:
通过求解出的参数就可以确定不同类别数据之间的分割线,画出决策边界。
绘制决策边界
import matplotlib.pyplot as plt
import numpy as np
# 加载数据函数
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])) #添加标签
fr.close()
return dataMat,labelMat
#sigimod函数
def sigmoid(inX):
return 1.0/(1+np.exp(-inX))
# 绘制数据集的函数
def plotDataSet(weights):
dataMat, labelMat = loadDataSet() #加载数据集
dataArr = np.array(dataMat) #转换为np数组
n = np.shape(dataMat)[0]
xcord1 = [] ; ycord1 = [] #正样本
xcord2 = [] ; ycord2 = [] #负样本
for i in range(n): #根据数据集标签进行分类
if int(labelMat[i]) == 1: #1为正样本
xcord1.append(dataArr[i,1]);ycord1.append(dataArr[i,2])
else: #0为负样本
xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
fig = plt.figure()
ax = fig.add_subplot(111) #添加subplot
#绘制正负样本
ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker='s',alpha=.5)
ax