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

This commit is contained in:
2024-09-26 17:57:44 +08:00
parent 41228c55f4
commit 744e0bfa7f
+17 -19
View File
@@ -1,6 +1,7 @@
# function.py # function.py
import numpy as np import numpy as np
from numpy.linalg import inv, det from numpy.linalg import inv, det
from scipy.stats import mode
""" """
挑战说明: 挑战说明:
- 自行编写实现 KNN 分类算法。 - 自行编写实现 KNN 分类算法。
@@ -38,7 +39,7 @@ name = "潘宇豪"
# 这里写自己的代码实现 # 这里写自己的代码实现
def classify0(inX, dataSet, labels, k=3): def classify0(inX, dataSet, labels, ,k_values = [3,9]):
""" """
KNN 分类算法。 KNN 分类算法。
@@ -52,32 +53,29 @@ def classify0(inX, dataSet, labels, k=3):
- int: 预测的分类标签。 - int: 预测的分类标签。
""" """
def mahalanobis_distance(inX, data, cov_inv):
diff = inX - data
return np.sqrt(np.dot(np.dot(diff, cov_inv), diff.T))
mean = np.mean(dataSet, axis=0) mean = np.mean(dataSet, axis=0)
cov_inv = inv(np.cov(dataSet, rowvar=False)) cov_inv = inv(np.cov(dataSet, rowvar=False))
# 计算马氏距离 # 计算所有k值的预测
distances = [] predictions = []
for data in dataSet: for k in k_values:
diff = inX - data distances = [mahalanobis_distance(inX, data, cov_inv) for data in dataSet]
distance = np.sqrt(np.dot(np.dot(diff, cov_inv), diff.T)) sortedDistIndices = np.argsort(distances)
distances.append(distance)
distances = np.array(distances)
sortedDistIndices = distances.argsort()
# 距离加权投票
classCount = {} classCount = {}
for i in range(k): for i in range(k):
index = sortedDistIndices[i] voteIlabel = labels[sortedDistIndices[i]]
voteIlabel = labels[index] classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
weight = 1 / (distances[index] + 1e-5) # 使用距离的倒数作为权重,避免除以零
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + weight
# 返回权重最高的类别
sortedClassCount = sorted(classCount.items(), key=lambda item: item[1], reverse=True) sortedClassCount = sorted(classCount.items(), key=lambda item: item[1], reverse=True)
return sortedClassCount[0][0] predictions.append(sortedClassCount[0][0])
# 多数投票机制
final_prediction, _ = mode(predictions)
return final_prediction.mode[0]
def load_data(file_path): def load_data(file_path):
""" """