当前位置:首页 > C++ > 正文

C++实现分类算法入门(手把手教你用C++编写K近邻分类器)

在机器学习和数据科学领域,C++分类算法是构建智能系统的重要基础。虽然Python因其丰富的库而广受欢迎,但C++凭借其高性能和底层控制能力,在实时系统、嵌入式设备以及对性能要求极高的场景中依然占据重要地位。

本教程将带你从零开始,使用C++实现一个经典的K近邻(K-Nearest Neighbors, KNN)分类算法。即使你是编程小白,只要具备基本的C++语法知识(如变量、循环、函数),也能轻松跟上!

C++实现分类算法入门(手把手教你用C++编写K近邻分类器) C++分类算法 机器学习C++ K近邻算法C++ 编程教程 第1张

什么是K近邻(KNN)算法?

KNN是一种简单但强大的监督学习分类算法。它的核心思想是:

“物以类聚,人以群分。”

给定一个新样本,KNN会计算它与训练集中所有样本的距离,找出距离最近的K个邻居,然后根据这K个邻居中出现最多的类别来预测新样本的类别。

实现步骤概览

  1. 定义数据结构存储样本(特征 + 标签)
  2. 实现距离计算函数(通常用欧氏距离)
  3. 编写KNN分类函数
  4. 测试分类器

完整C++代码实现

下面是一个完整的、可运行的KNN分类器实现。我们将使用二维特征(x, y)进行演示,便于理解。

#include <iostream>#include <vector>#include <cmath>#include <algorithm>#include <unordered_map>// 定义一个样本结构体struct Sample {    double x, y;      // 特征(这里简化为二维)    int label;        // 类别标签(例如:0, 1, 2...)};// 计算两个样本之间的欧氏距离double euclideanDistance(const Sample& a, const Sample& b) {    return std::sqrt(std::pow(a.x - b.x, 2) + std::pow(a.y - b.y, 2));}// KNN分类函数int knnClassify(const std::vector<Sample>& trainData,                const Sample& testSample,                int k) {    // 存储(距离,标签)对    std::vector<std::pair<double, int>> distances;        // 计算测试样本到每个训练样本的距离    for (const auto& sample : trainData) {        double dist = euclideanDistance(testSample, sample);        distances.push_back({dist, sample.label});    }        // 按距离从小到大排序    std::sort(distances.begin(), distances.end());        // 统计前k个邻居中各类别的出现次数    std::unordered_map<int, int> labelCount;    for (int i = 0; i < k && i < distances.size(); ++i) {        labelCount[distances[i].second]++;    }        // 找出出现次数最多的类别    int bestLabel = -1;    int maxCount = 0;    for (const auto& pair : labelCount) {        if (pair.second > maxCount) {            maxCount = pair.second;            bestLabel = pair.first;        }    }        return bestLabel;}// 主函数:演示KNN分类器int main() {    // 构建训练数据集    std::vector<Sample> trainData = {        {1.0, 2.0, 0},        {1.5, 1.8, 0},        {3.0, 4.0, 1},        {3.5, 3.8, 1},        {5.0, 6.0, 2},        {5.5, 5.8, 2}    };        // 测试样本    Sample testSample = {2.0, 3.0, -1}; // -1 表示未知标签        int k = 3; // 选择最近的3个邻居    int predictedLabel = knnClassify(trainData, testSample, k);        std::cout << "测试样本 (" << testSample.x << ", "               << testSample.y << ") 被分类为类别: "               << predictedLabel << std::endl;        return 0;}

代码详解

  • Sample结构体:用于存储每个样本的特征(x, y)和类别标签。
  • euclideanDistance函数:计算两点间的欧氏距离,这是KNN中最常用的距离度量方式。
  • knnClassify函数:核心逻辑。先计算所有距离,排序后取前K个,再通过投票机制确定最终类别。
  • main函数:创建了一个简单的训练集,并对一个新样本进行分类预测。

如何编译和运行?

将上述代码保存为 knn.cpp,然后在终端执行:

g++ -std=c++11 knn.cpp -o knn./knn

你将看到输出:

测试样本 (2, 3) 被分类为类别: 0

扩展与优化建议

这个基础版本适合学习理解。在实际项目中,你可以考虑:

  • 支持更高维度的特征(使用std::vector代替x, y)
  • 添加交叉验证选择最优K值
  • 使用更高效的数据结构(如KD树)加速近邻搜索
  • 处理类别不平衡问题

结语

恭喜你!你已经成功用C++实现了一个完整的K近邻分类算法。这不仅加深了你对机器学习C++的理解,也为后续学习更复杂的模型打下了坚实基础。

记住,实践是最好的老师。尝试修改训练数据、调整K值,观察结果变化,你会对算法有更直观的认识。

希望这篇编程教程对你有所帮助!如果你有任何问题,欢迎在评论区留言交流。