generated from LufsX/Challenge-kNN
This commit is contained in:
+7
-13
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user