欢迎访问宙启技术站
智能推送

利用sigmoid函数进行二分类的例子

发布时间:2023-12-19 03:47:01

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之间概率值的模型。通过这个模型,我们可以对新的样本进行预测,并得到其属于男性和女性的概率值。