From 669a011bb1b3ea14e353bc60ccad7f80ff6ad132 Mon Sep 17 00:00:00 2001 From: DREMN2112 Date: Thu, 7 Nov 2024 17:06:01 +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 | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/function.py b/function.py index 4c21829..b4dc1d9 100644 --- a/function.py +++ b/function.py @@ -27,7 +27,7 @@ def train_logreg(X, y, learning_rate=0.01, iterations=1000): weights = np.zeros(X.shape[1]) # 梯度下降 - for _ in range(iterations): + for i in range(iterations): # 计算预测值 predictions = sigmoid(np.dot(X, weights)) @@ -37,6 +37,11 @@ def train_logreg(X, y, learning_rate=0.01, iterations=1000): # 更新权重 gradient = np.dot(X.T, error) / len(y) weights -= learning_rate * gradient + + # 每 100 次迭代输出一次损失 + if i % 100 == 0: + loss = -np.mean(y * np.log(predictions) + (1 - y) * np.log(1 - predictions)) + print(f"Iteration {i}, Loss: {loss:.4f}") return weights @@ -58,45 +63,37 @@ def predict_logreg(inX, weights): def load_data(filepath): """ - 从文件中加载数据,处理缺失数据,并将 '?' 替换为列的中位数。 + 从文件中加载数据,并处理 '?' 为每列的均值。 """ data = [] labels = [] - + with open(filepath, 'r') as file: for line in file: line = line.strip().split() if not line: continue - - # 将标签提取出来 + # 将特征转换为浮点型,处理 '?' 为 NaN + features = [float(f) if f != '?' else np.nan for f in line[:-1]] label = int(line[-1]) - - # 将特征转换为浮动数组,'?' 替换为 np.nan - features = line[:-1] # 去除标签部分 - features = [float(f) if f != '?' else np.nan for f in features] - - # 将数据和标签分别加入到列表 data.append(features) labels.append(label) - - # 将列表转换为 numpy 数组 + data = np.array(data) labels = np.array(labels) - - # 计算每列的中位数,并用中位数替换 NaN - col_medians = np.nanmedian(data, axis=0) # 计算每列的中位数 + + # 计算每列的均值,并用均值替换 NaN + col_means = np.nanmean(data, axis=0) # 计算每列的均值 for i in range(data.shape[1]): - data[:, i] = np.where(np.isnan(data[:, i]), col_medians[i], data[:, i]) + data[:, i] = np.where(np.isnan(data[:, i]), col_means[i], data[:, i]) - # 对数据进行标准化 (均值为 0,标准差为 1) + # 标准化数据(均值为 0,标准差为 1) means = np.mean(data, axis=0) stds = np.std(data, axis=0) data = (data - means) / stds return data, labels - if __name__ == "__main__": # 加载训练集 X_train, y_train = load_data("./data/horse-colic.data") @@ -104,9 +101,14 @@ if __name__ == "__main__": # 加载测试集 X_test, y_test = load_data("./data/horse-colic.test") - # 训练对率回归模型 - weights = train_logreg(X_train, y_train, learning_rate=0.01, iterations=1000) + # 训练对率回归模型,增加迭代次数为 5000 次 + weights = train_logreg(X_train, y_train, learning_rate=0.01, iterations=5000) # 测试单个数据 y_pred = predict_logreg(X_test[11], weights) print(f"预测结果: {y_pred}, 实际结果: {y_test[11]}") + + # 测试整体准确率 + y_test_pred = np.array([predict_logreg(X_test[i], weights) for i in range(X_test.shape[0])]) + accuracy = np.mean(y_test_pred == y_test) + print(f"测试集准确率: {accuracy:.4f}")