77 lines
1.9 KiB
C++
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>; |