利用sigmoid函数进行二分类的例子
sigmoid函数是一种常用的激活函数,通常用于将一个连续的数值映射到0和1之间的概率值,适用于二分类问题。以下是一个使用sigmoid函数进行二分类的例子:
假设我们有一个数据集,其中包含了一些人的身高和体重,我们想根据这些数据判断一个人是否为男性(1代表男性,0代表女性)。
首先,我们需要导入一些必要的库。在Python中,我们可以使用numpy库来进行数值计算,并使用matplotlib库来进行数据可视化。
import numpy as np import matplotlib.pyplot as plt
接下来,我们需要创建一个训练集,其中包含了一些已知的样本数据和对应的标签。假设我们有100个男性和100个女性的数据。
# 生成随机的身高和体重数据 np.random.seed(0) height = np.random.normal(170, 10, 200) weight = np.random.normal(65, 5, 200) # 生成对应的标签,前100个为1(男性),后100个为0(女性) labels = np.concatenate((np.ones(100), np.zeros(100)))
我们可以使用scatter函数将数据可视化出来,横轴表示身高,纵轴表示体重,不同的颜色表示不同的性别。
plt.scatter(height, weight, c=labels)
plt.xlabel('Height')
plt.ylabel('Weight')
plt.show()
接下来,我们需要定义一个sigmoid函数,可以将输入的数值映射到0和1之间的概率值。
def sigmoid(x):
return 1 / (1 + np.exp(-x))
然后,我们需要定义一个损失函数,用来评估模型的性能。在二分类问题中,通常使用交叉熵损失函数。
def cross_entropy_loss(y, y_pred):
return -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))
现在,我们可以开始训练我们的模型。首先,我们需要随机初始化模型的参数,这里我们使用两个参数w1和w2分别表示身高和体重的权重。
# 随机初始化参数 np.random.seed(0) w1 = np.random.normal(0, 0.01) w2 = np.random.normal(0, 0.01) b = np.random.normal(0, 0.01)
然后,我们可以定义一个前向传播的函数,根据当前的参数预测样本的标签。
def forward_propagation(x1, x2, w1, w2, b):
z = w1 * x1 + w2 * x2 + b
a = sigmoid(z)
return a
接下来,我们需要定义一个反向传播的函数,用来更新模型的参数。
def back_propagation(x1, x2, y, y_pred, w1, w2, b, learning_rate):
dw1 = np.mean((y_pred - y) * x1)
dw2 = np.mean((y_pred - y) * x2)
db = np.mean(y_pred - y)
w1 -= learning_rate * dw1
w2 -= learning_rate * dw2
b -= learning_rate * db
return w1, w2, b
现在,我们可以开始训练我们的模型。首先,我们需要将数据规范化,将身高和体重都除以相应的最大值。
height /= np.max(height) weight /= np.max(weight)
然后,我们可以定义一些超参数,如学习率、迭代次数等。
learning_rate = 0.01 num_iterations = 1000
接下来,我们可以使用一个循环来迭代地更新模型的参数。
for i in range(num_iterations):
# 前向传播
y_pred = forward_propagation(height, weight, w1, w2, b)
# 计算损失
loss = cross_entropy_loss(labels, y_pred)
# 输出当前的损失值
if i % 100 == 0:
print('Iteration %d, loss: %.4f' % (i, loss))
# 反向传播
w1, w2, b = back_propagation(height, weight, labels, y_pred, w1, w2, b, learning_rate)
最后,我们可以使用训练好的模型对新的样本进行预测。
# 预测一个男性和一个女性的身高和体重
new_height = [175, 160]
new_weight = [70, 55]
# 规范化
new_height /= np.max(height)
new_weight /= np.max(weight)
# 预测
predictions = forward_propagation(new_height, new_weight, w1, w2, b)
print('Predictions:', predictions)
以上就是一个使用sigmoid函数进行二分类的例子。在这个例子中,我们使用了身高和体重来预测一个人的性别,通过不断迭代更新模型的参数,最终得到了一个能够将身高和体重映射到0和1之间概率值的模型。通过这个模型,我们可以对新的样本进行预测,并得到其属于男性和女性的概率值。
