手动实现算法的三个步骤
1.定义预测函数.sigmoid
g
(
z
)
=
1
1
+
e
−
z
g(z) = \frac{1}{1+e^{-z}}
g(z)=1+e−z1
2.定义损失函数(目标)函数
3.使用梯度下降求损失函数最小时的系数
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def sigmoid(W,B):
linear = np.dot(X,W) + B
return 1/ (1 + np.exp(-linear))
def loss(y_true,y_pred):
return -np.sum(y_true * np.log(y_pred)+(1-y_true)*np.log(1-y_pred))/100
W = np.random.randn(2) * 0.01
B = 0
learning_rate = 0.01
max_iter = 10000
i = 0
while True:
y_pred = sigmoid(W,B)
# 计算梯度/导数
dW = np.dot((y_pred - y_true),X)/100
dB = np.sum(y_pred - y_true)/100
W = W - learning_rate * dW
B = B - learning_rate * dB
# 每隔100输出中间过程
if i % 100 == 0:
# 计算准确率和损失函数
# 设定阈值把概率转换为类别
# 假设阈值为0.5, >0.5为正例
y_ = (y_pred >= 0.5)
accuracy=(y_ == y_true).mean()
y_pred = sigmoid(W,B)
cost=loss(y_true,y_pred)
print(f'第{i}次训练,损失:{cost},准确率:{accuracy}')
i += 1
if i > max_iter:
break