在机器学习和数据科学领域,C++分类算法是构建智能系统的重要基础。虽然Python因其丰富的库而广受欢迎,但C++凭借其高性能和底层控制能力,在实时系统、嵌入式设备以及对性能要求极高的场景中依然占据重要地位。
本教程将带你从零开始,使用C++实现一个经典的K近邻(K-Nearest Neighbors, KNN)分类算法。即使你是编程小白,只要具备基本的C++语法知识(如变量、循环、函数),也能轻松跟上!
KNN是一种简单但强大的监督学习分类算法。它的核心思想是:
“物以类聚,人以群分。”
给定一个新样本,KNN会计算它与训练集中所有样本的距离,找出距离最近的K个邻居,然后根据这K个邻居中出现最多的类别来预测新样本的类别。
下面是一个完整的、可运行的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;} 将上述代码保存为 knn.cpp,然后在终端执行:
g++ -std=c++11 knn.cpp -o knn./knn
你将看到输出:
测试样本 (2, 3) 被分类为类别: 0
这个基础版本适合学习理解。在实际项目中,你可以考虑:
恭喜你!你已经成功用C++实现了一个完整的K近邻分类算法。这不仅加深了你对机器学习C++的理解,也为后续学习更复杂的模型打下了坚实基础。
记住,实践是最好的老师。尝试修改训练数据、调整K值,观察结果变化,你会对算法有更直观的认识。
希望这篇编程教程对你有所帮助!如果你有任何问题,欢迎在评论区留言交流。
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025128899.html