0
点赞
收藏
分享

微信扫一扫

<软考高项备考>《论文专题 - 27 成本管理(1) 》

🌈个人主页:Sarapines Programmer
🔥 系列专栏:《模式之谜 | 数据奇迹解码》
⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。

目录

🌌1 初识模式识别

🌌2 K-近邻法

🌍2.1 研究目的

🌍2.2 研究环境

🌍2.3 研究内容

🌕2.3.1 算法原理介绍

🌕2.3.2 实验步骤

🌕2.3.3 实验结果

🌍2.4 研究体会

📝总结


🌌1 初识模式识别


🌌2 K-近邻法

🌍2.1 研究目的

1.理解K-近邻法的基本原理和核心概念。

2.学习如何使用K-近邻算法进行模型训练和预测。

3.掌握K-近邻法在不同数据集上的应用和调优方法。


🌍2.2 研究环境

  1. C++编程语言及其相关库

    • 语言支持: VSCode具备强大的C++语言支持,提供代码高亮、自动完成等功能,使得编码更加高效。
    • Eigen库: 作为线性代数的重要工具,Eigen库被集成用于进行高效的线性代数运算,为数学计算提供了强大的支持。
  2. OpenCV库

    • 图像处理: OpenCV库作为计算机视觉领域的重要工具,为图像处理和可视化提供了广泛的功能。包括图像读取、处理、特征提取等一系列操作,为图像相关的应用提供了基础支持。
    • 可视化: OpenCV还支持直观的图像可视化,使开发者能够直观地观察图像处理的效果,有助于调试和优化。
  3. C++编译器配置

    • GCC配置: 在使用VSCode进行C++开发时,确保已配置好C++编译器,常用的是GNU Compiler Collection(GCC)。正确的配置保证了代码的正确编译和执行。
  4. 硬件环境

    • 计算资源: 为了处理图像数据,需要充足的计算资源,包括足够的内存和强大的CPU/GPU。这保障了对大规模图像数据进行高效处理和运算。
    • 内存管理: 在处理大规模图像数据时,合理的内存管理变得至关重要,以防止内存溢出和提高程序运行效率。

🌍2.3 研究内容

🌕2.3.1 算法原理介绍


🌕2.3.2 实验步骤

C语言代码:

#include <iostream>
#include <math.h>
#include <fstream>
#define  NATTRS 5 //number of attributes
#define  MAXSZ  1700 //max size of training set
#define  MAXVALUE  10000.0 //the biggest attribute's value is below 10000(int)
#define  K  5   
using namespace std;
struct vector {
	double attributes[NATTRS];
	double classlabel;
};
struct item {
	double distance;
	double classlabel;
};
struct vector trSet[MAXSZ];//global variable,the training set
struct item knn[K];//global variable,the k-neareast-neighbour set
int curTSize = 0; //current size of the training set
int AddtoTSet(struct vector v)
{
	if(curTSize>=MAXSZ) {
		cout<<endl<<"The training set has "<<MAXSZ<<" examples!"<<endl<<endl; 
		return 0;
	}
	trSet[curTSize] = v;
	curTSize++;
	return 1;
}
double Distance(struct vector v1,struct vector v2)
{
	double d = 0.0;
	double tem = 0.0;
	for(int i = 0;i < NATTRS;i++)
		tem += (v1.attributes[i]-v2.attributes[i])*(v1.attributes[i]-v2.attributes[i]);
	d = sqrt(tem);
	return d;
}
int max(struct item knn[]) //return the no. of the item which has biggest distance(
                           //should be replaced) 
{
	int maxNo = 0;
	if(K > 1)
	for(int i = 1;i < K;i++)
		if(knn[i].distance>knn[maxNo].distance)
			maxNo = i;
    return maxNo;
}

double Classify(struct vector v)//decide which class label will be assigned to
                             //a given input vetor with the knn method
{
	double dd = 0;
	int maxn = 0;
	int freq[K];
	double mfreqC = 0;//the class label appears most frequently 
	int i;
	for(i = 0;i < K;i++)
		knn[i].distance = MAXVALUE;
	for(i = 0;i < curTSize;i++)
	{
		dd = Distance(trSet[i],v);
		maxn = max(knn);//for every new state of the training set should update maxn
		if(dd < knn[maxn].distance) {
				knn[maxn].distance = dd;
				knn[maxn].classlabel = trSet[i].classlabel;
            }
	}
	for(i = 0;i < K;i++)//freq[i] represents knn[i].classlabel appears how many times 
		freq[i] = 1;
	for(i = 0;i < K;i++)  
		for(int j = 0;j < K;j++)
			if((i!=j)&&(knn[i].classlabel == knn[j].classlabel))
				freq[i]+=1;
		for(i = 0;i < K;i++)  
		cout<<"freq:"<<freq[i]<<endl;


	int mfreq = 1;
	mfreqC = knn[0].classlabel;
	for(i = 0;i < K;i++)
		if(freq[i] > mfreq)  {
			mfreq = freq[i];//mfreq represents the most frepuences
 			mfreqC = knn[i].classlabel; //mfreqNo is the item no. with the most frequent
			                             //classlabel
		}
	return mfreqC;
}
void main()
{   

	double classlabel;
	double c; 
	double n;
	struct vector trExmp;	
	int i;
	ifstream filein("data.txt");
	if(filein.fail()){cout<<"Can't open data.txt"<<endl; return;}
	while(!filein.eof()) 
	{
		filein>>c;
		trExmp.classlabel = c;
		cout<<"lable:"<<trExmp.classlabel<<"| ";

		for(int i = 0;i < NATTRS;i++) 
		{
		filein>>n;
		trExmp.attributes[i] = n;
		cout<<trExmp.attributes[i]<<" ";
		}

		cout<<endl;
	 if(!AddtoTSet(trExmp))
		break;
	}

	filein.close();

	struct vector testv={{1,18,11,11,0.5513196},17};
	classlabel = Classify(testv);
	cout<<"The classlable of the testv is:	";
	cout<<classlabel<<endl;
	for(i = 0;i < K;i++)
		cout<<knn[i].distance<<"\t"<<knn[i].classlabel<<endl;
	//cout<<max(knn);
}

程序分析:


🌕2.3.3 实验结果


🌍2.4 研究体会

  1. K-近邻法的核心思想: 通过实践深刻理解K-近邻法是一种基于实例的学习方法,其核心思想是通过计算样本之间的距离,利用最近的K个样本的标签信息进行预测。这种直观的思想使得K-近邻法在处理非线性和复杂数据集时表现出色。

  2. K值的重要性及调参启示: 实验中发现K值的选择对模型性能具有关键影响。经过反复尝试不同K值,认识到过小或过大的K值可能导致模型过拟合或欠拟合,进而影响预测准确性。这深刻启示我在实际应用中需要谨慎选择K值,并结合具体问题进行调参。

  3. 距离度量对模型性能的影响: 实验中尝试了不同的距离度量方法,如欧式距离和曼哈顿距离,发现在不同数据集上它们的效果有所差异。这使我认识到在选择距离度量时需要考虑数据的特点,以及不同度量方法对模型的影响。在实际应用中,这为更准确选择合适的度量方法提供了指导。


📝总结

模式匹配领域就像一片未被勘探的信息大海,引领你勇敢踏入数据科学的神秘领域。这是一场独特的学习冒险,从基本概念到算法实现,逐步揭示更深层次的模式分析、匹配算法和智能模式识别的奥秘。渴望挑战模式匹配的学习路径和掌握信息领域的技术?不妨点击下方链接,一同探讨更多数据科学的奇迹吧。我们推出了引领趋势的💻 数据科学专栏:《模式之谜 | 数据奇迹解码》,旨在深度探索模式匹配技术的实际应用和创新。🌐🔍

举报

相关推荐

0 条评论