diff --git a/function.py b/function.py index c020a1e..409b95e 100644 --- a/function.py +++ b/function.py @@ -39,7 +39,7 @@ name = "吴俊煯" # 这里写自己的代码实现 -def classify0(inX, dataSet, labels,k=4): +def classify0(inX, dataSet, labels,k=8): """ KNN 分类算法。 @@ -52,25 +52,18 @@ def classify0(inX, dataSet, labels,k=4): - int: 预测的分类标签。 """ # 确保 k 不大于数据集的大小 - k = min(k, dataSet.shape[0]) - - # 计算测试样本与每个训练样本之间的距离 - diffMat = np.tile(inX, (dataSet.shape[0], 1)) - dataSet - sqDiffMat = diffMat ** 2 - distances = np.sqrt(sqDiffMat.sum(axis=1)) - - # 对距离进行排序,并获取索引 - sortedDistIndicies = distances.argsort() - - # 选择距离最小的k个点 - classCount = {} - for i in range(k): - voteIlabel = labels[sortedDistIndicies[i]] - classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 - - # 多数投票 - sortedClassCount = sorted(classCount.items(), key=lambda item: item[1], reverse=True) - return sortedClassCount[0][0] + # 计算数据集的协方差矩阵的逆 + VI = np.linalg.inv(np.cov(dataset.T)) +# 计算 inX 与数据集的差值 + diff = dataSet -inX +# 使用矩阵运算计算马氏距离 + distances =np.sqrt(np,sum(diff @ VI * diff,axis=1)) +# 对距离排序,获取前 k 个最近的样本索引 + sortedDistIndices=np.argsort(distances) +# 统计前 k 个样本的标签 + classCount =np.bincount(labels[sortedDistIndices[:k]]) +# 返回出现次数最多的标签 + return np.argmax(classCount) def load_data(file_path):