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

This commit is contained in:
zhe
2024-10-16 20:35:01 +08:00
parent da0d2538c7
commit b55bd56737
+7 -13
View File
@@ -1,8 +1,7 @@
# function.py
import numpy as np
from collections import Counter
from scipy.spatial.distance import mahalanobis
from sklearn.covariance import EmpiricalCovariance # 用于计算协方差矩阵
from sklearn.preprocessing import StandardScaler # 用于数据标准化
"""
挑战说明:
- 自行编写实现 KNN 分类算法。
@@ -59,18 +58,13 @@ def classify0(inX, dataSet, labels, k=2):
# 确保输入样本inX是numpy数组
inX = np.array(inX)
# 将训练数据集转换为numpy数组(如果尚未转换)
dataSet = np.array(dataSet)
# 标准化数据(使用训练数据的均值和标准差来转换输入数据和训练数据)
scaler = StandardScaler().fit(dataSet)
dataSet_scaled = scaler.transform(dataSet)
inX_scaled = scaler.transform([inX])
# 计算训练数据集的均值向量和协方差矩阵
mean_vector = np.mean(dataSet, axis=0)
cov_matrix = EmpiricalCovariance().fit(dataSet).covariance_
# 计算输入样本与所有训练样本之间的马氏距离
# 注意:mahalanobis函数要求输入样本和均值向量的形状匹配,因此我们需要reshape inX
# 同时,我们需要为每个训练样本单独计算距离,因此我们需要循环或使用列表推导式
distances = [mahalanobis(inX.reshape(1, -1), x_train.reshape(1, -1), VI=np.linalg.inv(cov_matrix))
for x_train in dataSet]
# 计算输入样本与所有训练样本之间的欧几里得距离
distances = [np.sqrt(np.sum((inX_scaled[0] - x_train) ** 2)) for x_train in dataSet_scaled]
# 根据距离对训练样本进行排序,并获取前k个最近邻的索引
k_indices = np.argsort(distances)[:k]