一、概念理解
逻辑回归其实是一种分类算法,我们把它称作回归是因为我们要找到一个将数据分隔开的边界线,而我们通过根据现有数据进行学习来对这个边界做回归来获得这个分类的边界,即获得一组最佳拟合系数。我们用 来表示这条边界线,
为系数。
我们需要将这条边界线与数据的标记 联系起来,从而进行分类,若是二分类任务,那么标记
,我们可以用一个函数来将实数值
转为 0/1 值。考虑连续性,我们用一种Sigmoid函数
来对
值进行转化,该函数图像为:
我们可以根据 来对预测值进行判别分类。
接下来我们要怎样在每一轮学习中对系数进行优化,朝着那个方向对参数进行变化呢?
将 代入
可得
,变化后得
,我们把
看作样本为正例的可能性,那么
看作样本为反例的可能性。我们将
和
用后验概率进行替换,然后通过极大似然估计,通过样本结果反推最有可能导致这种结果的参数,最大化
来估计参数
和
。最后可得:
。
以梯度上升法为例,每一次用 来更新参数。
以《机器学习实战》中的例子:
def sigmoid(inX):
if inX>=0:
return 1.0/(1+np.exp(-inX))
else:
return np.exp(inX)/(1+np.exp(inX))
#Logistic回归梯度上升优化算法,每次用整个数据集进行更新
def gradAdscent(dataSet,labelSet):
dataMat = np.mat(dataSet)
labelMat = np.mat(labelSet).transpose()
m,n = dataMat.shape
W = np.ones((n,1))
a = 0.001
maxCycles = 500
for i in range(maxCycles):
p = sigmoid(dataMat*W)
error = labelMat-p
W = W + a * dataMat.transpose() * error
# print(sigmoid(dataMat[10] *W),labelMat[10])
return W
#Logistic回归随机梯度上升优化算法,每次用一个样本点对系数更新
def stocGradAscent0(dataMatrix, classLabels):
m,n = dataMatrix.shape
alpha = 0.01
weights = np.ones(n) #initialize to all ones
for i in range(m+5800):
h = sigmoid(np.sum(dataMatrix[i%m]*weights))
error = classLabels[i%m] - h
weights = weights + alpha * error * dataMatrix[i%m]
return weights
数据集和分类边界线: