diff --git a/function.py b/function.py index 0f8a6ab..8c0213b 100644 --- a/function.py +++ b/function.py @@ -54,20 +54,14 @@ def classify(input_vector, dataSet, labels, k=0): Returns: - int: 预测的分类标签。 """ - # 计算输入向量与每个训练样本之间的欧氏距离 - distances = [np.linalg.norm(input_vector - x) for x in dataSet] - - # 获取距离最近的 k 个训练样本的索引 - k_indices = np.argsort(distances)[:k] - - # 获取这 k 个训练样本的标签 - k_nearest_labels = [labels[i] for i in k_indices] - - # 找到出现次数最多的标签 - most_common = Counter(k_nearest_labels).most_common(1) - - # 返回出现次数最多的标签 - return most_common[0][0] + """ + 使用欧式距离的 kNN 分类算法。 + """ + distances = [np.linalg.norm(input_vector - x) for x in dataSet] + k_indices = np.argsort(distances)[:k] + k_nearest_labels = [labels[i] for i in k_indices] + most_common = Counter(k_nearest_labels).most_common(1) + return most_common[0][0] # 这里也写自己的代码实现 @@ -82,40 +76,24 @@ def load_dataset(directory): - np.array: 特征数据。 - np.array: 标签数据。 """ - features = [] - labels = [] - - # 遍历文件夹中的所有文件 - for filename in os.listdir(directory): - # 构建文件的完整路径 - filepath = os.path.join(directory, filename) - - # 检查文件是否为所需类型(例如图像文件) - # 此处应根据实际情况修改文件类型检查逻辑 - if filename.endswith(".png") or filename.endswith(".jpg"): # 示例:处理图像文件 - # 提取文件名中的标签(假设标签信息包含在文件名中) - # 此处应根据实际情况修改标签提取逻辑 - # 示例:假设文件名格式为"label_xxx.png",则提取"label"部分作为标签 - label_parts = filename.split("_") - if len(label_parts) > 1: - label = int(label_parts[0]) # 将标签转换为整数类型 - else: - # 若文件名不符合预期格式,则跳过该文件或进行错误处理 - continue # 此处选择跳过不符合格式的文件 - - # 加载文件内容并提取特征 - # 此处应根据实际情况修改特征提取逻辑 - # 示例:若处理图像文件,则使用PIL库加载图像并提取特征(如像素值、纹理特征等) - image = Image.open(filepath) - # 示例:将图像转换为灰度图并展平为一维数组作为特征 - # 注意:此特征提取方法非常简单,实际应用中可能需要更复杂的特征提取方法 - feature = np.array(image.convert("L")).flatten() - - # 将特征和标签添加到列表中 - features.append(feature) - labels.append(label) - - # 将特征和标签列表转换为NumPy数组并返回 + features = [] + labels = [] + for filename in os.listdir(directory): + filepath = os.path.join(directory, filename) + + # 检查文件是否为图片类型(如 png 或 jpg) + if filename.endswith(".png") or filename.endswith(".jpg"): + # 从文件名提取标签 + label = int(filename.split('_')[0]) + + # 加载图片并转换为灰度图 + image = Image.open(filepath).convert('L') + + # 展平为一维向量并添加到特征列表中 + feature = np.array(image).flatten() + features.append(feature) + labels.append(label) + return np.array(features), np.array(labels) @@ -131,33 +109,8 @@ def img_to_vector(filename): Returns: - np.array: 二值图像向量。 """ - with Image.open(filename) as img: - # 将图像转换为灰度图(如果是彩色图像的话) - # 注意:如果图像已经是灰度图或二值图,这一步可能不是必需的 - # 但为了确保兼容性,我们还是加上这一步 - gray_img = img.convert('L') - - # 将灰度图转换为二值图 - # 这里我们假设一个阈值,将灰度值大于该阈值的像素设为255,小于或等于该阈值的像素设为0 - # 您可以根据实际情况调整这个阈值,或者使用其他二值化方法 - threshold = 128 # 示例阈值 - binary_img = gray_img.point(lambda p: p > threshold and 255) - - # 或者,如果图像已经是二值图(0和255),则可以直接使用 - # binary_img = gray_img # 仅在图像已经是二值图时使用 - - # 将二值图转换为NumPy数组,并展平为一维数组 - img_array = np.array(binary_img) - img_vector = img_array.flatten() - - # 由于二值图像只包含0和255,我们可以选择将255替换为1(可选步骤) - # 这取决于您的应用场景是否需要这种归一化 - img_vector = (img_vector / 255).astype(int) # 将255转换为1,0保持不变 - - # 注意:上面的归一化步骤将255转换为1,但如果您希望保留原始的0和255值, - # 则可以省略这一步,并直接返回img_vector在展平后的状态。 - - return img_vector + image = Image.open(filename).convert('L') + return np.array(image).flatten() if __name__ == "__main__":