更新 function.py
Gitea Actions Experiment Test / Experiment-Actions (push) Successful in 41s

This commit is contained in:
2024-10-31 17:28:43 +08:00
parent 95763dc72a
commit d403b18c0b
+77 -1
View File
@@ -56,4 +56,80 @@ def load_data(filepath, k_features=20):
return data, labels
# 其余代码保持不变
def sigmoid(z):
"""
Sigmoid激活函数,用于对率回归模型。
Args:
- z (numpy array): 输入数据。
Returns:
- numpy array: Sigmoid函数输出值。
"""
return 1 / (1 + np.exp(-z))
def train_logreg(X, y, initial_lr=0.005, iterations=5000, regularization=0.01, decay=0.0001):
"""
对率回归训练函数,包含学习率衰减策略。
Args:
- X (numpy array): 特征数据。
- y (numpy array): 标签数据。
- initial_lr (float): 初始学习率。
- iterations (int): 迭代次数。
- regularization (float): 正则化强度。
- decay (float): 学习率衰减系数。
Returns:
- numpy array: 训练得到的权重。
"""
m, n = X.shape
weights = np.zeros(n)
learning_rate = initial_lr
for i in range(iterations):
z = np.dot(X, weights)
predictions = sigmoid(z)
errors = y - predictions
gradient = np.dot(X.T, errors) / m - regularization * weights / m
weights += learning_rate * gradient
# 学习率衰减
learning_rate = initial_lr / (1 + decay * i)
return weights
def predict_logreg(inX, weights, threshold=0.5):
"""
对率回归预测函数,包含可调阈值。
Args:
- inX (numpy array): 输入待分类的样本。
- weights (numpy array): 训练得到的权重。
- threshold (float): 判定阈值,默认为0.5。
Returns:
- int: 预测的分类标签。
"""
probability = sigmoid(np.dot(inX, weights))
return 1 if probability >= threshold else 2
# 测试代码
if __name__ == "__main__":
# 加载数据并选择前20个最重要的特征
X_train, y_train = load_data("./data/horse-colic.data", k_features=20)
X_test, y_test = load_data("./data/horse-colic.test", k_features=20)
# 训练模型
weights = train_logreg(X_train, y_train, initial_lr=0.005, iterations=5000, regularization=0.01, decay=0.0001)
# 模型评估
correct_predictions = 0
for i in range(len(X_test)):
y_pred = predict_logreg(X_test[i], weights, threshold=0.5)
if y_pred == y_test[i]:
correct_predictions += 1
print(f"预测结果: {y_pred}, 实际结果: {y_test[i]}")
accuracy = correct_predictions / len(X_test)
print(f"测试集准确率: {accuracy:.2f}")