generated from LufsX/Challenge-SVM
This commit is contained in:
+19
-24
@@ -1,5 +1,7 @@
|
||||
# function.py
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
|
||||
"""
|
||||
挑战说明:
|
||||
@@ -35,15 +37,11 @@ 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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user