

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# K 最近邻 (k-NN) 算法
<a name="k-nearest-neighbors"></a>

Amazon SageMaker AI k 最近邻 (k-nn) 算法是一种基于索引的算法。它使用非参数化方法来进行分类或回归。对于分类问题，算法查询最接近采样点的 *k* 个点，并返回其分类最常用的标签作为预测标签。对于回归问题，算法查询最接近采样点的 *k* 个点，并返回其特征值的平均值作为预测值。

使用 k-NN 算法的训练过程有三个步骤：采样、维度缩减和索引构建。采样过程可减少初始数据集的大小，这样可放到内存中。对于维度缩减，算法将减少数据的特征维度，以便减少 k-NN 模型占用的内存和降低推理延迟。我们提供了两种维度缩减方法：随机投影和快速 Johnson-Lindenstrauss 变换。通常情况下，您可以对高维 (d > 1000) 数据集使用维度缩减，以避免“诅咒维度”，后者会损害随着维度增加而变得稀疏的数据的统计分析。k-NN 训练的主要目标是构建索引。该索引能够有效地查找尚未确定其值或分类标签的点与用于推理的 k 个最近点之间的距离。

**Topics**
+ [k-NN 算法的输入/输出接口](#kNN-input_output)
+ [k-NN 示例笔记本](#kNN-sample-notebooks)
+ [k-NN 算法的工作原理](kNN_how-it-works.md)
+ [k-NN 算法的 EC2 实例建议](#kNN-instances)
+ [k-NN 超参数](kNN_hyperparameters.md)
+ [优化 k-NN 模型](kNN-tuning.md)
+ [k-NN 训练输入的数据格式](kNN-in-formats.md)
+ [k-NN 请求和响应格式](kNN-inference-formats.md)

## k-NN 算法的输入/输出接口
<a name="kNN-input_output"></a>

SageMaker AI k-nn 支持训练和测试数据通道。
+ 对要采样并构建到 k-NN 索引中的数据使用*训练通道*。
+ 使用*测试通道*可以向日志文件发送分数。分数按照每个小批量一行的方式列出：分数的 `classifier` 代表准确率，`regressor` 代表均方误差。

对于训练输入，k-NN 支持 `text/csv` 和 `application/x-recordio-protobuf` 数据格式。对于输入类型 `text/csv`，第一个 `label_size` 列解释为相应行的标签向量。您可以使用文件模式或管道模式，针对格式为 `recordIO-wrapped-protobuf` 或 `CSV` 的数据训练模型。

对于推理输入，k-NN 支持 `application/json`、`application/x-recordio-protobuf` 和 `text/csv` 数据格式。`text/csv` 格式接受 `label_size` 和编码参数。它采用值为 0 的 `label_size` 和 UTF-8 编码。

对于推理输出，k-NN 支持 `application/json` 和 `application/x-recordio-protobuf` 数据格式。这两种数据格式还支持详细输出模式。在详细输出模式中，API 为搜索结果提供从最小到最大排序的距离向量，以及标签向量中的对应元素。

对于批量变换，k-NN 支持对输入和输出使用 `application/jsonlines` 数据格式。示例输入如下所示：

```
content-type: application/jsonlines

{"features": [1.5, 16.0, 14.0, 23.0]}
{"data": {"features": {"values": [1.5, 16.0, 14.0, 23.0]}}
```

示例输出如下所示：

```
accept: application/jsonlines

{"predicted_label": 0.0}
{"predicted_label": 2.0}
```

有关输入和输出文件格式的更多信息，请参阅[k-NN 训练输入的数据格式](kNN-in-formats.md)（对于训练）、[k-NN 请求和响应格式](kNN-inference-formats.md)（对于推理）和[k-NN 示例笔记本](#kNN-sample-notebooks)。

## k-NN 示例笔记本
<a name="kNN-sample-notebooks"></a>

有关使用 SageMaker AI k 最近邻算法根据地质和森林服务数据预测荒野覆盖类型的示例笔记本，请参阅 K-Nearest Ne [igh](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/k_nearest_neighbors_covtype/k_nearest_neighbors_covtype.html) bor Covertype。

使用 Jupyter 笔记本实例在 AI 中运行该示例。 SageMaker 要了解如何在 SageMaker AI 中创建和打开 Jupyter 笔记本实例，请参阅。[Amazon SageMaker 笔记本实例](nbi.md)创建并打开笔记本实例后，选择 “**SageMaker AI 示例**” 选项卡以查看所有 SageMaker AI 示例笔记本的列表。在 **Amazon 算法简介** 部分中查找 K 最近邻笔记本。要打开笔记本，请单击**使用** 选项卡，然后选择**创建副本**。

## k-NN 算法的 EC2 实例建议
<a name="kNN-instances"></a>

我们建议在 CPU 实例（例如 ml.m5.2xlarge）或 GPU 实例上进行训练。k-NN 算法支持使用 P2、P3、G4dn 和 G5 GPU 实例系列进行训练和推理。

来自的推理请求的平均延迟 CPUs 通常比来自的请求低， GPUs 因为使用 GPU 硬件时会对 CPU-to-GPU通信产生负担。但是，对于较大的批次， GPUs 通常具有更高的吞吐量。