OpenCV Machine Learning 之 K最近邻分类器 K-Nearest Neighbors

锺离玮
2023-12-01

K-Nearest Neighbors

该算法存储所有的训练样本(已知标签),然后通过分析新给的样本(标签未知)与已知标签的训练样本的相似度,选出其中的K个最相似的训练样本进行投票得到新样本的标签,并计算加权和等。 该方法有时被称为是“learning by example”,因为他总是根据新样本的特征向量与已知标签的样本特征向量的相似度来判断新样本的类别。

CvKNearest

class  CvKNearest :  public  CvStatModel

该类实现了 K-Nearest Neighbors 模型

CvKNearest::CvKNearest

默认构造函数.

C++: CvKNearest::CvKNearest()

带训练数据的构造函数(opencv2.x版本的)

C++: CvKNearest::CvKNearest(constMat& trainData, const Mat& responses, constMat& sampleIdx=Mat(), bool isRegression=false,int max_k=32 )

带训练数据的构造函数(opencv 1.x版本的)

C++: CvKNearest::CvKNearest(constCvMat* trainData, const CvMat* responses, constCvMat* sampleIdx=0, boolisRegression=false, int max_k=32 )

查看函数CvKNearest::train()获取参数的详细解释。

CvKNearest::train

调用该函数训练模型.

C++: bool CvKNearest::train(const Mat& trainData, const Mat& responses, const Mat& sampleIdx=Mat(), bool isRegression=false,int maxK=32, bool updateBase=false )

C++: bool CvKNearest::train(const CvMat* trainData, const CvMat* responses, const CvMat* sampleIdx=0, boolis_regression=false, int maxK=32, bool updateBase=false )

 

isRegression – 问题类型: true for 回归问题 and false for 分类问题.

·         maxK –被传递给函数 CvKNearest::find_nearest()的最大邻居的数目.

·         updateBase – 指定模型是被重新训练(update_base=false)

·         还是在原有基础上进行更新 (update_base=true). 在后一种情况下, 参数 maxK 必须不能大于原始值.

该方法用于训练 K-Nearest 模型. 它遵循其父类函数CvStatModel::train() 的一般性约定,并具有下述限制:

l  训练数据集仅支持按行存放,即 CV_ROW_SAMPLE 

l  所有输入变量必须是可以排序的.

l  输出变量可以是类别标签,此时(is_regression=false)或者ordered( is_regression=true ).

  变量子集( var_idx)和 缺省观测是不被支持的

CvKNearest::find_nearest

找到邻居并预测输入向量的响应

C++: float CvKNearest::find_nearest(const Mat& samples, int k,Mat* results=0, const float** neighbors=0, Mat*neighborResponses=0,Mat* dist=0 ) const

C++: float CvKNearest::find_nearest(const Mat& samples, int k, Mat& results,Mat& neighborResponses, Mat& dists) const

C++: float CvKNearest::find_nearest(const CvMat* samples, int k,CvMat* results=0, const float** neighbors=0, CvMat*neighborResponses=0,CvMat* dist=0 ) const

·         samples – 输入样本,按行存储. 是一个单精度浮点矩阵。大小为:      .

·         k – 使用的最近邻的个数. 必须满足约束条件:  CvKNearest::get_max_k().

·         results – 每一个输入样本的预测结果的向量 (回归问题 或 分类问题). 是一个单精度浮点数向量,包含number_of_samples 个元素.

·         neighbors –可选的输出参数,指向邻居向量的指针,是一个数组:包含 k*samples->rowspointers.

·         neighborResponses – 可选的输出参数,与上面的neighbours参数对应。是一个大小为的单精度浮点矩阵.

·         dist – 可选的输出参数,是输入向量与它的邻居的距离。是一个大小为的单精度浮点数矩阵.

对于每一个输入向量(samples矩阵中的一行), 该方法找到K个最近的邻居. 在回归问题中, 预测的结果是所有邻居响应的加权均值。在分类问题中, 输入项的类别标号由投票法决定.

对于每一个输入向量, 它的邻居按照与自己的距离远近进行了排序.

在C++的实现中 ,可以使用输出指针指向空矩阵,函数会自己分配内存.

如果只有一个输入向量,所有的输出矩阵都是可选的,预测值直接由函数返回。该函数使用TBB库进行了并行运算.

CvKNearest::get_max_k

获取最大邻居的数目,该数目将作为参数传递给函数 CvKNearest::find_nearest().

C++: int CvKNearest::get_max_k() const

CvKNearest::get_var_count

返回样本的特征数目 (变量数目).

C++: int CvKNearest::get_var_count() const

CvKNearest::get_sample_count

返回训练样本的总数目.

C++: int CvKNearest::get_sample_count() const

CvKNearest::is_regression

返回问题类型: true for回归问题 and false for分类问题.

C++: bool CvKNearest::is_regression() const

 

 类似资料: