对于logistics模型中sigmoid函数,损失函数,w与b的梯度 可以参考下图
首先定义sigmoid函数和三个需要用到的函数
import numpy as np
import matplotlib.pyplot as plt
# 定义函数sigmoid()
def sigmoid(input_i):
return 1.0 / (1 + np.exp(-input_i))
"""
定义函数logit_model(),通过随机梯度下降法估计参数
"""
def logit_mode(x, y, w, b, lr):
for item in range(60):
loss = 0
for i in range(len(x)):
pred = sigmoid(np.dot(x[i:i + 1], w) + b) # 计算预测值
loss += -(y[i:i + 1] * np.log(pred) + (1 - y[i:i + 1]) * np.log(1 - pred)) # 计算误差
delta = pred - y[i:i + 1]
b -= lr * delta # 更新截距项b
w -= lr * np.dot(x[i:i + 1].T, delta) # 更新权重矩阵w
if item % 10 == 9 or item == 59:
print("Loss" + str(loss))
return w, b
"""
定义函数predict_logit_model(),当给定w与b时,计算logistic模型的预测值
定义函数scatter_simple_data(),画x的散点图
定义函数plot_decision_bound(),画logistics模型的决策边界
"""
def predict_logit_model(x, w, b):
pred = []
for i in range(len(x)):
tem = sigmoid(np.dot(x[i:i + 1], w) + b) # 计算预测概率
if tem > 0.5:
tem = 1 # 决策
else:
tem = 0
pred.append(tem)
return np.array(pred)
def scatter_simple_data(x, y):
plt.scatter(x[y == 0, 0], x[y == 0, 1], label="0", marker="o")
plt.scatter(x[y == 1, 0], x[y == 1, 1], s=80, label="1", marker="s")
plt.legend()
plt.xlabel("x1", fontsize=16)
plt.ylabel("x2", fontsize=16)
plt.show()
def plot_decision_bound(x, y, w, b):
x1 = np.linspace(0, 1, 100)
x2 = (-b - x1 * w[0]) / w[1]
plt.scatter(x[y == 0, 0], x[y == 0, 1], label="0", marker="o")
plt.scatter(x[y == 1, 0], x[y == 1, 1], s=80, label="1", marker="s")
plt.plot(x1, x2)
plt.legend()
plt.xlabel("x1", fontsize=16)
plt.ylabel("x2", fontsize=16)
plt.show()
生成第一组数据进行预测
"""
定义函数create_data_set_1(),生成第一组数据
"""
def create_data_set_1():
x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) # 生成自变量矩阵
y = np.array([1, 1, 0, 0]) # 生成因变量矩阵
return x, y
x, y = create_data_set_1()
scatter_simple_data(x, y)
np.random.seed(4)
w = np.random.normal(size=2) # w初值从标准正态分布中随机生成
b, lr = 0, 0.1
w, b = logit_mode(x, y, w, b, lr)
pred = predict_logit_model(x, w, b)
print("因变量的真实值为" + str(y))
print("因变量的预测值为" + str(pred))
plot_decision_bound(x, y, w, b)
观测第一组数据的散点图,运行结果和决策边界,发现预测值等于真实变量,损失值稳定在0.8附近
生成第二组数据进行预测
"""
定义函数create_data_set_2()生成第二组数据
"""
def create_data_set_2():
x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([1, 0, 0, 1])
return x, y
x, y = create_data_set_2()
scatter_simple_data(x, y)
w = np.array([0, -0.3])
b, lr = 0, 0.1
w, b = logit_mode(x, y, w, b, lr) #训练模型迭代至收敛
y_pred = predict_logit_model(x, w, b) # 得到预测值
print("因变量的真实值为" + str(y))
print("因变量的预测值为" + str(y_pred))
plot_decision_bound(x, y, w, b) # 绘制决策边界
观测第二组数据的散点图,运行结果和决策边界,发现预测值并不和真实变量相等,说明这种模型还不能够较好预测矩阵变量y,损失值稳定在2.88