⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 knear.cpp

📁 Parzen 窗 和 K近邻法进行概率密度估计 还带一个示波器控件.
💻 CPP
字号:
// KNear.cpp: implementation of the CKNear class.
//
//////////////////////////////////////////////////////////////////////


#include "KNear.h"
#include <cmath>
#include <assert.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
//#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CKNN::CKNN(int nDim):CEstimate(nDim)
{
	m_pDist = NULL;
}

CKNN::~CKNN()
{
	if (m_pDist)
		delete[] m_pDist;
}



static int compare( const void *arg1, const void *arg2 )
{
	double t;
	t = ((CKNN::DISTANCE*)arg1)->dbDist - ((CKNN::DISTANCE*)arg2)->dbDist;
	if (t < -0.000001)
		return -1;
	else if (t > 0.0000001)
		return 1;
	else
		return 0;

}

double  CKNN::Probility(vector<double> x)
{
	if (x.size() != m_nDim)
		return -1.0;

	//Kn值
	const int Kn = 1000/sqrt(m_listSample.size());


	//1。找到x附近包含Kn个样本点的区域


	//枚举器
//	vector <double>::iterator  vix, vil;
	list <vector<double> >::iterator li;

	//1.1 对N个样本点与x的距离排序
	//1.1.1 计算x与N个样点的距离,放入m_pDist中

	if(m_pDist == NULL) //首次使用m_pDist,需要为其分配内存
	{
		m_pDist = (DISTANCE *)malloc( sizeof(DISTANCE) * m_listSample.size());
		m_nCount = m_listSample.size();
	}
	//防止变态用户在调用了Probility之后又添加数据
	else if (m_nCount != m_listSample.size()) 
	{
		m_pDist = (DISTANCE*)realloc(m_pDist, sizeof(DISTANCE) * m_listSample.size());
		m_nCount = m_listSample.size();
	}


	assert(m_pDist);
	int i = 0;

	for (li = m_listSample.begin(); li != m_listSample.end(); li++)
	{
		m_pDist[i].iIndex = i;
		m_pDist[i].dbDist = Distance(*li, x);
		m_pDist[i].x = (*li).front(); 
		i++;
	}

	//1.1.2 排序
	qsort(m_pDist, m_listSample.size(), sizeof(DISTANCE), compare);

	//1.2 选出前Kn个样本点作为x的近邻区域点
	//直接取前Kn个点即可



	//2。计算改区域的体积

	double Vn = CaculateVn(Kn);

	//3. 搞定,返回概率密度
	return (double)Kn / (double)(m_listSample.size()) / (Vn);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -