在《机器学习学习笔记(8)----logistic回归模型》文章中,我们推导出了logistic回归模型的梯度计算的代数公式,为了便于编程计算,我们将其转换成矩阵形式,并得出logistic回归模型的梯度下降迭代公式:
损失函数计算公式的矩阵表示如下:
这样,实现logistic回归模型的批量梯度下降方法的代码如下(gdlogistic.py,源码参考自《Python机器学习算法:原理,实现与案例》):
import numpy as np
class GDLogisticRegression:
def __init__(self, n_iter=1000, eta=1e-4, tol=None):
# 训练迭代次数
self.n_iter = n_iter
# 学习率
self.eta = eta
# 误差变化阈值
self.tol = tol
# 模型参数w(训练时初始化)
self.w = None
def _preprocess_data_X(self, X):
'''数据预处理'''
# 扩展X,添加x0列设置为1
m, n = X.shape
X_ = np.empty((m, n + 1))
X_[:, 0] = 1
X_[:, 1:] = X
return X_
def _loss(self, y, y_pred):
'''损失函数计算'''
return -(1.0/y.size)*(np.matmul(y.T, np.log(y_pred))+np.matmul((1 - y.T), np.log(1-y_pred)))
def _gradient(self, X, y, y_pred):
'''计算梯度'''
return np.matmul(X.T, y_pred - y)/y.size
def _sigmoid(self, z):
return 1.0/(1.0+np.exp(-z))
def _predict(self, X, w):
'''h(x)函数 :预测y=1的概率'''
z = np.matmul(X, w)
return self._sigmoid(z)
def _gradient_decent(self, w, X, y):
'''梯度下降算法'''
# 若用户指定tol,则启动早期停止法
if self.tol is not None: