Logistic回归
最优化算法的一种。用一条直线对一些数据点进行拟合的过程称为回归。
回归的核心是寻找最佳拟合参数。
Sigmoid函数
随着z的增加,对应的Sigmoid值将逼近1;随着z的减少,对应的Sigmoid值将逼近0。Sigmoid值在0~1范围中,大于0.5的数据被分到1类,小于0.5的数据被分到0类。
Sigmoid函数的输入
向量x是分类器的输入数据,向量w是最佳参数。
w0 = 1,x0为直线截距。
梯度上升法
基本思想:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。
alpha是步长
示例:使用梯度上升找到最佳参数
(1) 处理文件数据:每行前两个值为X1和X2,第三个值为数据对应的类别。将X0的值设为1.0。
def loadDataSet():
dataMat = []
labelMat = []
fr = open('./testSet.txt','r')
for line in fr:
line = line.strip()
line = line.split('\t')
dataMat.append([1.0,float(line[0]),float(line[1])])
labelMat.append(int(line[-1]))
return dataMat,labelMat
(2) sigmoid函数
def sigmoid(z):
return 1/(1+np.exp(-z))
(3) 梯度上升寻找最优参数
def gradAscent(dataMatIn,classLabels):
dataMat = np.mat(dataMatIn)
labelMat = np.mat(classLabels).transpose()
row,col = np.shape(dataMatIn)
weights = np.ones((col,1))
alpha = 0.001
MaxCycles = 500
for k in range(MaxCycles):
h = sigmoid(dataMat * weights)
error = classLabels - h
weights += alpha * dataMat.transpose() * error
return weights
示例:随机梯度上升
随机梯度上升一次仅用一个样本点来更新回归系数,是一个在线学习算法。
def stocGradAscent0(dataMatIn,classLabels):
row,col = np.shape(dataMatIn)
# weights = np.ones((col,1))
weights = np.ones(col)
alpha = 0.01
# MaxCycles = 500
for i in range(row):
h = sigmoid(sum(dataMatIn[i] * weights))
error = classLabels[i] - h
weights += alpha * dataMatIn[i] * error
return weights
stocGradAscent0(np.array(dataArr),labelMat)
示例:改进的随机梯度上升
改进的地方:
(1) alpha每次迭代的时候都会调整。随着迭代次数不断减小,但永远不会减少到0。
(2) 随机选取样本更新回归系数。
def stocGradAscent0(dataMatIn,classLabels,numIter = 500):
row,col = np.shape(dataMatIn)
# weights = np.ones((col,1))
# alpha = 0.01
weights = np.ones(col)
# MaxCycles = 500
dataIndex = list(range(row))
for j in range(numIter):
for i in range(row):
alpha = 4/(1 + i + j) + 0.01
randIndex = int(np.random.uniform(0,len(dataIndex)))
h = sigmoid(sum(dataMatIn[randIndex] * weights))
error = classLabels[randIndex] - h
weights += alpha * dataMatIn[randIndex] * error
del dataIndex[randIndex]
return weights
stocGradAscent0(np.array(dataArr),labelMat)