From 5fcca3639daefbc432d7fa2a73d5eb4b3e9c7486 Mon Sep 17 00:00:00 2001 From: 202210423116 <2477589483@qq.com> Date: Sun, 3 Nov 2024 13:15:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20function.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- function.py | 142 ++++++++++++++++++++-------------------------------- 1 file changed, 54 insertions(+), 88 deletions(-) diff --git a/function.py b/function.py index 0008c6a..14a553a 100644 --- a/function.py +++ b/function.py @@ -26,92 +26,58 @@ name = "廖运瑞" # 这里写自己的代码实现 -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) - bias = 0 # 偏置项,可以合并到权重中处理,但这里单独处理 - - for _ in range(iterations): - output = sigmoid(np.dot(X, weights) + bias) - error = y - output - weights += learning_rate * np.dot(X.T, error) / m - bias += learning_rate * np.sum(error) / m - - # 如果需要返回偏置项,可以将其添加到权重数组的前面或作为单独的返回值 - # 这里为了与predict_logreg函数接口一致,我们选择不直接修改weights数组 - return weights, bias - -def predict_logreg(inX, weights, bias=0): - """ - 对率回归预测函数。 - - Args: - - inX (numpy array): 输入待分类的样本。 - - weights (numpy array): 训练得到的权重。 - - bias (float): 训练得到的偏置项,默认为0。 - - Returns: - - int: 预测的分类标签(0或1)。 - """ - z = np.dot(inX, weights) + bias - return 1 if sigmoid(z) >= 0.5 else 0 - -def sigmoid(z): - """ - Sigmoid激活函数。 - - Args: - - z (float or numpy array): 输入值。 - - Returns: - - float or numpy array: Sigmoid输出值。 - """ - return 1 / (1 + np.exp(-z)) - -def load_data(filepath): - """ - 从文件中加载数据。 - - Args: - - filepath (str): 数据文件路径。 - - Returns: - - np.array: 特征数据。 - - np.array: 标签数据。 - """ - data = np.loadtxt(filepath, delimiter=' ') - X = data[:, 1:] # 特征数据,假设从第二列开始 - y = data[:, 0] # 标签数据,假设在第一列 - return X, y.astype(int) # 确保标签为整数类型 - -if __name__ == "__main__": - # 加载训练集 - X_train, y_train = load_data("./data/horse-colic.data") - - # 为了处理偏置项,我们在X_train中添加一列全为1的列(或者使用上面的bias参数) - # 但为了与train_logreg函数接口一致,这里我们选择使用bias参数 - # 如果选择将偏置项合并到权重中,则应该这样处理: - # X_train_with_bias = np.c_[np.ones((X_train.shape[0], 1)), X_train] - # 并相应地修改train_logreg函数和predict_logreg函数的接口 - - # 加载测试集 - X_test, y_test = load_data("./data/horse-colic.test") - - # 训练对率回归模型 - weights, bias = train_logreg(X_train, y_train, learning_rate=0.01, iterations=1000) - - # 测试单个数据 - y_pred = predict_logreg(X_test[11], weights, bias) +def train_logreg(X, y, other_params="你自己设置一些其它参数"): + """ + 对率回归训练函数。 + + Args: + - X (numpy array): 特征数据。 + - y (numpy array): 标签数据。 + - other_params (str): 其它参数,可选设置。若需设置其它参数,必须设置其默认值,否则将**无法通过**自动评测,**成绩为零**。 + + Returns: + - numpy array: 训练得到的权重。 + """ + + +def predict_logreg(inX, weights): + """ + 对率回归预测函数。 + + Args: + - inX (numpy array): 输入待分类的样本。 + - weights (numpy array): 训练得到的权重。 + + Returns: + - int: 预测的分类标签。 + """ + + +# 这里也写自己的代码实现 +def load_data(filepath): + """ + 从文件中加载数据,若不自行正确实现,则无法通过评测,**不记录成绩**。 + + Args: + - directory (str): 数据文件路径。 + + Returns: + - np.array: 特征数据。 + - np.array: 标签数据。 + """ + + +if __name__ == "__main__": + # 以下代码可用于测试,可自行随意修改 + # 加载训练集 + X_train, y_train = load_data("./data/horse-colic.data") + + # 加载测试集 + X_test, y_test = load_data("./data/horse-colic.test") + + # 训练对率回归模型 + weights = train_logreg(X_train, y_train, learning_rate=0.01, iterations=1000) + + # 测试单个数据 + y_pred = predict_logreg(X_test[11], weights) print(f"预测结果: {y_pred}, 实际结果: {y_test[11]}") \ No newline at end of file