快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰上线了_龟发之家论坛



目的

实际事物模型中,并非所有器械都是线性可分的。

必要探求一种措施对线性弗因素数据进行划分。

道理

上一篇文章,我们推导出对付线性可分数据,最佳划分超平面应满意:

现在我们想引入一些器械,来表示那些被错分的数据点(比如噪点),对划分的影响。

若何来表示这些影响呢?

被错分的点,离自己该当存在澳门新葡亰上线了的区域越远,就代表了,这个点“错”得越严重。

以是我们引入,为对应样本离同类区域的间隔。

接下来的问题是,若何将这种错的程度,转换为和原模型相同的度量呢?

我们再引入一个常量C,表示和原模型度量的转换关系,用C对进行加权和,来表征错分点对原模型的影响,这样我们获得新的最优化问题模型:

关于参数C的选择, 显着的取决于练习样本的散播环境。 只管并不存在一个普遍的谜底,然则记着下面几点规则照样有用的:

C对照大年夜时分类差错率较小,然则距离也较小。 在这种情形下, 错分类对模型函数孕育发生较大年夜的影响,既然优化的目的是为了最小化这个模型函数,那么错分类的情形一定会受到抑制。

C对照小光阴隔较大年夜,然则分类差错率也较大年夜。 在这种情形下,模型函数中错分类之和这一项对优化历程的影响变小,优化历程将加倍关注于探求到一个能孕育发生较大年夜距离的超平面。

说白了,C的大年夜小表征了,错分数据对原模型的影响程度。于是C越大年夜,优化时越关注错分问题。反之越关注能否孕育发生一个较大年夜距离的超平面。

开始应用

#include

#include#include

#include

#define NTRAINING_SAMPLES100// 每类练习样本的数量 #define FRAC_LINEAR_SEP0.9f// 线性可分部分的样本组成比例

using namespace cv;

using namespace std;

int main(){// 用于显示的数据

const int WIDTH = 512, HEIGHT = 512;Mat I = Mat::zeros(HEIGHT, WIDTH, CV_8UC3);

/* 1. 随即孕育发生练习数据 */

Mat trainData(2*NTRAINING_SAMPLES, 2, CV_32FC1);Mat labels(2*NTRAINING_SAMPLES, 1, CV_32FC1);

RNG rng(100); // 天生随即数

// 设置线性可分的练习数据

int nLinearSamples = (int) (FRAC_LINEAR_SEP * NTRAINING_SAMPLES);

// 生因素类1的随机点Mat trainClass = trainData.rowRange(0, nLinearSamples);

// 点的x坐标在[0, 0.4)之间Mat c = trainClass.colRange(0, 1);

rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(0.4 * WIDTH));// 点的y坐标在[0, 1)之间

c = trainClass.colRange(1,2);rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(HEIGHT));

// 生因素类2的随机点

trainClass = train澳门新葡亰上线了Data.rowRange(2*NTRAINING_SAMPLES-nLinearSamples, 2*NTRAINING_SAMPLES);// 点的x坐标在[0.6, 1]之间

c = trainClass.colRange(0 , 1);rng.fill(c, RNG::UNIFORM, Scalar(0.6*WIDTH), Scalar(WIDTH));

// 点的y坐标在[0, 1)之间c = trainClass.colRange(1,2);

rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(HEIGHT));

/* 设置非线性可分的练习数据 */

// 生因素类1和分类2的随机点trainClass = trainData.rowRange(nLinearSamples, 2*NTRAINING_SAMPLES-nLinearSamples);

// 点的x坐标在[0.4, 0.6)之间c = trainClass.colRange(0,1);

rng.fill(c, RNG::UNIFORM, Scalar(0.4*WIDTH), Scalar(0.6*WIDTH));// 点的y坐标在[0, 1)之间

c = trainClass.colRange(1,2);rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(HEIGHT));

/* 设置分类标签 */

labels.rowRange(0,NTRAINING_SAMPLES).setTo(1);// Class 1labels.rowRange(NTRAINING_SAMPLES, 2*NTRAINING_SAMPLES).setTo(2);// Class 2

/* 澳门新葡亰上线了设置支持向量机参数 */

CvSVMParams params;params.svm_type= SVM::C_SVC;

params.C= 0.1;params.kernel_type = SVM::LINEAR;

params.term_crit= TermCriteria(CV_TERMCRIT_ITER, (int)1e7, 1e-6);

/* 3. 练习支持向量机 */cout "Starting training process"

CvSVM svm;svm.train(trainData, labels, Mat(), Mat(), params);

cout "Finished training process"

/* 4. 显示划分区域 */Vec3b green(0,100,0), blue (100,0,0);

for (int i = 0; ifor (int j = 0; j

Mat sampleMat = (Mat_float>(1,2)float response = svm.predict(sampleMat);

if(response == 1)I.at(j, i)= green;

else if (response == 2)I.at(j, i)= blue;}

/* 5. 显示练习数据 */

int thick = -1;int lineType = 8;

flo澳门新葡亰上线了at px, py;// 分类1

for (int i = 0; ipx = trainData.atfloat>(i,0);

py = trainData.atfloat>(i,1);circle(I, Point( (int) px,(int) py ), 3, Scalar(0, 255, 0), thick, lineType);

}// 分类2

for (int i = NTRAINING_SAMPLES; ipx = trainData.atfloat>(i,0);

py = trainData.atfloat>(i,1);circle(I, Point( (int) px, (int) py ), 3, Scalar(255, 0, 0), thick, lineType);

}

/* 6. 显示支持向量 */thick = 2;

lineType= 8;int x= svm.get_support_vector_count();

for (int i = 0; i

{const float* v = svm.get_support_vector(i);

circle( I,Point( (int) v[0], (int) v[1]), 6, Scalar(128, 128, 128), thick, lineType);}

imwrite("result.png", I);// 保存图片

imshow("SVM线性弗因素数据划分", I); // 显示给用户waitKey(0);

}

设置SVM参数

这里的参数设置可以参考一下上一篇文章的API。

CvSVMParams params;

params.svm_type= SVM::C_SVC;

params.C= 0.1;

params.kernel_type = SVM::LINEAR;

params.term_crit= TermCriteria(CV_TERMCRIT_ITER, (int)1e7, 1e-6);

可以看到,此次应用的是C类支持向量分类机。其参数C的值为0.1。

结果

法度榜样创建了一张图像,在此中显示了练习样本,此中一个类显示为浅绿色圆圈,另一个类显示为浅蓝色圆圈。

练习获得SVM,并将图像的每一个像素分类。 分类的结果将图像分为蓝绿两部分,中心线便是最优瓜分超平面。因为样本非线性可分, 自然就有一些被错分类的样本。 一些绿色点被划分到蓝色区域, 一些蓝色点被划分到绿色区域。

着末支持向量经由过程灰色边框加重显示。

被山寨的原文

Support Vector Machines for Non-Li澳门新葡亰上线了nearly Separable Data . OpenCV.org

您可能还会对下面的文章感兴趣: