import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def initialize_params(dims):
"""
参数初始化函数
"""
W = np.zeros((dims, 1))
b = 0
return W, b
def logistic(X, y, W, b):
"""
:param X: 输入特征矩阵
:param y: 输入标签向量
:param W: 权重系数
:param b: 偏置参数
:return:
"""
num_train = X.shape[0]
num_feature = X.shape[1]
# 对数几率回归模型输出
a = sigmoid(x=(np.dot(X, W) + b))
# 交叉熵损失
cost = -1 / num_train * np.sum(y*np.log(a) + (1-y)*np.log(1-a))
# 权重梯度
dW = np.dot(X.T, (a-y)) / num_train
# 偏置梯度
db = np.sum(a-y) / num_train
# 压缩损失数组维度
cost = np.squeeze(cost)
"""
a: 对数几率回归模型输出
cost: 损失
dW: 权重梯度
db: 偏置梯度
"""
return a, cost, dW, db
def logistic_train(X, y, learning_rate, epochs):
W, b = initialize_params(di