#include namespace oneClassSvm { /** * @brief 训练SVM 将结果赋值给svm_result_ 并返回结果的引用 * @tparam dims * @param tr_samples My Param doc * @return TrainResult */ template TrainResult& Frame::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 double Frame::predict(ExchangedMetaData& data) { matrix 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 int Frame::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 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 bool Frame::valid() { if (standard_error < 0) { return true; } return false; } TrainResult decision_function_get(SamplesType samples) { svm_one_class_trainer 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>;