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

This commit is contained in:
2024-10-10 17:24:13 +08:00
parent f74a8dd0f7
commit 1fdadecf1b
+12 -34
View File
@@ -41,7 +41,7 @@ name = "董秋"
# 这里写自己的代码实现
import operator
from collections import Counter
def classify0(inX, dataSet, labels, k=1):
"""
KNN 分类算法。
@@ -55,40 +55,18 @@ def classify0(inX, dataSet, labels, k=1):
Returns:
- int: 预测的分类标签。
"""
inX = np.atleast_2d(inX)
# 计算训练数据集的均值向量
meanVec = np.mean(dataSet, axis=0)
# 计算训练数据集的协方差矩阵
covMat = np.cov(dataSet.T)
# 检查协方差矩阵是否可逆(理论上应该是可逆的,除非数据有问题)
if np.linalg.det(covMat) == 0:
raise ValueError("Covariance matrix is singular and cannot be inverted.")
# 计算协方差矩阵的逆矩阵
invCovMat = np.linalg.inv(covMat)
# 计算输入样本与每个训练样本之间的马氏距离
distances = []
for x_train in dataSet:
diff = inX - x_train # 计算差值向量
diff_T = diff.T # 转置差值向量(虽然这里diff是二维的,但转置是为了保持公式的一致性)
mahalanobis_dist = np.sqrt(np.dot(np.dot(diff_T, invCovMat), diff)) # 计算马氏距离
distances.append(mahalanobis_dist[0, 0]) # 将距离添加到列表中(注意取标量值)
# 将距离列表转换为NumPy数组以便排序
distances = np.array(distances)
# 按照距离排序,并获取最近的k个点的索引
dataSetSize=dataSet.shape[0]
diffMat=inX - dataSet
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
sortedDistIndicies=distances.argsort()
# 使用Counter来统计每个类别的计数,这样可以直接得到最频繁的类别
classCount = Counter(labels[sortedDistIndicies[:k]])
# 返回出现次数最多的类别的标签
return classCount.most_common(1)[0][0]
classCount={}
for i in range(k):
votellabel=labels[sortedDistIndicies[i]]
classCount[votellabel]=classCount.get(votellabel,0)+1
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]