K-Nearest Neighbors

简介: 【10月更文挑战第02天】

KNN(K-Nearest Neighbors,K最近邻)算法可以使用任何编程语言或库来实现,包括使用 Python 中的 skimage(Scikit-Image)和 PyTorch。选择使用哪个库通常取决于具体任务的需求、数据类型和个人偏好。

使用 skimage 的原因:

  1. 专门用于图像处理skimage 是 Scikit-Learn 项目的一部分,专注于图像处理任务,提供了大量的图像处理工具和算法,适合用于图像特征提取和图像分析。

  2. 简单的算法实现:对于 KNN 这类简单直观的算法,skimage 提供了易于使用的接口,可以快速实现和应用。

  3. 传统图像处理任务:当处理的是传统的图像处理任务,如图像分类、特征匹配等,skimage 提供了丰富的图像特征描述符,可以直接用于 KNN 算法。

  4. 计算效率:对于较小的数据集或实时性要求不是非常高的应用,skimage 可以提供足够的计算效率。

使用 PyTorch 的原因:

  1. 深度学习PyTorch 是一个强大的深度学习库,适合于构建和训练深度神经网络。如果你的 KNN 算法是与深度学习模型结合使用的,那么 PyTorch 可能是更好的选择。

  2. GPU 加速PyTorch 可以利用 GPU 进行加速计算,这对于大规模数据集或需要快速预测的应用非常有帮助。

  3. 灵活性PyTorch 提供了更多的灵活性,可以自定义 KNN 算法的各个方面,包括距离度量、权重函数等。

  4. 端到端学习:如果你希望将特征提取和 KNN 分类器端到端地进行训练和优化,PyTorch 提供了这样的能力。

示例代码

使用 skimage 实现 KNN 图像分类:

from skimage import io
from sklearn.neighbors import KNeighborsClassifier
from skimage.feature import histogram_oforiented_gradients
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# 加载数据
image = io.imread('path_to_image.jpg')
image_gray = rgb2gray(image)

# 提取 HOG 特征
hog = histogram_oforiented_gradients(image_gray, pixels_per_cell=(16, 16),
                                    cells_per_block=(1, 1), orientations=9,
                                    visualize=True)
hog_image = hog[0, :, :, 0]

# 训练 KNN 分类器
X_train, X_test, y_train, y_test = train_test_split(hog_image.reshape(1, -1), labels, test_size=0.3)
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
predictions = knn.predict(X_test)

# 评估结果
print(classification_report(y_test, predictions))

使用 PyTorch 实现 KNN:

import torch
import torch.nn.functional as F

class KNN(torch.nn.Module):
    def __init__(self, X_train, y_train):
        super(KNN, self).__init__()
        self.X_train = X_train
        self.y_train = y_train

    def forward(self, x):
        # 计算距离
        dists = torch.cdist(x, self.X_train)
        # 获取最小的 K 个距离的索引
        _, idx = dists.topk(3, largest=False)
        # 获取对应的标签
        nearest_y = self.y_train[idx]
        # 返回最常见的标签
        mode = torch.mode(nearest_y)[0]
        return mode

# 加载数据
X_train_tensor = torch.tensor(hog_image.reshape(1, -1), dtype=torch.float32)
y_train_tensor = torch.tensor(labels, dtype=torch.long)

# 实例化模型
knn_model = KNN(X_train_tensor, y_train_tensor)

# 进行预测
X_test_tensor = torch.tensor(test_data, dtype=torch.float32)  # test_data 需要定义
predictions = knn_model(X_test_tensor)

# 输出预测结果
print(predictions)
目录
相关文章
|
5月前
|
存储 算法 搜索推荐
K-Nearest Neighbors
【6月更文挑战第6天】
35 1
|
监控
DFNet: Enhance Absolute Pose Regression withDirect Feature Matching
DFNet: Enhance Absolute Pose Regression withDirect Feature Matching
142 0
|
运维 安全 数据挖掘
Outlier and Outlier Analysis|学习笔记
快速学习 Outlier and Outlier Analysis
Outlier and Outlier Analysis|学习笔记
|
人工智能
Nearest Opposite Parity最短路径+超级源点
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output You are given an array a consisting of n integers. In one move, you can jump from the position i to the position i−ai (if 1≤i−ai) or to the position i+ai (if i+ai≤n).
146 0
Nearest Opposite Parity最短路径+超级源点
|
算法
Halcon拟合系列(2)直线/圆/椭圆/矩形拟合算子fit_line_contour_xld/fit_circle_contour_xld/...
Halcon拟合系列(2)直线/圆/椭圆/矩形拟合算子fit_line_contour_xld/fit_circle_contour_xld/...
2213 0
Open CASCADE之拟合Smooth curve
Open CASCADE之拟合Smooth curve
809 0
Open CASCADE之拟合Smooth curve
|
计算机视觉
Paper之CV:《One Millisecond Face Alignment with an Ensemble of Regression Trees》的翻译与解读
Paper之CV:《One Millisecond Face Alignment with an Ensemble of Regression Trees》的翻译与解读
Paper之CV:《One Millisecond Face Alignment with an Ensemble of Regression Trees》的翻译与解读
成功解决coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to inc
成功解决coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to inc
|
机器学习/深度学习 算法
Matrix Factorization
Matrix Factorization ①linearNetwork Hypothesis 机器学习的作用就是要从一堆数据中学习到学习到某种能力,然后用这种skill来预测未来的结果。
1048 0