更新 function.py
Gitea Actions Test / Challenge-Actions (push) Successful in 21s

This commit is contained in:
2024-11-15 14:45:49 +08:00
parent e2b85ca08b
commit 3745da67b0
+19 -24
View File
@@ -1,5 +1,7 @@
# function.py # function.py
import numpy as np import numpy as np
import pandas as pd
""" """
挑战说明: 挑战说明:
@@ -35,15 +37,11 @@ def train_svm(X, y, learning_rate=0.01, iterations=1000 ):
Args: Args:
- X (numpy array): 特征数据。 - X (numpy array): 特征数据。
- y (numpy array): 标签数据。 - y (numpy array): 标签数据。
- other_params (str): 其它参数,可选设置。若需设置其它参数,必须设置其默认值,否则将**无法通过**自动评测,**成绩为零**。
Returns: Returns:
- numpy array: 训练得到的权重。 - numpy array: 训练得到的权重。
""" """
# 这里采用简单的梯度下降法示例来训练线性SVM(实际应用中可使用更高效的SMO等算法优化)
num_samples, num_features = X.shape num_samples, num_features = X.shape
learning_rate = 0.01 # 学习率,可作为参数调整
iterations = 1000 # 迭代次数,可作为参数调整
weights = np.zeros(num_features) weights = np.zeros(num_features)
# 迭代更新权重 # 迭代更新权重
for _ in range(iterations): for _ in range(iterations):
@@ -64,9 +62,8 @@ def predict_svm(inX, weights):
Returns: Returns:
- int: 预测的分类标签。 - int: 预测的分类标签。
""" """
# 计算决策函数值(这里是线性SVM的简单情况)
result = np.dot(inX, weights) result = np.dot(inX, weights)
# 根据结果判断类别(简单的多分类策略示例,可优化) # 根据结果判断类别(更合理的三分类策略调整)
if result >= 0.5: if result >= 0.5:
return 1 return 1
elif result < -0.5: elif result < -0.5:
@@ -84,26 +81,24 @@ def load_data(filepath):
Returns: Returns:
- np.array: 特征数据。 - np.array: 特征数据。
- np.array: 标签数据。 - np.array: 标签数据。
""" """
data = [] # 使用pandas读取数据文件,假设数据是用空格等分隔的简单文本格式,可根据实际调整
labels = [] df = pd.read_csv(filepath, sep=' ', header=None, na_values='?') # 将 '?' 视为缺失值
with open(filepath, 'r') as f: # 填充缺失值,这里简单用0填充,也可以根据特征的分布等采用更合理的填充方式,比如均值填充等
for line in f.readlines(): df.fillna(0, inplace=True)
parts = line.strip().split() # 获取特征数据和标签数据,确保标签符合三分类要求
features = [] data = df.iloc[:, :-1].values
for p in parts[:-1]: labels = df.iloc[:, -1].values
try: # 对标签数据进行合法性检查,确保是三分类要求的1、2、3
features.append(float(p)) valid_labels = []
except ValueError: for l in labels:
features.append(0) # 将无法转换的字符替换为0,也可以用其他合适值 if l in [1, 2, 3]:
label = int(parts[-1]) valid_labels.append(int(l))
data.append(features) else:
labels.append(label) raise ValueError(f"非法标签值 {l},数据标签应是1、2、3三分类情况")
data = np.array(data) labels = np.array(valid_labels)
labels = np.array(labels)
# 选择特征23(从1开始由左向右数)作为目标变量 # 选择特征23(从1开始由左向右数)作为目标变量
data = data[:, 22].reshape(-1, 1) # 修正这里的语法错误,将--1改为-1 data = data[:, 22].reshape(-1, 1)
return data, labels return data, labels