K近邻算法(K-Nearest Neighbors,KNN)既可以处理分类问题,也可以处理回归问题。
KNN算法原理:
在训练样本集中,每个样本都是一个具有
n
n
n个特征属性的向量,即
x
=
(
x
1
,
x
2
,
.
.
.
,
x
n
)
x= (x_1, x_2, ..., x_n)
x=(x1,x2,...,xn), 因此可认为每个样本在
n
n
n特征空间或度量空间分布;同时,每个样本还有一个唯一属于他的标签
y
y
y,机器学习的目的就要是找到一个函数满足
y
=
f
(
x
)
y=f(x)
y=f(x),这样,当有一个新样本
u
u
u时,将其特征属性代入该目标函数即可确定他的标签。
KNN的任务就是,在训练样本集中,依据距离测度找到与测试样本最相似的那K个训练样本。
对于“分类”问题,我们多采用“多数表决”的方式来确定新样本
u
u
u的最终分类,即这K个训练样本中,哪个分类的样本数最多,
u
u
u就属于哪个分类。
对于“回归”问题,
u
u
u的预测值
v
v
v为:
v
=
∑
i
=
1
K
y
i
/
K
v = {\sum_{i=1}^{K}y_i}/K
v=i=1∑Kyi/K
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
using namespace cv::ml;
int main(int argc, char *argv[])
{
//训练样本:耐酸性、强度、分类(好:1,差:-1)
float trainData[24][2] = { {4,3}, {1,3},{3,3},{3,7},{3,4},{4,1},{1,4},{3,6},{3,7},{6,2},
{4,6}, {4,4},{5,8},{7,8},{7,7},{10,5},{7,6},{4,10},{9,7},{5,4},{8,5},{6,6},{7,4}, {8,8}
};
Mat trainDataMat(24, 2, CV_32FC1, trainData);
//cout << trainDataMat << endl;
//训练样本的响应值,1代表G -1代表B
int labels[24] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,-1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1};
Mat labelsMat(24, 1, CV_32SC1, labels);
//cout << labelsMat << endl;
//创建KNN分类器
Ptr<KNearest> knn_model = KNearest::create();;
//创建TrainData并进行训练
Ptr<TrainData> tData = TrainData::create(trainDataMat, ROW_SAMPLE, labelsMat);
knn_model->train(tData);
float myData[2] = {10,8};//测试样本
Mat myDataMat(1, 2, CV_32FC1, myData);
//利用训练好的分类器进行测试样本预测
//int res = knn_model->predict(myDataMat);
int K = 7;
vector<float> predictions;
;
int res = knn_model->findNearest(myDataMat, K, predictions);
for (size_t i = 0; i < K; i++)
{
cout << " " << predictions[i];
}
cout << endl << "The result is : " << res << endl;
knn_model.release();
return 0;
}
预测结果为-1.