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

This commit is contained in:
wk
2024-10-16 22:13:11 +08:00
parent 8d4664b1c5
commit 6840394115
+67 -22
View File
@@ -1,22 +1,20 @@
import numpy as np
import os
"""
请在这里填写学号和姓名,不填写即成绩无效。
"""
id = "202210423103"
name = "王坤"
def classify0(input_vector, dataSet, labels, k=3):
def classify0(input_vector, dataSet, labels, k=3, weighted=False):
"""
KNN 分类算法。
KNN 分类算法(支持加权KNN和归一化特征处理)。
Args:
- input_vector (numpy array): 输入待分类的样本。
- dataSet (numpy array): 训练数据集。
- labels (list or numpy array): 训练集对应的标签。
- k (int): kNN 算法参数,请**自行设置默认值**。
- k (int): kNN 算法参数。
- weighted (bool): 是否使用加权KNN。
Returns:
- int: 预测的分类标签。
"""
@@ -26,36 +24,83 @@ def classify0(input_vector, dataSet, labels, k=3):
# 按照距离从小到大排序并获取前k个距离最小的索引
sorted_indices = distances.argsort()[:k]
# 统计前k个最近邻的标签
nearest_labels = [labels[i] for i in sorted_indices]
# 返回出现次数最多的标签
predicted_label = max(set(nearest_labels), key=nearest_labels.count)
# 如果加权,使用距离的倒数作为权重
if weighted:
weights = 1 / (distances[sorted_indices] + 1e-5) # 防止除零
weighted_labels = {}
for i, index in enumerate(sorted_indices):
label = labels[index]
weighted_labels[label] = weighted_labels.get(label, 0) + weights[i]
# 返回权重和最大的标签
predicted_label = max(weighted_labels, key=weighted_labels.get)
else:
# 统计前k个最近邻的标签
nearest_labels = [labels[i] for i in sorted_indices]
# 返回出现次数最多的标签
predicted_label = max(set(nearest_labels), key=nearest_labels.count)
return predicted_label
def normalize_data(data):
"""
归一化特征数据,将每个特征值缩放到 [0, 1] 之间。
Args:
- data (numpy array): 原始特征数据。
Returns:
- numpy array: 归一化后的特征数据。
"""
min_vals = data.min(0)
max_vals = data.max(0)
ranges = max_vals - min_vals
norm_data = (data - min_vals) / ranges
return norm_data, ranges, min_vals
def load_data(file_path):
"""
从 TSV 文件中加载数据集。
从 TSV 文件中加载数据集,并进行归一化处理。
Args:
- file_path (str): TSV 文件路径。
Returns:
- np.array: 特征数据。
- np.array: 归一化后的特征数据。
- np.array: 标签数据。
- np.array: 数据范围。
- np.array: 最小值。
"""
data = np.loadtxt(file_path, delimiter='\t')
data_set = data[:, :-1] # 假设最后一列是标签
labels = data[:, -1].astype(int)
return data_set, labels
norm_data_set, ranges, min_vals = normalize_data(data_set)
return norm_data_set, labels, ranges, min_vals
def normalize_test_sample(test_sample, ranges, min_vals):
"""
归一化测试样本,与训练数据保持相同的归一化尺度。
Args:
- test_sample (numpy array): 测试样本。
- ranges (numpy array): 训练数据的范围。
- min_vals (numpy array): 训练数据的最小值。
Returns:
- numpy array: 归一化后的测试样本。
"""
return (test_sample - min_vals) / ranges
if __name__ == "__main__":
# 以下代码可用于测试,可自行随意修改
# 加载数据集
train_file = "datingTrainSet2.tsv"
train_data, train_labels = load_data(train_file)
train_data, train_labels, ranges, min_vals = load_data(train_file)
# 示例测试样本,确保维度与训练数据一致
test_sample = np.array([65915, 3.868359, 0.128078])
prediction = classify0(test_sample, train_data, train_labels)
print(f"预测的分类标签: {prediction}")
# 归一化测试样本
norm_test_sample = normalize_test_sample(test_sample, ranges, min_vals)
# 使用加权KNN算法进行预测
prediction = classify0(norm_test_sample, train_data, train_labels, k=5, weighted=True)
print(f"预测的分类标签: {prediction}")