第六章 逻辑回归(猫狗预测)

这个怪难的,而且预测的也没那么准

# 逻辑回归
import numpy as np  # 导入numpy库


def sigmoid(x):  # sigmoid函数是激活函数,用于将线性模型转换为概率模型
    result = 1 / (1 + np.exp(-x))  # 计算sigmoid函数
    return result  # 返回sigmoid函数的结果


if __name__ == "__main__":# 主函数
    dogs = np.array(
        [[8.9, 10], [9, 11], [12.0, 12.2], [9.7, 12.2], [9.9, 13.1]], dtype=np.float64
    )
    # 狗的身高和体重
    cats = np.array(
        [[4.9, 6], [5, 4], [2.0, 5.2], [4.7, 6.2], [4.0, 5.1]], dtype=np.float64
    )
    # 猫的身高和体重

    x = np.vstack((dogs, cats))  # 合并狗和猫的数据

    label_2_index = {"狗": 0, "猫": 1}  # 标签和索引的对应关系
    label = np.array([0] * len(dogs) + [1] * len(cats)).reshape(-1, 1)  # 标签

    b = 0
    weights = np.random.normal(0, 1, size=(2, 1))  # 随机初始化权重

    lr = 0.005  # 学习率

    epochs = 100  # 迭代次数

    for e in range(epochs):
        out = x @ weights + b  # 计算输出值

        pre = sigmoid(out)  # 计算sigmoid函数的输出值

        loss = -np.mean(label * np.log(pre) + (1 - label) * np.log(1 - pre))
        # 计算损失函数

        G = (pre - label) / weights.shape[0]  # 计算梯度

        delta_w = x.T @ G  # 计算权重的更新值
        delta_b = np.sum(G)  # 计算偏置的更新值

        weights -= lr * delta_w  # 更新权重
        b -= lr * delta_b  # 更新偏置

        print("Epoch:", e + 1, "Loss:", loss)# 打印损失函数的值

    while True:# 循环输入测试数据
        f1 = float(input("请输入特征1:"))# 输入特征1
        f2 = float(input("请输入特征2:"))# 输入特征2

        p = np.array([f1, f2]).reshape(1, -1) @ weights + b# 计算预测值

        if p>0:# 预测值大于0,则预测为猫,否则预测为狗
            print("预测结果:猫")
        else:
            print("预测结果:狗")

``
image

posted @ 2025-08-27 16:34  李大嘟嘟  阅读(10)  评论(0)    收藏  举报