第六章 逻辑回归(猫狗预测)
这个怪难的,而且预测的也没那么准
# 逻辑回归
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("预测结果:狗")
``


浙公网安备 33010602011771号