From d5a373a8f9d06c1a90f96fdb1a48bebbefabf5eb Mon Sep 17 00:00:00 2001 From: Dengddd <3149942468@qq.com> Date: Wed, 30 Oct 2024 10:52:26 +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 | 70 ++++++++++++++++++----------------------------------- 1 file changed, 24 insertions(+), 46 deletions(-) diff --git a/function.py b/function.py index 6ebd621..228d143 100644 --- a/function.py +++ b/function.py @@ -26,47 +26,6 @@ name = "邓龙树" import numpy as np -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: - - numpy array: 训练得到的权重。 - """ - m, n = X.shape - weights = np.zeros(n) # 初始化权重 - for _ in range(iterations): - z = np.dot(X, weights) - predictions = sigmoid(z) - error = predictions - y - gradient = np.dot(X.T, error) / m - weights -= learning_rate * gradient # 更新权重 - return weights - -def predict_logreg(inX, weights): - """ - 对率回归预测函数。 - - Args: - - inX (numpy array): 输入待分类的样本。 - - weights (numpy array): 训练得到的权重。 - - Returns: - - int: 预测的分类标签。 - """ - probability = sigmoid(np.dot(inX, weights)) - return 1 if probability >= 0.5 else 0 # 二分类阈值为0.5 - def load_data(filepath): """ 从文件中加载数据。 @@ -78,17 +37,36 @@ def load_data(filepath): - np.array: 特征数据。 - np.array: 标签数据。 """ - # 使用dtype=str先将所有数据加载为字符串 - data = np.loadtxt(filepath, delimiter=' ', dtype=str) + # 读取每一行作为字符串 + with open(filepath, 'r') as file: + lines = file.readlines() - # 替换'?'为np.nan,并转换为浮点数 - data[data == '?'] = np.nan - data = data.astype(float) + # 分割每一行并填充缺失的列 + max_cols = 0 + rows = [] + for line in lines: + # 分割每一行 + cols = line.strip().split(' ') + # 记录最大列数 + max_cols = max(max_cols, len(cols)) + rows.append(cols) + + # 将所有行填充到相同的列数 + for row in rows: + while len(row) < max_cols: + row.append('nan') + + # 转换为numpy数组 + data = np.array(rows, dtype=float) + + # 用np.nan替换字符串'nan' + data[data == 'nan'] = np.nan X = data[:, :-1] # 假设最后一列是标签 y = data[:, -1] return X, y + if __name__ == "__main__": # 加载训练集 X_train, y_train = load_data("./data/horse-colic.data")