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