generated from LufsX/Experiment-kNN
This commit is contained in:
+24
-26
@@ -41,7 +41,7 @@ name = "唐一鸣"
|
|||||||
|
|
||||||
|
|
||||||
# 这里写自己的代码实现
|
# 这里写自己的代码实现
|
||||||
def classify(input_vector, dataSet, labels, k=3): # 设置默认 k 值为 3
|
def classify(input_vector, dataSet, labels, k=3):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
KNN 分类算法。
|
KNN 分类算法。
|
||||||
@@ -55,17 +55,15 @@ def classify(input_vector, dataSet, labels, k=3): # 设置默认 k 值为 3
|
|||||||
Returns:
|
Returns:
|
||||||
- int: 预测的分类标签。
|
- int: 预测的分类标签。
|
||||||
"""
|
"""
|
||||||
# 计算输入样本与所有训练样本的欧式距离
|
# 计算欧氏距离
|
||||||
distances = np.linalg.norm(dataSet - input_vector, axis=1)
|
distances = np.sqrt(np.sum((dataSet - input_vector) ** 2, axis=1))
|
||||||
|
|
||||||
# 获取距离最近的 k 个样本的索引
|
# 按距离升序排序,并取前 k 个
|
||||||
nearest_indices = distances.argsort()[:k]
|
sorted_indices = np.argsort(distances)
|
||||||
|
top_k_labels = [labels[i] for i in sorted_indices[:k]]
|
||||||
|
|
||||||
# 获取这些样本的标签
|
# 统计前 k 个邻居的类别并选择出现最多的类别作为预测值
|
||||||
nearest_labels = [labels[i] for i in nearest_indices]
|
predicted_label = max(top_k_labels, key=top_k_labels.count)
|
||||||
|
|
||||||
# 统计每个标签出现的频率,返回频率最高的标签
|
|
||||||
predicted_label = np.bincount(nearest_labels).argmax()
|
|
||||||
|
|
||||||
return predicted_label
|
return predicted_label
|
||||||
|
|
||||||
@@ -83,21 +81,21 @@ def load_dataset(directory):
|
|||||||
- np.array: 标签数据。
|
- np.array: 标签数据。
|
||||||
"""
|
"""
|
||||||
labels = []
|
labels = []
|
||||||
data_list = []
|
file_list = os.listdir(directory)
|
||||||
|
num_files = len(file_list)
|
||||||
|
|
||||||
# 遍历文件夹中的文件
|
# 初始化数据矩阵,假设每个图像转化为 28x28=784 的向量
|
||||||
for filename in os.listdir(directory):
|
data_matrix = np.zeros((num_files, 784))
|
||||||
if filename.endswith(".txt"):
|
|
||||||
# 提取文件名的首字符作为标签
|
for i, filename in enumerate(file_list):
|
||||||
label = int(filename[0])
|
# 提取文件名中的数字作为标签
|
||||||
|
label = int(filename.split('_')[0])
|
||||||
labels.append(label)
|
labels.append(label)
|
||||||
|
|
||||||
# 将图像文件转换为向量并添加到数据集中
|
# 将文件转化为 1D 向量
|
||||||
filepath = os.path.join(directory, filename)
|
data_matrix[i, :] = img_to_vector(os.path.join(directory, filename))
|
||||||
vector = img_to_vector(filepath)
|
|
||||||
data_list.append(vector)
|
|
||||||
|
|
||||||
return np.array(data_list), np.array(labels)
|
return data_matrix, np.array(labels)
|
||||||
|
|
||||||
# 这里还写自己的代码实现
|
# 这里还写自己的代码实现
|
||||||
def img_to_vector(filename):
|
def img_to_vector(filename):
|
||||||
@@ -114,13 +112,13 @@ def img_to_vector(filename):
|
|||||||
- np.array: 二值图像向量。
|
- np.array: 二值图像向量。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 初始化一个784长度的向量
|
# 初始化一个 1D 向量
|
||||||
vector = np.zeros((1, 784))
|
vector = np.zeros((1, 784))
|
||||||
|
|
||||||
# 打开文件读取每一行的数据
|
with open(filename, 'r') as file:
|
||||||
with open(filename) as f:
|
for i in range(28):
|
||||||
for i, line in enumerate(f.readlines()):
|
line = file.readline()
|
||||||
for j in range(28): # 假设每行有 28 个字符
|
for j in range(28):
|
||||||
vector[0, 28 * i + j] = int(line[j])
|
vector[0, 28 * i + j] = int(line[j])
|
||||||
|
|
||||||
return vector
|
return vector
|
||||||
|
|||||||
Reference in New Issue
Block a user