From a1131926a3b79b0e194eb315033a927607a17f01 Mon Sep 17 00:00:00 2001 From: 77 <3298722099@qq.com> Date: Thu, 31 Oct 2024 23:05:11 +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 | 100 +++++++++++++--------------------------------------- 1 file changed, 24 insertions(+), 76 deletions(-) diff --git a/function.py b/function.py index 388ef52..360c44c 100644 --- a/function.py +++ b/function.py @@ -25,103 +25,51 @@ name = "陈瑞琪祥" def sigmoid(z): - """ - Sigmoid函数,用于将线性输出转换为概率值。 - """ return 1 / (1 + np.exp(-z)) -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: - - weights (numpy array): 训练得到的权重。 - """ - # 初始化权重 - weights = np.zeros(X.shape[1]) - # 学习率和迭代次数 - lr = learning_rate - n_iterations = iterations - - for i in range(n_iterations): - # 计算模型预测值 +def train_logreg(X, y, learning_rate=0.01, iterations=1000, regularization=0.01): + m, n = X.shape + weights = np.zeros(n) + for i in range(iterations): linear_model = np.dot(X, weights) y_predicted = sigmoid(linear_model) - - # 计算梯度 - gradient = np.dot(X.T, (y_predicted - y)) / len(y) - - # 更新权重 - weights -= lr * gradient - + gradient = np.dot(X.T, (y_predicted - y)) / m + # 添加L2正则化 + gradient += regularization * np.r_[[0], weights[1:]] # 不对偏置项进行正则化 + weights -= learning_rate * gradient return weights def predict_logreg(inX, weights): - """ - 对率回归预测函数。 - - Args: - - inX (numpy array): 输入待分类的样本。 - - weights (numpy array): 训练得到的权重。 - - Returns: - - int: 预测的分类标签。 - """ - # 计算线性组合 linear_output = np.dot(inX, weights) - # 应用sigmoid函数 probability = sigmoid(linear_output) - # 预测类别 return 1 if probability > 0.5 else 0 def load_data(filepath): - """ - 从文件中加载数据。 - - Args: - - filepath (str): 数据文件路径。 - - Returns: - - X (np.array): 特征数据。 - - y (np.array): 标签数据。 - """ - # 尝试使用numpy的genfromtxt函数读取数据,自动检测分隔符 - try: - data = np.genfromtxt(filepath, delimiter=None, invalid_raise=False, filling_values=np.nan) - except ValueError as e: - print(f"Error reading file: {e}") - return None, None - - # 如果数据文件中只有一列,可能是分隔符没有正确识别 - if data.ndim == 1: - print("Data file may have an incorrect delimiter or only contains one column.") - return None, None - - # 丢弃完全为NaN的行 + data = np.genfromtxt(filepath, delimiter=',', invalid_raise=False, filling_values=np.nan) data = data[~np.isnan(data).any(axis=1)] - - # 分离特征和标签 X = data[:, :-1] y = data[:, -1] - return X, y -if __name__ == "__main__": - # 加载训练集 - X_train, y_train = load_data("./data/horse-colic.data") - # 加载测试集 +def feature_scaling(X): + # 特征归一化 + X_min = X.min(axis=0) + X_max = X.max(axis=0) + X_scaled = (X - X_min) / (X_max - X_min) + return X_scaled + +if __name__ == "__main__": + X_train, y_train = load_data("./data/horse-colic.data") X_test, y_test = load_data("./data/horse-colic.test") + # 特征归一化 + X_train_scaled = feature_scaling(X_train) + X_test_scaled = feature_scaling(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]}")