KNN算法 c++实现

news2024/12/26 22:03:06

来源【机器学习实战之一】:C++实现K-近邻算法KNN_两个图像的特征向量应用knn模型进行匹配-CSDN博客


//计算每个训练数据到待分类元组的距离,取和待分类元组距离最近的k个训练数据,k个数据中哪个类别的训练数据占多数,则待分类元组就属于哪个类别。
#include<iostream>
#include<map>
#include<vector>
#include<stdio.h>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<fstream>
#include <filesystem>

using namespace std;

const int col = 2;
const int row = 12;
typedef double TData;	
typedef char tData;			
//typedef pair<int, double> Pari;
ifstream fin;		//输入文件流,可以用于从文件中读取数据。通过构造函数或 open() 成员函数打开指定的文件,然后使用输入运算符( >> )和其他输入操作从文件中读取数据:
ofstream fout;

class KNN
{
private:
	int k;
	TData TSet[row][col];	//训练数据
	TData Test[col];		//测试数据
	tData labels[row];		//类别
	map<int, double> dis_index;
	map<tData,int> label_count;
	
public:

	KNN(int k);
	double distance(TData* t1, TData* t2);
	void All_distance();
	void get_label();

	struct cmp
	{
		//调用运算符 operator() 的重载使得对象可以像函数一样使用,具有类似函数的行为,因此也称为函数对象。
		bool operator()(const pair<int,double>& a, const pair<int,double>& b) //常量引用类型 const T&
		{
			return a.second < b.second;
		}
	};
};

KNN::KNN(int k)
{
	this->k = k;
	fin.open("data.txt");
	if (!fin)
	{
		cout << "can not open the data.txt" << endl;
		exit(1);
	}
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			fin >> TSet[i][j];
		}
		fin >> labels[i];
	}
	cout << "请输入test data:" << endl;
	for(int i=0;i<col;i++)
	{
		cin >> Test[i];
	}
}

//数据集和测试数据对应坐标的距离和
double KNN::distance(TData *t1, TData *t2)
{
	double sum = 0;
	for (int i = 0; i < col; i++)
	{
		sum += pow((t1[i] - t2[i]), 2);
	}
	return sqrt(sum);
}

void KNN::All_distance()
{
	double dis;
	for (int i = 0; i < row; i++)
	{
		dis = distance(TSet[i], Test);
		dis_index[i] = dis;			//每一个训练数据到测试数据的dis
	}

	map<int, double>::const_iterator i = dis_index.begin();
	for (i; i != dis_index.end(); i++)
	{
		cout << "index=" << i->first << " distance=" << i->second << endl;  //获取键和值
	}
}

//得到测试数据的类别
void KNN::get_label()
{
	vector<pair<int,double>> vec_dis_index(dis_index.begin(), dis_index.end());			//包含了从 map 容器中复制出来的所有键值对
	//sort(vec_dis_index.begin(), vec_dis_index.end(), cmp());			//通常用来对数组或向量等容器类型进行排序sort(first, last [, comp]);
	sort(vec_dis_index.begin(), vec_dis_index.end(), [&](const pair<int, double>& a, const pair<int, double>& b) {return a.second < b.second; });
	for (int i = 0; i < k; i++)
	{
		cout << "index=" << vec_dis_index[i].first << " distance=" << vec_dis_index[i].second << "  类别=" << labels[vec_dis_index[i].first] << "  坐标=(" << TSet[vec_dis_index[i].first][0] << "," << TSet[vec_dis_index[i].first][1] << ")" << endl;
		label_count[labels[vec_dis_index[i].first]]++;
	}
	int max = 0;
	tData t;
	for (map<char, int>::const_iterator i = label_count.begin(); i != label_count.end(); i++)
	{
		if (i->second > max)
		{
			max = i->second;
			t=i->first;
		}
	}
	cout << "测试数据属于的类别" << t << endl;
}

int main()
{

	int k;
	cout << "请输入k的值" << endl;
	cin >> k;
	KNN knn(k);
	knn.All_distance();
	knn.get_label();
}

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ewebeditor编辑器漏洞

原理 网页在线编辑器&#xff0c;权限限制不严格&#xff0c;弱口令&#xff0c;文件过滤出现问题 特征 在网址上面加ewebeditor 防御 1、及时更新网站的软件和插件&#xff0c;漏洞及时修补 2、加强网站的访问控制&#xff0c;限制未经授权的访问和操作 3、加强对网站数据…

NFTScan 支持非 EVM 公链的 NFT Collection 的认证功能

截止到 2023 年 10 月份&#xff0c;NFTScan 已经支持了 18 条区块链网络&#xff0c;其中有 14 条 是 EVM 兼容的区块链网络&#xff1a; Ethereum、BNBChain、Polygon、zkSync、Base、Linea、Arbitrum、Optimism、Avalanche、Fantom、PlatON、Cronos、Gnosis、Moonbeam。 另…

快速实现MQTT协议网关网口连接西门子PLC

MQTT协议网关网口连接西门子SMART200PLC操作说明v1.3 目录 一. 使用流程 二. 准备工作 2.1 需要准备如下物品 2.2 LF220网关准备工 2.3 PLC准备工作 2.4 电脑的准备工作 2.5 MQTT服务器 三. MQTT网关登陆平台配置步骤 3.1 登录 3.2 网关概况 3.3 MQTT连…

JVM(Java Virtual Machine)内存模型篇

前言 本文是JVM系列的内存模型篇&#xff0c;参考资料为《深入理解Java虚拟机》&#xff0c;本文章将会以HotSpot 虚拟机为介绍基础。 1.JVM简单介绍 Java Virtual Machine是运行Java程序的基础&#xff0c;JVM基于C、C实现&#xff0c;JVM有很多种类&#xff0c;但是这些虚…

idea 里 没有svn选项的处理办法

总结一下没有svn选项的几种情况&#xff1a; 情况1&#xff1a;IntelliJ IDEA打开带SVN信息的项目不显示SVN信息&#xff0c;项目右键SVN以及图标还有Changes都不显示解决方法 在VCS菜单中有个开关&#xff0c;叫Enabled Version Control Integration&#xff0c;在打开的窗口…

Mycat2 分布式数据库中间件

一.安装部署 Mycat2目前还不支持直接获取Docker镜像&#xff0c;需要自己通过Dockerfile打包镜像&#xff0c;其实这也是为了开发者考虑&#xff0c;比如一些个性化功能&#xff0c;如自定义分片等 Dockerfile FROM docker.io/adoptopenjdk/openjdk8:latestENV AUTO_RUN_DIR…

【软考-中级】系统集成项目管理工程师 【17 信息系统安全管理】

持续更新。。。。。。。。。。。。。。。 【第十七章】信息系统安全管理 (选择2分 17.1 信息安全管理17.1.1 信息安全含义和目标 17.2 信息系统安全17.2.1信息系统安全概念17.2.2信息系统安全属性17.2.3信息系统安全管理体系 17.3 物理安全管理17.3.1计算机机房与设施安全17.3.…

Postman入门基础 —— 接口测试流程!

一、编写接口测试计划 接口测试计划和功能测试计划目标一致&#xff0c;都是为了确认需求、确定测试环境、确定测试方法&#xff0c;为设计测试用例做准备&#xff0c;初步制定接口测试进度方案。一般来说&#xff0c;接口测试计划包括概述、测试资源、测试功能、测试重点、测…

【C++】用constexpr,constinit,consteval让程序跑的快一点

从C11加入constexpr关键字开始&#xff0c;到C20又加入了consteval &#xff0c;constinit &#xff0c;有3个const打头的关键字 虽然是以const开头的&#xff0c;不过这3个关键字主要是指示在编译时候的动作&#xff0c;它们都是在编译时就已经被编译程序处理&#xff0c;并非…

Python使用openpyxl读取excel图片

使用openpyxl读取excel中图片&#xff0c;并保存到本地. 需要的包。 from openpyxl import load_workbook from PIL import Image import cv2 import numpy as np具体实现 先把openpyxl读取的图片转换为Image对象&#xff0c;再将Image对象转换为numpy array&#xff0c;num…

【无标题】Docker入门到拿捏,图文码并茂

0. 项目部署的问题 大型项目组件较多,运行环境也较为复杂&#xff0c;部署时会碰到- -些问题: 依赖关系复杂&#xff0c;容易出现兼容性问题开发、测试、生产环境有差异 1. 认识Docker Docker如何解决依赖的兼容问题的? 将应用的Libs (函数库)、Deps (依赖)、配置与应用一…

V8引擎编译原理(VIP课程)

什么是V8 V8是谷歌的开源高性能JavaScript和WebAssembly引擎&#xff0c;用C编写。它被用于Chrome和Node.js等。它实现ECMAScript和WebAssembly&#xff0c;并在Windows 7或更高版本、macOS 10.12以及使用x64、IA-32、ARM或MIPS处理器的Linux系统上运行。V8可以独立运行&#…

KMP substring search 算法 案例分析

一、理解KMP算法如何运用后缀和前缀的信息 文本串text:abcxabcdabxabcdabcdabcy模式串pattern:abcdabcy 当发现不匹配的点&#xff0c;我们的目标不是在这个串中进行回溯操作。因此我们要检查的是 d 的前面的子串&#xff08;abc&#xff09;&#xff0c;在这个子串&#xff08…

【Qt-19】按Q退出应用程序

如何将Qt窗口应用程序改成控制台程序呢&#xff1f; 下面进入正文&#xff0c;如何控制控制台程序退出呢&#xff1f; 这里采用线程方式&#xff0c;通过单独线程监视用户输入来执行是否退出程序。 监视线程头文件thread.h #include <QThread> #include "TDRServe…

c++_learning-基础部分

文章目录 基础认识&#xff1a;语言特性&#xff08;面向对象编程&#xff09;&#xff1a;c的类&#xff08;相当于c中的结构体&#xff09;&#xff1a;三大特性&#xff1a;c包含四种编程范式&#xff1a;优缺点&#xff1a; c程序编译的过程&#xff1a;预处理->编译&am…

matlab中绘制 维诺图(Voronoi Diagram)

1.专业术语&#xff08;相关概念&#xff09;&#xff1a; 基点Site&#xff1a;具有一些几何意义的点 细胞Cell&#xff1a;这个Cell中的任何一个点到Cell中基点中的距离都是最近的&#xff0c;离其他Site比离内部Site的距离都要远。 Cell的划分&#xff1a;基点Site与其它的…

气膜式仓库:灵活创新,助力企业储存与物流升级

气膜式大空间仓库的建设不受地面条件限制&#xff0c;为企业提供了极大的便利。合理的仓储系统不仅是企业和厂商提高货品流动速度、确保生产、储运、配送顺利进行的关键&#xff0c;也是现代物流发展的需要。传统建筑在使用中存在一些不足&#xff0c;因此&#xff0c;我们需要…

科技新宠!拓世AI智能直播一体机揭秘,颠覆教学模式!

数字时代的铺展下&#xff0c;短视频和直播电商行业呈现出爆发式的增长&#xff0c;这种趋势正在日益融入人们的日常生活中&#xff0c;让短视频带货和直播带货逐渐成为一种独具中国特色的现象。与此同时&#xff0c;市场对专业人才的渴求也日渐加剧。国家以及相关地方政府纷纷…

Generative AI 新世界 | 大模型参数高效微调和量化原理概述

在上期文章&#xff0c;我们对比了在 Amazon SageMaker 上部署大模型的两种不同的部署方式。本期文章&#xff0c;我们将探讨两个目前大语言模型领域的开发者们都关注的两个热门话题&#xff1a;大型语言模型&#xff08;LLM&#xff09;的高效微调和量化。 微调大型语言模型允…

微信小程序调起微信支付

微信支付开发文档&#xff1a;wx.requestPayment(Object object) | 微信开放文档 一、先有一个提交订单页面 &#xff08;1&#xff09;wxml <view class"btn" bindtap"addOrder">{{btnText}}</view> 二、接入支付流程 &#xff08;1&…