package usertruth var routers100DIC = map[string]byte{} // NDArg 正态分布参数 type NDArg struct { Mu float64 //期望 Sigma float64 //方差 } // 2020-01-16 注册后20分钟用户请求模型 var routersND = map[string]NDArg{ "/api/app/mine/info": {26.407859530084107, 26.275135225050672}, "/api/app/vid/play": {21.995098927091213, 22.763576665825333}, "/api/app/vid/m3u8": {21.38402911495771, 16.07871338083366}, "/api/app/inform/preview": {21.104663191415995, 22.311287968524443}, "/api/app/search/list": {16.43460478349782, 16.772572660528393}, "/api/app/tag/vid/list": {10.967752839372634, 13.369935046469067}, "/api/app/vid/user/count": {9.896102719033232, 3.4429093551189482}, "/api/app/tone/vid/list": {8.743154857326067, 9.65069066828318}, "/api/app/mine/collection": {6.536321436569823, 7.610521407156875}, "/api/app/vid/location/list": {5.338658762504632, 5.621848968877574}, "/api/app/code/exchange": {5.1810193321616875, 5.485312496520593}, "/api/app/mine/like": {4.867128098122042, 4.933705582783718}, "/api/app/mine/buyVid": {4.767059446038627, 4.724878728679717}, "/api/app/comment/list": {4.64976856062903, 5.359347112149345}, "/api/app/tag/related/list": {4.615384615384615, 6.7392728011548915}, "/api/app/wonder/vid/list": {4.315633958103638, 3.7338462032373845}, "/api/app/mine/txnact/zfb/get": {4, 0}, "/api/app/mine/qianbao": {3.4738025246411897, 3.1117706785490036}, "/api/app/mine/collect/infoList": {3.204887218045113, 1.020198360787845}, "/api/app/mine/wallet": {2.996144238079722, 2.586675640022099}, "/api/app/vip/vipTypeList": {2.968098724973117, 2.484641338810541}, "/api/app/vid/uploadDotStream": {2.918918918918919, 3.8222610385593505}, "/api/app/vid/hot/list": {2.875, 1.8850918886280925}, "/api/app/mine/mobileLogin": {2.726661392405063, 1.6229608705686391}, "/api/app/ads/click": {2.4444444444444446, 2.1481105849018385}, "/api/app/im/sign": {2.347451944568619, 0.8751527848778612}, "/api/app/mine/collect": {2.3469945355191255, 2.9005078540123854}, "/api/app/thumbsUp": {2.2889385712764825, 3.1431258095942107}, "/api/app/mine/rchg": {2.1419141914191417, 2.013939575838625}, "/api/app/tag/info": {2.1227564333597635, 2.5561450060499316}, "/api/app/mine/recharge": {2.0362889421431016, 1.6761985460556246}, "/api/app/search/wonder/list": {2, 1.3228756555322954}, "/api/app/mine/txnact/alipay/add": {2, 1.4142135623730951}, "/api/app/comment/send": {1.913767019667171, 2.5678041294299385}, "/api/app/mine/follow": {1.8853146853146854, 3.3834188159801752}, "/api/app/hotspot/hotvid/list": {1.865814696485623, 2.5320789429330213}, "/api/app/tag/group": {1.7860714285714285, 1.8002080767465662}, "/api/app/mine/rchgTypeList": {1.6759002770083102, 1.2730164933835963}, "/api/app/recommend/vid/list": {1.6304768202631077, 1.0233659536842432}, "/api/app/mine/rechargeTypeList": {1.5427667889853516, 1.1205787585984197}, "/api/app/vid/uploadStatic": {1.449820788530466, 0.9225822223810688}, "/api/app/search/index": {1.4444444444444444, 1.1823747080552576}, "/api/app/comment/info": {1.4204250907205807, 0.935701317800514}, "/api/app/follow/list": {1.3652118833265838, 0.7420120249349482}, "/api/app/follow/dynamics/list": {1.365148416167447, 0.741941284686654}, "/api/app/tag/list": {1.3538640846333154, 0.7232666995832582}, "/api/app/thumbsDown": {1.2926500337154416, 0.9039536361790543}, "/api/app/mine/txnact/alipay/get": {1.2666666666666666, 0.7037315505489967}, "/api/app/vip/history": {1.2410660205935797, 0.6937188863036616}, "/api/app/proxy/bindRecord": {1.2203389830508475, 0.8586970175032882}, "/api/app/vid/location/info": {1.1945846718678292, 0.6303093874119001}, "/api/app/mine/txnact/bank/get": {1.1666666666666667, 0.408248290463863}, "/api/app/vid/remove": {1.16, 0.4725815626252608}, "/api/app/product/buy": {1.1565881604073838, 0.6167973028410264}, "/api/app/mine/rchg/order": {1.1441048034934498, 0.45999876756469205}, "/api/app/mine/bills": {1.1328273244781784, 0.4869047253532734}, "/api/app/proxy/bind": {1.131694468832309, 0.5337846350555656}, "/api/app/proxy/info": {1.1218504750103264, 0.4259428578212287}, "/api/app/proxy/incomes": {1.1214876033057852, 0.42565643424200655}, "/api/app/hotspot/wonder/list": {1.1149991246498598, 0.37056247336640125}, "/api/app/hotspot/area": {1.1148807964369924, 0.37156235329843224}, "/api/app/mine/income/works": {1.1128472222222223, 0.39046222453941565}, "/api/app/hotspot/rank": {1.101991604894168, 0.3479544659830258}, "/api/app/vid/submit": {1.09478672985782, 0.35257059679988395}, "/api/app/tag/add/new": {1.0909090909090908, 0.29424494316824984}, "/api/app/hotspot/htag": {1.0888888888888888, 0.35548299425426816}, "/api/app/withdraw/type": {1.088, 0.3363945456195459}, "/api/app/rank/hotsearch/list": {1.0820793433652531, 0.3332596161826353}, "/api/app/inform/notice/list": {1.0557451649601821, 0.25750413145206313}, "/api/app/recommend/user/list": {1.0482115085536547, 0.24806240809464628}, "/api/app/follow/fans/list": {1.0432766615146831, 0.22529050210078802}, "/api/app/comment/reply/list": {1.0383064516129032, 0.19212883629499877}, "/api/app/like/record/list": {1.0357142857142858, 0.1857721136109739}, "/api/app/withdraw/order": {1, 0}, "/api/app/mine/txnact/yh/get": {1, 0}, "/api/app/mine/txnact/zfb/add": {1, 0}, "/api/app/mine/report/types/list": {1, 0}, "/api/app/mine/report": {1, 0}, } var qCountND = NDArg{ 18.87662, 3.6234249913154857, } // truthPR 分析路由请求数映射,返回用户真实度[0,100],得分越高用户越接近真实用户,反之越接近异常用户(score < 1) // 注意仅评价routersND中存在的router // @定义 用户真实度-用户是真实用户的概率 func truthPR(qCountMap map[string]int64, routersND map[string]NDArg) float64 { var scode float64 var count int for router, qCount := range qCountMap { ndArg, ok := routersND[router] if !ok { continue //仅评价routersND中存在的router } if _, ok = routers100DIC[router]; ok { //真实用户标志性的请求直接返回100分 return 100 } if ndArg.Sigma == 0 { continue //用户访问数不服从正态分布 } //用户访问数服从正态分布 scode += NormalDistributionPR(float64(qCount), ndArg.Mu, ndArg.Sigma) count++ } if count != 0 { scode = scode / float64(count) } qCountScode := NormalDistributionPR(float64(len(qCountMap)), qCountND.Mu, qCountND.Sigma) return scode*50 + qCountScode*50 } // NormalDistributionPR 通过积分获取标准正态分布概率(0,1) func NormalDistributionPR(a, μ, σ float64) float64 { code := 0.01 //概率得分 if σ == 0 { //方差为零 不评分 return 0 } z := (a - μ) / σ //标准正态分布Z分数 if z >= 3 { code += 0.01 } if z >= 2.5 { code += 0.49 } if z >= 2 { code += 1.66 } if z >= 1.5 { code += 4.4 } if z >= 1 { code += 9.19 } if z >= 0.5 { code += 14.98 } if z >= 0 { code += 19.15 } if z >= -0.5 { code += 19.15 } if z >= -1 { code += 14.98 } if z >= -1.5 { code += 9.19 } if z >= -2 { code += 4.4 } if z >= -2.5 { code += 1.66 } if z >= -3 { code += 0.49 } return code / 100 } // Score 返回出现该用户行为的概率 x 100,得分越高用户越接近真实用户,反之越接近异常用户,通常score < 1为异常用户 func Score(qCountMap map[string]int64) int64 { return int64(truthPR(qCountMap, routersND)) }