#pragma once /** * @file dist.h * @brief 确定分布类型 * 根据输入的数据特征确定分布类型 * 并给出对应的置信区间 * @author your name (you@domain.com) * @version 0.1 * @date 2024-02-21 * * Copyright: Baosight Co. Ltd. * DO NOT COPY/USE WITHOUT PERMISSION * */ #include #include #include #include #include #include #include #include #include #include #include "mix_cc/type/range.h" namespace DAA { using boost::math::quantile; /** * @brief 分布验证和置信区间获取 * 先根据Prob确定出错的最大可能性 * 再根据最大可能性、数据分布区间,得到详细的数据作用范围 * 根据数据的真实分布情况,重新调整参数,直到报警率小于目标数值 * 目前只支持高斯分布类型的分布 */ class Dist { public: enum class DistTypes { unknown, student_t, ///< T分布 normal, ///<正态分布 skew_normal ///<偏态分布 }; ///< 预设三种分布 constexpr static double test_prec = 0.01; protected: DistTypes dist_type_; ///< 分布类型 bool valid_; ///< 可用性 dlib::running_stats rs_; ///< dlib 数据分布特征 mix_cc::float_range_t legal_range_; ///< 合法分布区间 std::string rule_id_; std::shared_ptr normal_; ///< 正态分布 std::shared_ptr students_t_; ///< T分布 std::shared_ptr skew_normal_; ///< 偏态分布 std::unique_ptr logger_; double predefied_prob_ = 0.975; ///< 预定义的置信概率 3σ的大概置信度 double prob_ = 0.5; public: /** * @brief 构建分布检测 */ Dist(/* args */); /** * @brief Destroy the Dist object */ ~Dist(); /** * @brief 得到分布类型 * @return DistTypes */ DistTypes get_distribution_type() const; /** * @brief 设置置信概率 * @param prob 置信概率 * @return int */ int set_predefined_prob(double prob); /** * @brief Get the shifted prob object * @return double */ double get_shifted_prob() const; /** * @brief * 测试合法数据的分布类型和理想的置信区局,该函数只会根据合法数据进行判断 * @param rs dlib::running_stats * @param tmp_data My Param doc * @return int */ int auto_test(dlib::running_stats rs, const std::vector& tmp_data); // /** // * @brief 设置报警样本(可选,用来验证第二类错误) // * @param warning_sample My Param doc // * @return int // */ // int set_warning_sample_optional(const std::vector& warning_sample); /** * @brief 分布是否具有合理类型 * @return true * @return false */ bool valid() const; /** * @brief 得到合法范围大小 * @return mix_cc::float_range_t */ mix_cc::float_range_t get_range() const; protected: /** * @brief 得到第一类错误的概率 * @param prob 置信概率 * @param tmp_data 用来验证的临时数据 * @return double */ double get_error_rate_type_1(const double& prob, const std::vector& tmp_data); /** * @brief 得到指定置信概率的区间 * @param prob 置信概率 * @return mix_cc::float_range_t */ mix_cc::float_range_t get_range(double prob); }; } // namespace DAA