diff --git a/function.py b/function.py index 430755f..ade67d3 100644 --- a/function.py +++ b/function.py @@ -38,50 +38,48 @@ name = "Tanjunfeng" 返回值: - int: 预测的分类标签。 """ -def normalize_data(dataSet): - """标准化数据集使每个特征列的均值为0方差为1。""" - mean = np.mean(dataSet, axis=0) - std = np.std(dataSet, axis=0) - normalized_data = (dataSet - mean) / std - return normalized_data # 这里写自己的代码实现 -def classify0(inX, dataSet, labels, k=3): +def classify0(inX, dataSet, labels, k=5): """ KNN 分类算法。 - + Args: - inX (numpy array): 输入待分类的样本。 - dataSet (numpy array): 训练数据集。 - labels (list or numpy array): 训练集对应的标签。 - - k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 - + - k (int): kNN 算法参数。 + Returns: - int: 预测的分类标签。 """ - # 对数据集进行标准化 - normalized_dataSet = normalize_data(dataSet) - normalized_inX = (inX - np.mean(dataSet, axis=0)) / np.std(dataSet, axis=0) - - # 计算欧式距离 - dataSetSize = normalized_dataSet.shape[0] - diffMat = np.tile(normalized_inX, (dataSetSize, 1)) - normalized_dataSet + # **步骤1数据归一化** + minVals = dataSet.min(0) + maxVals = dataSet.max(0) + ranges = maxVals - minVals + + normDataSet = (dataSet - minVals) / ranges + normInX = (inX - minVals) / ranges + + # **步骤2计算欧氏距离** + diffMat = normDataSet - normInX distances = np.sqrt(np.sum(diffMat ** 2, axis=1)) - - # 按距离从小到大排序 + + # **步骤3按距离排序** sortedDistIndices = distances.argsort() - - # **步骤4选择距离最小的k个点进行加权投票** + + # **步骤4选择距离最小的k个点,进行加权投票** classCount = {} for i in range(k): voteIlabel = labels[sortedDistIndices[i]] - # 使用距离的倒数作为权重防止距离为0时除以零 + # 使用距离的倒数作为权重,防止除以零 weight = 1 / (distances[sortedDistIndices[i]] + 1e-8) - classCount[voteIlabel] = classCount.get(voteIlabel, 0) + weight - - # 按类别票数从大到小排序 + classCount[voteIlabel] = classCount.get(voteIlabel, 0) + weight + + # **步骤5按投票结果排序** sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True) - + + # **步骤6返回权重和最高的标签** return sortedClassCount[0][0] @@ -102,5 +100,14 @@ if __name__ == "__main__": train_data, train_labels = load_data(train_file) + # 测试样本 + test_sample = np.array([65915, 3.868359, 0.128078]) + + # 调用 classify0 函数进行预测 + result = classify0(test_sample, train_data, train_labels) + + print("预测的分类标签为:", result) + train_data, train_labels = load_data(train_file) + # 进行测试 print(classify0([65915, 3.868359, 0.128078], train_data, train_labels)) \ No newline at end of file