From 1b93a2e2f0b1af81a1152142249514ad30cf4790 Mon Sep 17 00:00:00 2001 From: hao <19382120447@163.com> Date: Tue, 15 Oct 2024 19:59:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20function.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- function.py | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/function.py b/function.py index 5126797..286bb9a 100644 --- a/function.py +++ b/function.py @@ -42,6 +42,8 @@ name = "黎世浩" # 这里写自己的代码实现 +import numpy as np + def classify0(inX, dataSet, labels, k=3): """ KNN 分类算法,使用马氏距离。 @@ -55,27 +57,25 @@ def classify0(inX, dataSet, labels, k=3): Returns: - int: 预测的分类标签。 """ - # 计算协方差矩阵的逆和均值 - inv_cov = np.linalg.inv(np.cov(dataSet.T)) # 计算协方差矩阵的逆 - meanVals = np.mean(dataSet, axis=0) # 计算均值 - - # 计算输入样本与训练集中每个样本的马氏距离 - diffMat = dataSet - meanVals - 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]) - - # 确保 k 不大于训练集中的样本数量 - k = min(k, len(mahalDist)) - - # 对距离进行排序,选择距离最小的 k 个样本 - sortedDistIndices = np.argsort(mahalDist) + # 计算训练数据集的协方差矩阵和均值 + covMat = np.cov(dataSet, rowvar=False) + meanVec = np.mean(dataSet, axis=0) + + # 计算待分类样本与训练集中每个样本的马氏距离 + invCovMat = np.linalg.inv(covMat) + diffVecs = dataSet - meanVec + dist = np.sqrt(np.sum(inX - meanVec, axis=1).dot(invCovMat).dot((inX - meanVec).T)) + + # 获取距离最近的 k 个样本的索引 + kNearestIndices = np.argsort(dist)[:k] + + # 统计这些邻居的标签 classCount = {} - - # 遍历距离最小的 k 个样本,统计每个类别的出现次数 - for i in range(k): - voteIlabel = labels[sortedDistIndices[i]] - classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 - - # 选择出现次数最多的类别作为预测标签 + for i in kNearestIndices: + voteLabel = labels[i] + classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 + + # 返回出现次数最多的标签 sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True) return sortedClassCount[0][0]