generated from LufsX/Experiment-kNN
This commit is contained in:
+13
-60
@@ -54,19 +54,13 @@ def classify(input_vector, dataSet, labels, k=0):
|
|||||||
Returns:
|
Returns:
|
||||||
- int: 预测的分类标签。
|
- int: 预测的分类标签。
|
||||||
"""
|
"""
|
||||||
# 计算输入向量与每个训练样本之间的欧氏距离
|
"""
|
||||||
|
使用欧式距离的 kNN 分类算法。
|
||||||
|
"""
|
||||||
distances = [np.linalg.norm(input_vector - x) for x in dataSet]
|
distances = [np.linalg.norm(input_vector - x) for x in dataSet]
|
||||||
|
|
||||||
# 获取距离最近的 k 个训练样本的索引
|
|
||||||
k_indices = np.argsort(distances)[:k]
|
k_indices = np.argsort(distances)[:k]
|
||||||
|
|
||||||
# 获取这 k 个训练样本的标签
|
|
||||||
k_nearest_labels = [labels[i] for i in k_indices]
|
k_nearest_labels = [labels[i] for i in k_indices]
|
||||||
|
|
||||||
# 找到出现次数最多的标签
|
|
||||||
most_common = Counter(k_nearest_labels).most_common(1)
|
most_common = Counter(k_nearest_labels).most_common(1)
|
||||||
|
|
||||||
# 返回出现次数最多的标签
|
|
||||||
return most_common[0][0]
|
return most_common[0][0]
|
||||||
|
|
||||||
|
|
||||||
@@ -84,38 +78,22 @@ def load_dataset(directory):
|
|||||||
"""
|
"""
|
||||||
features = []
|
features = []
|
||||||
labels = []
|
labels = []
|
||||||
|
|
||||||
# 遍历文件夹中的所有文件
|
|
||||||
for filename in os.listdir(directory):
|
for filename in os.listdir(directory):
|
||||||
# 构建文件的完整路径
|
|
||||||
filepath = os.path.join(directory, filename)
|
filepath = os.path.join(directory, filename)
|
||||||
|
|
||||||
# 检查文件是否为所需类型(例如图像文件)
|
# 检查文件是否为图片类型(如 png 或 jpg)
|
||||||
# 此处应根据实际情况修改文件类型检查逻辑
|
if filename.endswith(".png") or filename.endswith(".jpg"):
|
||||||
if filename.endswith(".png") or filename.endswith(".jpg"): # 示例:处理图像文件
|
# 从文件名提取标签
|
||||||
# 提取文件名中的标签(假设标签信息包含在文件名中)
|
label = int(filename.split('_')[0])
|
||||||
# 此处应根据实际情况修改标签提取逻辑
|
|
||||||
# 示例:假设文件名格式为"label_xxx.png",则提取"label"部分作为标签
|
|
||||||
label_parts = filename.split("_")
|
|
||||||
if len(label_parts) > 1:
|
|
||||||
label = int(label_parts[0]) # 将标签转换为整数类型
|
|
||||||
else:
|
|
||||||
# 若文件名不符合预期格式,则跳过该文件或进行错误处理
|
|
||||||
continue # 此处选择跳过不符合格式的文件
|
|
||||||
|
|
||||||
# 加载文件内容并提取特征
|
# 加载图片并转换为灰度图
|
||||||
# 此处应根据实际情况修改特征提取逻辑
|
image = Image.open(filepath).convert('L')
|
||||||
# 示例:若处理图像文件,则使用PIL库加载图像并提取特征(如像素值、纹理特征等)
|
|
||||||
image = Image.open(filepath)
|
|
||||||
# 示例:将图像转换为灰度图并展平为一维数组作为特征
|
|
||||||
# 注意:此特征提取方法非常简单,实际应用中可能需要更复杂的特征提取方法
|
|
||||||
feature = np.array(image.convert("L")).flatten()
|
|
||||||
|
|
||||||
# 将特征和标签添加到列表中
|
# 展平为一维向量并添加到特征列表中
|
||||||
|
feature = np.array(image).flatten()
|
||||||
features.append(feature)
|
features.append(feature)
|
||||||
labels.append(label)
|
labels.append(label)
|
||||||
|
|
||||||
# 将特征和标签列表转换为NumPy数组并返回
|
|
||||||
return np.array(features), np.array(labels)
|
return np.array(features), np.array(labels)
|
||||||
|
|
||||||
|
|
||||||
@@ -131,33 +109,8 @@ def img_to_vector(filename):
|
|||||||
Returns:
|
Returns:
|
||||||
- np.array: 二值图像向量。
|
- np.array: 二值图像向量。
|
||||||
"""
|
"""
|
||||||
with Image.open(filename) as img:
|
image = Image.open(filename).convert('L')
|
||||||
# 将图像转换为灰度图(如果是彩色图像的话)
|
return np.array(image).flatten()
|
||||||
# 注意:如果图像已经是灰度图或二值图,这一步可能不是必需的
|
|
||||||
# 但为了确保兼容性,我们还是加上这一步
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user