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

This commit is contained in:
hao
2024-10-15 19:59:45 +08:00
parent 793f688005
commit 1b93a2e2f0
+20 -20
View File
@@ -42,6 +42,8 @@ name = "黎世浩"
# 这里写自己的代码实现 # 这里写自己的代码实现
import numpy as np
def classify0(inX, dataSet, labels, k=3): def classify0(inX, dataSet, labels, k=3):
""" """
KNN 分类算法,使用马氏距离。 KNN 分类算法,使用马氏距离。
@@ -55,27 +57,25 @@ def classify0(inX, dataSet, labels, k=3):
Returns: Returns:
- int: 预测的分类标签。 - int: 预测的分类标签。
""" """
# 计算协方差矩阵的逆和均值 # 计算训练数据集的协方差矩阵和均值
inv_cov = np.linalg.inv(np.cov(dataSet.T)) # 计算协方差矩阵的逆 covMat = np.cov(dataSet, rowvar=False)
meanVals = np.mean(dataSet, axis=0) # 计算均值 meanVec = np.mean(dataSet, axis=0)
# 计算输入样本与训练集中每个样本的马氏距离 # 计算待分类样本与训练集中每个样本的马氏距离
diffMat = dataSet - meanVals invCovMat = np.linalg.inv(covMat)
mahalDist = np.array([np.sqrt((inX - meanVals).dot(inv_cov).dot((inX - meanVals).T)) * np.sqrt(np.sum((diff - meanVals).dot(inv_cov).dot(diff - meanVals.T)) / (diffMat.shape[0] - 1)) for diff in diffMat]) diffVecs = dataSet - meanVec
dist = np.sqrt(np.sum(inX - meanVec, axis=1).dot(invCovMat).dot((inX - meanVec).T))
# 确保 k 不大于训练集中的样本数量
k = min(k, len(mahalDist)) # 获取距离最近的 k 个样本的索引
kNearestIndices = np.argsort(dist)[:k]
# 对距离进行排序,选择距离最小的 k 个样本
sortedDistIndices = np.argsort(mahalDist) # 统计这些邻居的标签
classCount = {} classCount = {}
for i in kNearestIndices:
# 遍历距离最小的 k 个样本,统计每个类别的出现次数 voteLabel = labels[i]
for i in range(k): classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
voteIlabel = labels[sortedDistIndices[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # 返回出现次数最多的标签
# 选择出现次数最多的类别作为预测标签
sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True) sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True)
return sortedClassCount[0][0] return sortedClassCount[0][0]