generated from LufsX/Experiment-kNN
This commit is contained in:
+28
-75
@@ -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__":
|
||||
|
||||
Reference in New Issue
Block a user