Python 使用 Softmax 进行多分类回归
以下是使用 Softmax 进行多分类回归的 Python 代码示例:
import numpy as np
def softmax(X):
exps = np.exp(X - np.max(X, axis=1, keepdims=True))
return exps / np.sum(exps, axis=1, keepdims=True)
def cross_entropy(pred, y):
m = y.shape[0]
log_likelihood = -np.log(pred[range(m), y])
loss = np.sum(log_likelihood) / m
return loss
def one_hot_encoding(y, num_classes):
m = y.shape[0]
one_hot = np.zeros((m, num_classes))
one_hot[range(m), y] = 1
return one_hot
# 生成示例数据
np.random.seed(0)
num_samples = 100
num_features = 10
num_classes = 3
X = np.random.randn(num_samples, num_features)
y = np.random.randint(num_classes, size=num_samples)
# 数据预处理
X_mean = np.mean(X, axis=0)
X_std = np.std(X, axis=0)
X = (X - X_mean) / X_std
y_encoded = one_hot_encoding(y, num_classes)
# 初始化参数
learning_rate = 0.01
num_iterations = 1000
W = np.random.randn(num_features, num_classes)
b = np.zeros((1, num_classes))
# 梯度下降训练
for i in range(num_iterations):
# 前向传播
scores = np.dot(X, W) + b
probabilities = softmax(scores)
# 计算损失函数
loss = cross_entropy(probabilities, y)
# 反向传播
grad_scores = probabilities
grad_scores[range(num_samples), y] -= 1
grad_scores /= num_samples
grad_W = np.dot(X.T, grad_scores)
grad_b = np.sum(grad_scores, axis=0, keepdims=True)
# 参数更新
W -= learning_rate * grad_W
b -= learning_rate * grad_b
if (i + 1) % 100 == 0:
print(f'Iteration {i+1}, Loss: {loss:.4f}')
# 测试
test_scores = np.dot(X, W) + b
test_probabilities = softmax(test_scores)
predictions = np.argmax(test_probabilities, axis=1)
accuracy = np.mean(predictions == y)
print(f'Test Accuracy: {accuracy:.4f}')
在这个示例中,我们首先定义了 softmax 函数,用于将模型的输出转化为概率分布。然后定义了交叉熵损失函数和独热编码函数。
然后,我们生成了示例数据,并对输入数据进行了标准化处理,并对目标变量进行了独热编码。
接下来,我们初始化模型的参数,并使用梯度下降进行训练。在每一次迭代中,我们进行前向传播,计算损失函数,然后进行反向传播,更新参数。每 100 次迭代,我们打印当前的损失值。
最后,我们使用训练好的模型进行测试,并计算准确率。
请注意,这只是一个简单的示例,实际应用中可能需要进行更多的数据预处理和调参。
原文地址: https://www.cveoy.top/t/topic/bhsZ 著作权归作者所有。请勿转载和采集!