📄 knear.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 + -