4.1.1简单神经网络

文章通过Python代码展示了如何构建logistics模型,使用sigmoid函数和随机梯度下降法优化参数w和b。通过两组数据集,演示了模型的预测过程,包括计算预测值和绘制决策边界,讨论了模型在不同数据集上的预测效果和损失函数的变化。
摘要由CSDN通过智能技术生成

对于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

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝶戏花间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值