假设我们有一个二元分类问题,有两个特征(x1, x2)和对应的类别标签(y)。给定
以下训练数据集:
我们定义逻辑回归模型的假设函数和损失函数。假设函数使用 sigmoid 函
数来将线性函数的输出转换为概率值,使用对数损失函数(log loss)来衡量模
型的预测结果与实际类别标签之间的差异,请使用逻辑回归模型对新的测试样本
(2.2, 2.3) 进行分类预测。
import numpy as np
# 定义sigmoid函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 训练数据集
X_train = np.array([[1.0, 2.0],
[1.5, 1.8],
[2.0, 2.5],
[3.0, 3.2]])
y_train = np.array([0, 0, 1, 1])
# 添加偏置项,将特征向量X_train扩展为(X0=1, X1, X2)
X_train = np.column_stack((np.ones(X_train.shape[0]), X_train))
print("添加偏置项后的训练数据集:")
print(X_train)
# 初始化模型参数
w = np.zeros(X_train.shape[1])
print("初始化模型参数 w:")
print(w)
# 定义损失函数(对数损失函数)
def loss_function(X, y, w):
z = np.dot(X, w)
h = sigmoid(z)
loss = -y * np.log(h) - (1 - y) * np.log(1 - h)
return np.mean(loss)
# 定义梯度下降函数
def gradient_descent(X, y, w, learning_rate, num_iter):
m = X.shape[0]
for i in range(num_iter):
z = np.dot(X, w)
h = sigmoid(z)
gradient = np.dot(X.T, (h - y)) / m
w -= learning_rate * gradient
loss = loss_function(X, y, w)
print("迭代次数:{},模型参数 w:{},损失函数值:{}".format(i+1, w, loss))
return w
# 训练模型
learning_rate = 0.1
num_iter = 1000
w = gradient_descent(X_train, y_train, w, learning_rate, num_iter)
print("经过梯度下降算法训练后的模型参数 w:")
print(w)
# 测试样本
X_test = np.array([[1, 2.2], [2.2, 2.3]])
# 添加偏置项,将测试样本扩展为(X0=1, X1, X2)
X_test = np.column_stack((np.ones(X_test.shape[0]), X_test))
print("添加偏置项后的测试样本:")
print(X_test)
# 使用训练好的模型进行分类预测
z_test = np.dot(X_test, w)
h_test = sigmoid(z_test)
# 判断类别标签
predictions = np.round(h_test).astype(int)
# 打印预测结果
# 打印预测结果和属于正类的概率值
for i in range(X_test.shape[0]):
print("预测样本{}属于{},属于正类的概率值为{}".format(i+1, "正类" if predictions[i]==1 else "负类", h_test[i]))
print("预测样本{}的类别标签:{}".format(i + 1, predictions[i]))
# for i in range(X_test.shape[0]):
# if predictions[i] == 1:
# print("预测样本{}属于正类".format(i + 1))
# else:
# print("预测样本{}属于负类".format(i + 1))
# for i in range(X_test.shape[0]):
# print("预测样本{}的类别标签:{}".format(i + 1, predictions[i]))
对于测试样本 (1,2.2), (2.2, 2.3),我们可以使用经过训练得到的 logistic 回归模型对其进行分类预测,并计算其属于正类的概率值。
具体地,我们可以先将测试样本添加偏置项,然后将该样本的特征向量带入经过训练得到的模型参数 w 中,计算出 sigmoid 函数的输出值(即该样本属于正类的概率值),最后根据概率值来判断该样本属于哪个类别。
sigmoid 函数的计算 1/(1+exp(−z))