int main()
{
// svm函数使用列向量,这里我们先定义一个方面的typedef
// 这个 typedef 声明了一个2行1列的矩阵。如果你像包含更多维,把2修改成更多即可。
//如果你不知道特征有多少维,你可以先把这个值设置为零,然后用的时候,用matrix.set_size()函数即可。
typedef matrix<double, 2, 1> sample_type;
// 核函数的定义
//我选择了一个radial basis kernel,这个核适合我们的2维的样本。
//你也可以使用自己定义的任何kernels,可以参考 custom_trainer_ex.cpp
typedef radial_basis_kernel<sample_type> kernel_type;
// 现在我们声明 samples和labels表示样本和其对应的标记
std::vector<sample_type> samples;
std::vector<double> labels;
// 给samples和labels赋值。用一个循环生成一系列的点,然后一句他们到圆心的距离来标记
for (int r = -20; r <= 20; ++r)
{
for (int c = -20; c <= 20; ++c)
{
sample_type samp;
samp(0) = r;
samp(1) = c;
samples.push_back(samp);
//如果到圆心的距离小于10
if (sqrt((double)r*r + c*c) <= 10)
labels.push_back(+1);
else
labels.push_back(-1);
}
}
// 归一化样本,减去均值,除以标准差。这是去除数值稳定性问题的好办法,防止某些值过大。
// 做这一步,对本例的问题来说,并不是那么重要。下面的代码会教你怎么做归一化。
vector_normalizer<sample_type> normalizer;
// 计算均值和方差,放入normalizer的成员变量中
normalizer.train(samples);
// 然后分别归一
{
// svm函数使用列向量,这里我们先定义一个方面的typedef
// 这个 typedef 声明了一个2行1列的矩阵。如果你像包含更多维,把2修改成更多即可。
//如果你不知道特征有多少维,你可以先把这个值设置为零,然后用的时候,用matrix.set_size()函数即可。
typedef matrix<double, 2, 1> sample_type;
// 核函数的定义
//我选择了一个radial basis kernel,这个核适合我们的2维的样本。
//你也可以使用自己定义的任何kernels,可以参考 custom_trainer_ex.cpp
typedef radial_basis_kernel<sample_type> kernel_type;
// 现在我们声明 samples和labels表示样本和其对应的标记
std::vector<sample_type> samples;
std::vector<double> labels;
// 给samples和labels赋值。用一个循环生成一系列的点,然后一句他们到圆心的距离来标记
for (int r = -20; r <= 20; ++r)
{
for (int c = -20; c <= 20; ++c)
{
sample_type samp;
samp(0) = r;
samp(1) = c;
samples.push_back(samp);
//如果到圆心的距离小于10
if (sqrt((double)r*r + c*c) <= 10)
labels.push_back(+1);
else
labels.push_back(-1);
}
}
// 归一化样本,减去均值,除以标准差。这是去除数值稳定性问题的好办法,防止某些值过大。
// 做这一步,对本例的问题来说,并不是那么重要。下面的代码会教你怎么做归一化。
vector_normalizer<sample_type> normalizer;
// 计算均值和方差,放入normalizer的成员变量中
normalizer.train(samples);
// 然后分别归一