eis/eqpalg/.do_not_use/oneClassSvm/frame.cpp

77 lines
1.9 KiB
C++

#include <eqpalg/oneClassSvm/frame.hpp>
namespace oneClassSvm {
/**
* @brief 训练SVM 将结果赋值给svm_result_ 并返回结果的引用
* @tparam dims
* @param tr_samples My Param doc
* @return TrainResult
*/
template <size_t dims>
TrainResult& Frame<dims>::train_get_df_one_class_svm(SamplesType& tr_samples) {
svm_result_ = decision_function_get(tr_samples);
return this->svm_result_;
}
/**
* @brief 预测
* @param data My Param doc
* @return double 越小越异常
*/
template <size_t dims>
double Frame<dims>::predict(ExchangedMetaData& data) {
matrix<double, 0, 1> tmp;
for (size_t i = 0; i < data.size(); i++) {
tmp(i) = data[i];
}
return svm_result_(tmp);
}
/**
* @brief 载入数据
* @tparam dims
* @param data My Param doc
* @return int
*/
template <size_t dims>
int Frame<dims>::load(const InData& data) {
SamplesType tr_samples;
// 如果不存在数据,退出
if (data.empty()) {
return -1;
}
// 提前保留样本
tr_samples.reserve(data.size());
// 把输入转成d—lib样本
for (const auto& meta_data : data) {
matrix<double, 0, 1> tmp(dims);
for (size_t i = 0; i < meta_data.size(); i++) {
tmp(i) = meta_data[i];
}
tr_samples.emplace_back(tmp);
}
auto df = train_get_df_one_class_svm(tr_samples);
double th = 0;
for (auto x : tr_samples) th += df(x);
th = th / tr_samples.size();
standard_error = -fabs(th * 100);
// standard_error =
return 0;
}
template <size_t dims>
bool Frame<dims>::valid() {
if (standard_error < 0) {
return true;
}
return false;
}
TrainResult decision_function_get(SamplesType samples)
{
svm_one_class_trainer<kernel_type> trainer;
trainer.set_kernel(kernel_type(4.0));
return trainer.train(samples);
}
} // namespace oneClassSvm
template class oneClassSvm::Frame<1>;
template class oneClassSvm::Frame<2>;
template class oneClassSvm::Frame<3>;