diff --git a/function.py b/function.py index f6f3d76..1b74ab2 100644 --- a/function.py +++ b/function.py @@ -1,49 +1,29 @@ import numpy as np -from sklearn.preprocessing import StandardScaler -def train_logreg(X, y, learning_rate=0.01, iterations=1000, lambda_reg=0.01): - """ - 对率回归训练函数。 - Args: - - X (numpy array): 特征数据。 - - y (numpy array): 标签数据。 - - learning_rate (float): 学习率,默认为0.01。 - - iterations (int): 迭代次数,默认为1000。 - - lambda_reg (float): L2正则化系数,默认为0.01。 +""" +实验说明: +- 自行编写实现数据加载与预测病马死亡的对率回归算法。 - Returns: - - numpy array: 训练得到的权重。 - """ - m, n = X.shape - weights = np.zeros(n) - - for _ in range(iterations): - for i in range(m): - x_i = X[i] - y_i = y[i] - # 计算预测值 - prediction = 1 / (1 + np.exp(-np.dot(x_i, weights))) - # 计算梯度 - gradient = x_i * (prediction - y_i) - # 更新权重 - weights -= learning_rate * (gradient + lambda_reg * weights) - - return weights +注意事项: +- 在 function.py 中实现对率回归算法。 +- 可以自行导入其他库,需要在 requirements.txt 添加依赖,若未在 requirements.txt 中添加使用到的依赖,则无法自动评测,成绩为零。 +- 自动评测脚本仅会加载 train_logreg、predict_logreg 和 load_data 函数,请勿修改函数名。 -def predict_logreg(inX, weights): - """ - 对率回归预测函数。 +测评环境: +- CPU: Intel Xeon(R) CPU E3-1231 v3 @ 3.40GHz +- OS: Ubuntu 22.04.4 LTS +- Python: 3.10.12 +- numpy: 2.1.1 +""" - Args: - - inX (numpy array): 输入待分类的样本。 - - weights (numpy array): 训练得到的权重。 - Returns: - - int: 预测的分类标签。 - """ - prediction = 1 / (1 + np.exp(-np.dot(inX, weights))) - return 1 if prediction > 0.5 else 0 +""" +请在这里填写学号和姓名,不填写即成绩无效。 +""" +id = "202210423228" +name = "黎世浩" + def load_data(filepath): """ @@ -69,6 +49,66 @@ def load_data(filepath): return X, y.astype(int) +def scale_features(X): + """ + 对特征进行标准化处理。 + + Args: + - X (numpy array): 特征数据。 + + Returns: + - numpy array: 标准化后的特征数据。 + """ + mean = np.mean(X, axis=0) + std = np.std(X, axis=0) + # 避免除以零的错误 + std[std == 0] = 1 + scaled_X = (X - mean) / std + return scaled_X + +def train_logreg(X, y, learning_rate=0.01, iterations=1000): + """ + 对率回归训练函数。 + + Args: + - X (numpy array): 特征数据。 + - y (numpy array): 标签数据。 + - learning_rate (float): 学习率,默认为0.01。 + - iterations (int): 迭代次数,默认为1000。 + + Returns: + - numpy array: 训练得到的权重。 + """ + m, n = X.shape + weights = np.zeros(n) + + for _ in range(iterations): + for i in range(m): + x_i = X[i] + y_i = y[i] + # 计算预测值 + prediction = 1 / (1 + np.exp(-np.dot(x_i, weights))) + # 计算梯度 + gradient = x_i * (prediction - y_i) + # 更新权重 + weights -= learning_rate * gradient + + return weights + +def predict_logreg(inX, weights): + """ + 对率回归预测函数。 + + Args: + - inX (numpy array): 输入待分类的样本。 + - weights (numpy array): 训练得到的权重。 + + Returns: + - int: 预测的分类标签。 + """ + prediction = 1 / (1 + np.exp(-np.dot(inX, weights))) + return 1 if prediction > 0.5 else 0 + if __name__ == "__main__": # 以下代码可用于测试,可自行随意修改 # 加载训练集 @@ -78,13 +118,12 @@ if __name__ == "__main__": X_test, y_test = load_data("./data/horse-colic.test") # 特征缩放 - scaler = StandardScaler() - X_train = scaler.fit_transform(X_train) - X_test = scaler.transform(X_test) + X_train_scaled = scale_features(X_train) + X_test_scaled = scale_features(X_test) # 训练对率回归模型 - weights = train_logreg(X_train, y_train, learning_rate=0.01, iterations=1000) + weights = train_logreg(X_train_scaled, y_train, learning_rate=0.01, iterations=1000) # 测试单个数据 - y_pred = predict_logreg(X_test[11], weights) + y_pred = predict_logreg(X_test_scaled[11], weights) print(f"预测结果: {y_pred}, 实际结果: {y_test[11]}") \ No newline at end of file