From 9d6b0fda27c83a41a4cb977989d1710932e06b63 Mon Sep 17 00:00:00 2001 From: yuhaopan <1159526601@qq.com> Date: Tue, 15 Oct 2024 20:45:59 +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 | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/function.py b/function.py index 9dcfdf1..c4c1170 100644 --- a/function.py +++ b/function.py @@ -38,35 +38,37 @@ name = "潘宇豪" """ -def classify0(inX, dataSet, labels, k=3): +def classifyo(inx, dataSet, labels, k=8, _cache={"VI": None}): """ - KNN 分类算法。 + KNN 分类算法,使用缓存优化性能。 参数: - - inX (numpy array): 输入待分类的样本。 + - inx (numpy array): 输入待分类的样本。 - dataSet (numpy array): 训练数据集。 - labels (list or numpy array): 训练集对应的标签。 - k (int): 使用的邻居数量。 + - _cache (dict): 缓存数据,用于存储协方差矩阵的逆。 返回值: - int: 预测的分类标签。 """ - # 计算均值和协方差的逆 - mean = np.mean(dataSet, axis=0) - cov_inv = inv(np.cov(dataSet, rowvar=False)) + # 使用缓存,直接获取协方差矩阵的逆 + if _cache["VI"] is None: + _cache["VI"] = np.linalg.inv(np.cov(dataSet.T)) - # 计算输入样本与每个训练样本之间的马氏距离 - diff = dataSet - inX - distances = np.sqrt(np.einsum('ij,jk->i', diff, np.dot(cov_inv, diff.T))) + # 计算输入样本与数据集的差值 + diff = dataSet - inx - # 找到最近的k个邻居 - sortedDistIndices = np.argsort(distances)[:k] - nearest_labels = labels[sortedDistIndices] + # 使用矩阵运算计算马氏距离 + distances = np.sum(diff @ _cache["VI"] * diff, axis=1) - # 使用np.bincount统计类别出现次数 - classCount = np.bincount(nearest_labels.astype(int)) + # 对距离排序,获取前k个最近的样本索引 + sortedDistIndices = np.argsort(distances) - # 返回出现次数最多的类别 + # 统计前k个样本的标签 + classCount = np.bincount(labels[sortedDistIndices[:k]]) + + # 返回出现次数最多的标签 return np.argmax(classCount)