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天】
42 1
|
机器学习/深度学习 算法 PyTorch
Gradient Descent Algorithm 梯度下降算法
Gradient Descent Algorithm 梯度下降算法
103 0
|
算法 Windows
RANSAC算法理解
RANSAC算法理解
372 0
RANSAC算法理解
|
人工智能
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最短路径+超级源点
成功解决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
|
存储 传感器 计算机视觉
gamma correction是什么
gamma correction是什么 在看传统cv的时候遇到几个比较有意思的之前不了解的东西,比如gamma correction,gamma是几乎所有数字成像系统中都很重要但很少被人理解的概念,它定义了像素的数值与其实际亮度之间的关系。
2176 0
|
机器学习/深度学习 算法
Matrix Factorization
Matrix Factorization ①linearNetwork Hypothesis 机器学习的作用就是要从一堆数据中学习到学习到某种能力,然后用这种skill来预测未来的结果。
1050 0
|
机器学习/深度学习 算法 数据挖掘
KNN(K-Nearest Neighbor)介绍
KNN(K-Nearest Neighbor)介绍 原文地址:https://www.cnblogs.com/nucdy/p/6349172.html Wikipedia上的 KNN词条 中有一个比较经典的图如下: KNN的算法过程是是这样的: 从上图中我们可以看到,图中的数据集是良好的数据,即都打好了label,一类是蓝色的正方形,一类是红色的三角形,那个绿色的圆形是我们待分类的数据。
1361 0
|
机器学习/深度学习 算法
Gradient Boosting Decision Tree学习
Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple Additive Regression Tree(MART),阿里貌似叫treelink。
2477 0
|
XML 编解码 API
Vectors For All (almost)
本文讲的是Vectors For All (almost),经常阅读 Styling Android 的读者会知道我有多么喜欢用 VectorDrawable 和 AnimatedVectorDrawable 。
1289 0