基于给定的trainingData目录中的数字符号存储文件,构建K最近邻模型(使用汉明距离),编写正确的程序。数字符号文件的命名规则如下:数字符号_序号.txt(如0_6.txt),其中数字符号表示文件中存储的数字,序号表示是该数字符号存储文件的编号,注意不同数字的存储文件个数是不一样的。
时间: 2024-02-28 18:52:29 浏览: 49
基于路网的连续K最近邻查询
好的,以下是基于给定的trainingData目录中的数字符号存储文件,构建K最近邻模型(使用汉明距离)的Python程序。程序中使用了Python的os、re、heapq和Levenshtein模块。
```python
import os
import re
from heapq import nlargest
from Levenshtein import hamming
# 读取训练数据
train_data = []
train_labels = []
for filename in os.listdir('trainingData'):
label, _ = re.findall(r'^(\d+)_\d+\.txt$', filename)[0]
with open(os.path.join('trainingData', filename), 'r') as f:
data = f.read().replace('\n', '')
train_data.append(data)
train_labels.append(label)
# 定义K最近邻模型
def knn_predict(test_data, k):
distances = [hamming(test_data, d) for d in train_data]
nearest_labels = nlargest(k, zip(distances, train_labels))
return max(set(nearest_labels), key=nearest_labels.count)
# 读取测试数据并进行分类预测
correct = []
incorrect = []
for filename in os.listdir('testData'):
label, _ = re.findall(r'^(\d+)_\d+\.txt$', filename)[0]
with open(os.path.join('testData', filename), 'r') as f:
data = f.read().replace('\n', '')
predicted_label = knn_predict(data, k=3)
if predicted_label == label:
correct.append(label)
else:
incorrect.append(label)
# 将分类结果输出到文件中
with open('correct.txt', 'w') as f:
f.write('\n'.join(correct) + '\n')
with open('incorrect.txt', 'w') as f:
f.write('\n'.join(incorrect) + '\n')
```
在这个程序中,我们首先读取trainingData目录中的所有文件,并将每个文件中的数值读取出来,然后保存到train_data列表中。同时,我们还从每个文件名中提取出数字标签,并将它们保存到train_labels列表中。
接下来,我们定义了一个knn_predict函数,用于基于汉明距离计算分类预测。在这个函数中,我们首先计算测试数据与所有训练数据之间的汉明距离,然后使用heapq模块的nlargest函数选出距离最近的K个训练样本。最后,我们使用max函数对K个训练样本的类别进行投票,并返回投票结果作为分类预测结果。
最后,我们读取testData目录中的所有文件,并使用knn_predict函数对它们进行分类预测。对于每个测试样本,如果预测结果与文件名中的数字标签相同,则将其添加到correct列表中,否则将其添加到incorrect列表中。最后,我们将正确分类和错误分类的数字标签分别输出到correct.txt和incorrect.txt文件中。
希望这个程序能够帮助你完成任务。如果你有任何问题,请随时问我。
阅读全文