From 130bec1f67d06915c804b9e5a7d87641e617ed3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=9D=A8=E6=B4=8B?= <2445091977@qq.com> Date: Sat, 2 Nov 2024 21:28:08 +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 | 111 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 90 insertions(+), 21 deletions(-) diff --git a/function.py b/function.py index f8da889..f189af5 100644 --- a/function.py +++ b/function.py @@ -12,31 +12,100 @@ def sigmoid(z): Sigmoid 激活函数。 """ return 1 / (1 + np.exp(-z)) -def train_logreg(X, y, random_state=42): - model = LogisticRegression(solver='liblinear', random_state=random_state) - model.fit(X, y) - return model -def predict_logreg(inX, model): - return int(model.predict([inX])[0]) +def train_logreg(X, y, numIter=1000, learning_rate=0.01, lambda_reg=0.01): + m, n = X.shape + weights = np.zeros(n) + for j in range(numIter): + for i in range(m): + z = np.dot(X[i], weights) + h = sigmoid(z) + error = y[i] - h + gradient = X[i] * error + reg_term = lambda_reg * weights + gradient += reg_term + weights += learning_rate * gradient + return weights + + +def predict_logreg(inX, weights): + """ + 对率回归预测函数。 + + Args: + - inX (numpy array): 输入待分类的样本。 + - weights (numpy array): 训练得到的权重。 + + Returns: + - int: 预测的分类标签。 + """ + z = np.dot(inX, weights) + prob = sigmoid(z) + return 1 if prob >= 0.5 else 0 def load_data(filepath): - data = np.genfromtxt(filepath, delimiter=' ', missing_values='?', filling_values=0) - labels = data[:, -1].astype(int) - data = data[:, :-1] - labels = np.where((labels == 2) | (labels == 3), 0, labels) - if data.shape[1] >= 3: - data = np.delete(data, 2, axis=1) - scaler = StandardScaler() - data = scaler.fit_transform(data) - return data, labels + """ + 从文件中加载数据,若不自行正确实现,则无法通过评测,不记录成绩。 - # 去掉不相关特征 - data = np.delete(data, [2] + list(range(23, 28)), axis=1) + Args: + - filepath (str): 数据文件路径。 - # 数据标准化 - scaler = StandardScaler() - data = scaler.fit_transform(data) - return data, labels \ No newline at end of file + Returns: + - X (np.array): 特征数据。 + - y (np.array): 标签数据。 + """ + file = open(filepath) + fr = file.readlines() + data_list = [] + y = [] + for data in fr: + data = data.strip() + data = data.split(' ') + data_25 = data[24] + y.append(data[22]) + del data[-1] + del data[26] + del data[25] + del data[24] + del data[22] + del data[2] + for i in data_25: + data.append(i) + data = [0 if data_elem == '?' else float(data_elem) for data_elem in data] + data_list.append(data) + data_number = len(y) + y_train = np.array([1 if y[j] == '2' or y[j] == '3' else 0 for j in range(data_number)]) + X = np.array(data_list) + X_train = np.insert(X, 0, 1, axis=1) # 添加偏置项 + return X_train, y_train + + +def standardize(X): + mean = X.mean(axis=0) + std = X.std(axis=0) + return (X - mean) / std, mean, std + + +def main(): + # 加载训练集 + X_train, y_train = load_data("./data/horse-colic.data") + # 加载测试集 + X_test, y_test = load_data("./data/horse-colic.test") + + # 标准化特征数据 + X_train, mean, std = standardize(X_train) + X_test = (X_test - mean) / std + + # 训练对率回归模型 + weights = train_logreg(X_train, y_train, numIter=1000, learning_rate=0.01, lambda_reg=0.1) + + # 测试单个数据 + y_pred_test = [predict_logreg(x, weights) for x in X_test] + accuracy_test = np.mean(y_pred_test == y_test) + print(f"Test Accuracy: {accuracy_test:.2f}") + + +if __name__ == "__main__": + main() \ No newline at end of file