更新 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 import operator
from collections import Counter
def classify0(inX, dataSet, labels, k=1): def classify0(inX, dataSet, labels, k=1):
""" """
KNN 分类算法。 KNN 分类算法。
@@ -55,40 +55,18 @@ def classify0(inX, dataSet, labels, k=1):
Returns: Returns:
- int: 预测的分类标签。 - int: 预测的分类标签。
""" """
inX = np.atleast_2d(inX) dataSetSize=dataSet.shape[0]
diffMat=inX - dataSet
# 计算训练数据集的均值向量 sqDiffMat=diffMat**2
meanVec = np.mean(dataSet, axis=0) sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
# 计算训练数据集的协方差矩阵
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个点的索引
sortedDistIndicies=distances.argsort() sortedDistIndicies=distances.argsort()
classCount={}
# 使用Counter来统计每个类别的计数,这样可以直接得到最频繁的类别 for i in range(k):
classCount = Counter(labels[sortedDistIndicies[:k]]) votellabel=labels[sortedDistIndicies[i]]
classCount[votellabel]=classCount.get(votellabel,0)+1
# 返回出现次数最多的类别的标签 sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return classCount.most_common(1)[0][0] return sortedClassCount[0][0]