diff --git a/function.py b/function.py index 9ce8bed..7cd9ea9 100644 --- a/function.py +++ b/function.py @@ -53,33 +53,35 @@ def classify0(inX, dataSet, labels, k=3): Returns: - int: 预测的分类标签。 """ + # 确保输入样本 inX 是二维数组 + inX = np.mat(inX) # 计算样本数量和特征数量 numSamples, numFeatures = dataSet.shape - # 计算马氏距离 - # 首先计算训练集的均值和协方差矩阵 + # 计算训练集的均值和协方差矩阵 meanVals = np.mean(dataSet, axis=0) covMat = np.cov(dataSet, rowvar=False) + # 添加一个小的正则化项以确保协方差矩阵可逆 + covMat += np.eye(numFeatures) * 0.0001 + # 计算待分类样本与训练集中每个样本的马氏距离 inXMinusMean = inX - meanVals - dist = np.sqrt(np.dot(inXMinusMean.T, np.linalg.inv(covMat)).dot(inXMinusMean)) + dist = np.sqrt(np.sum(inXMinusMean * np.linalg.inv(covMat) * inXMinusMean.T)) # 获取距离最近的k个样本的索引 sortedDistIndices = np.argsort(dist) classCount = {} # 遍历距离最近的k个样本 - for i in range(k): + for i in range(min(k, numSamples)): # 确保不会超出索引范围 voteIlabel = labels[sortedDistIndices[i]] - # 统计每个类别的票数 classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # 选择票数最多的类别作为预测标签 sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True) return sortedClassCount[0][0] - def load_data(file_path): """ 加载 TSV 格式数据文件。