V1

2023/03/11阅读：10主题：默认主题

# 2 假设函数

• 时，预测
• 时，预测

，即：

• 时，预测
• 时，预测

import numpy as npdef sigmoid(z):    return 1 / (1 + np.exp(-z))def hypothesis_fun(x, theta):    return sigmoid(theta @ x)

Sigmoid函数的图像如下：

import matplotlib.pyplot as pltx = np.linspace(-5, 5, 100)plt.ylim(0, 1)plt.vlines(x=0, ymin=0, ymax=1, colors='k')plt.plot(x, sigmoid(x));

# 3 损失函数

def loss_fun(x, y, theta):    y_p = hypothesis_fun(x, theta)    first = y * np.log(y_p)    second = (1 - y) * np.log(1 - y_p)    return -np.sum(first + second)/(y.size)

# 4 梯度优化

def gradient_decent(x, y, theta, learning_rate):    gradient = x @ (hypothesis_fun(x, theta) - y)/ y.size    return theta - learning_rate * gradient

# 5 测试数据集

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
path = 'class.data'data = pd.read_csv(path)data.head()
X Y Admitted
0 34.623660 78.024693 0
1 30.286711 43.894998 0
2 35.847409 72.902198 0
3 60.182599 86.308552 1
4 79.032736 75.344376 1
x = data[['X', 'Y']].to_numpy()x = x.transpose()y = data['Admitted'].to_numpy()x.shape, y.shape

((2, 100), (100,))

positive = data[data['Admitted'].isin([1])]negative = data[data['Admitted'].isin([0])]fig, ax = plt.subplots(figsize=(12, 8))ax.scatter(positive['X'], positive['Y'], s=50,            c='b', marker='o', label='Admitted')ax.scatter(negative['X'], negative['Y'], s=50,            c='r', marker='x', label='Not Admitted')ax.legend()ax.set_xlabel('Exam 1 Score')ax.set_ylabel('Exam 2 Score')plt.show()

# 6 模型训练与预测

x2 = feature_scale(x)x2 = np.vstack((np.ones(x2.shape[1]), x2))parameters = np.random.rand(x2.shape[0])learning_rate = 0.1losses = []batch_size = 70epoch_size = 1000for epoch in range(epoch_size):    for i in range(y.size//batch_size+1):        random_samples = np.random.choice(x2.shape[1], batch_size)        parameters = gradient_decent(x2[:, random_samples],                               y[random_samples],                               parameters,                               learning_rate)        losses.append(loss_fun(x2, y, parameters))
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 9))ax1.plot(losses)ax1.set_xlabel('Iteration number')ax1.set_ylabel('Loss')predict_y = hypothesis_fun(x2, parameters)predict_y[predict_y>=0.5] = 1predict_y[predict_y<1] = 0ax2.scatter(x[0][predict_y!=y], x[1][predict_y!=y], s=80,             c='r', marker='o', label='Wrong', alpha=1)ax2.scatter(x[0][predict_y==1], x[1][predict_y==1], s=50,             c='b', marker='*', label='Admitted')ax2.scatter(x[0][predict_y==0], x[1][predict_y==0], s=50,             c='b', marker='x', label='Not Admitted')ax2.legend()ax2.set_xlabel('X')ax2.set_ylabel('Y')plt.show();

times = 3x2 = x.copy()for i in range(2, times+1):    x2 = np.vstack((x2, x2**i))x2 = feature_scale(x2)x2 = np.vstack((np.ones(x2.shape[1]), x2))

Python

V1