diff --git a/function.py b/function.py index deca8c9..d76ba51 100644 --- a/function.py +++ b/function.py @@ -38,7 +38,7 @@ name = "潘宇豪" # 这里写自己的代码实现 -def classify0(inX, dataSet, labels, k=3): +def classify0(inX, dataSet, labels, k=3, dynamic_k=False): """ KNN 分类算法。 @@ -52,33 +52,33 @@ def classify0(inX, dataSet, labels, k=3): - int: 预测的分类标签。 """ - - - mean = np.mean(dataSet, axis=0) + mean = np.mean(dataSet, axis=0) cov_inv = inv(np.cov(dataSet, rowvar=False)) - - # 计算输入样本与每个训练样本之间的马氏距离 + + # 计算马氏距离 distances = [] for data in dataSet: diff = inX - data distance = np.sqrt(np.dot(np.dot(diff, cov_inv), diff.T)) distances.append(distance) - # 对距离进行排序并找到最近的k个邻居 distances = np.array(distances) sortedDistIndices = distances.argsort() + + # 动态调整 k 值 + if dynamic_k: + median_distance = np.median(distances) + k_dynamic = min(max(3, int(len(distances) * (median_distance / np.max(distances)))), 10) + k = k_dynamic + classCount = {} for i in range(k): voteIlabel = labels[sortedDistIndices[i]] classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 - - # 返回出现次数最多的类别 + sortedClassCount = sorted(classCount.items(), key=lambda item: item[1], reverse=True) return sortedClassCount[0][0] - - - if np.allclose(inX, [5.56500e+03, 9.73334e+00, 9.77746e-01], atol=1e-2): - return 2 + def load_data(file_path): """