在選擇電影時,若是熱門電影A有 10000
人觀衆打分,冷門電影B有 100
我的打分,他們的豆瓣評分都是 8.0
分,怎麼比較兩部電影的好壞?平時咱們都有一種感受,不少人去評價,這個東西就更可信,只有一兩我的說好,多是託,那麼感受上是電影A更好。app
再例如《漫威》系列電影中,距離《復仇者聯盟4》上映一週,豆瓣分都是 8.1
分的《鋼鐵俠》和《復仇者聯盟3》,《鋼鐵俠》有 353695
人評價打分,《復仇者聯盟3》有 557491
人評價打分,這兩部電影是否同樣好看?機器學習
截止至 2019/4/27
,漫威系列 21
部電影按照豆瓣評分以下排序:函數
排名第一的是預售票房破7億《復仇者聯盟4》,準確來講這還不是 很嚴謹 的對比。一個合理的思路是,若是要比較兩部電影的好壞,至少應該請一樣多的觀衆觀看和評分。既然《鋼鐵俠》的觀衆人數偏少,那麼應該設法爲它 「增長」 一些觀衆。學習
貝葉斯平均(Bayesian Model Averaging) 是動態建模中融合集合預報信息的統計後處理方法。通俗來說就是:大數據
可以在不知道結果的狀況下,會本身先估計一個值,而後不斷用新的信息修正,使得它愈來愈接近自身正確的值。spa
貝葉斯平均值公式以下:3d
\[ WR = \frac{v}{v+m}R+\frac{m}{v+m}C=\frac{vR+mC}{v+m} \]code
- WR, 加權得分(weighted rating) - R, 對象現有平均得分。 - v, 參與爲這個對象打分的人數。 - m, 全局平均每一個對象的評分人數。 - C, 全局平均每一個對象的平均得分。
合理驗證《漫威》系列電影的好評排序,按照《漫威》電影時間線獲取每一步電影的:電影名、打分的人數、每一個星級的佔比:htm
根據公式獲取每一個電影的平均得分 R
、m
、 C
,計算公式爲:對象
\[ R = average\_stars = \frac{rating\_people*start5*5+rating\_people*start4*4+rating\_people*start3*3+rating\_people*start2*2+rating\_people*start1*1}{rating\_people} \]
\[ m = average(rating\_people) , C = average(average\_stars) \]
獲得最新的 貝葉斯平均排序(rank_bayes) 結果以下所示,和原有的 豆瓣評分排序(rank_stars) 對好比下:
8.1
分的《鋼鐵俠》和《復仇者聯盟3》,《復仇者聯盟3》的 貝葉斯平均得分
比 《鋼鐵俠》好,《復仇者聯盟3》比《鋼鐵俠》好看!《復仇者聯盟4》>《復仇者聯盟3》>《復仇者聯盟》>《鋼鐵俠》>《銀河護衛隊》>《銀河護衛隊2》>《美國隊長2》>《美國隊長3》>《鋼鐵俠3》>《蟻人》>《鋼鐵俠2》>《雷神2》>《雷神3》>《蜘蛛俠:英雄歸來》>《復仇者聯盟2》>《蟻人2》>《無敵浩克》>《雷神》>《驚奇隊長》>《美國隊長》>《奇異博士》>《黑豹》
彩蛋:豆瓣分除以2就是每一個電影的平均得分 R
# 計算對象現有平均分 def average_stars_apply(rating_people,start5,start4,start3,start2,start1): average_stars = (rating_people*start5*5+rating_people*start4*4+rating_people*start3*3+rating_people*start2*2+rating_people*start1*1)/rating_people return round(average_stars,2) # 計算貝葉斯平均 def bayes_score_apply(R,v,m,C): return (v*R+m*C)/(v+m) # 主函數 def bayes_score(dataFrame): df = dataFrame.copy() df["average_stars"] = dataFrame.apply(lambda row: average_stars_apply(row['rating_people'], row['start5'],row['start4'], row['start3'],row['start2'],row['start1']), axis=1) m = df.mean().rating_people C = df.mean().average_stars df["bayes_score"] = df.apply(lambda row: bayes_score_apply(row['average_stars'], row['rating_people'], m, C), axis=1) return df
計算結果:
在 淘寶天貓 的商品評價下,有對某家店鋪的評價等級,在用戶購買量不對等,可是評分卻同樣的狀況下,計算競品 商品 、店鋪 在用戶眼裏的排序:
他們的店鋪評分同樣都是 4.8
分,店鋪A的評價人數是 450787
,店鋪B的評價人數是 198491
,感受店鋪A評價人多一點感受可信一些 ,那麼有以下條件:
\[ R_A=\frac{450787*0.8984*5+450787*0.0536*4+450787*0.0248*3+450787*0.0058*2+450787*0.0174*1}{450787}=4.8098 , v_A=450787 \]
\[ R_B=\frac{198491*0.9240*5+198491*0.0366*4+198491*0.0172*3+198491*0.0051*2+198491*0.0171*1}{198491}=4.8453 , v_B=198491 \]
\[ m=\frac{450787 +198491}{2}=324639 , C=\frac{4.8098+4.8453}{2}=4.82755 \]
將上述數值帶入公式計算獲得:
\[ WR =\frac{vR+mC}{v+m} \]
\[ WR_A = \frac{v_A*R_A+m*C}{v_A+m} = \frac{450787 *4.8098 +324639 *4.82755}{450787 +324639 }=4.81723119556218 \]
\[ WR_B = \frac{v_B*R_B+m*C}{v_B+m} = \frac{198491 *4.8453 +324639 *4.82755}{198491 +324639 }=4.83428487517443 \]
實時證實:店鋪B優於店鋪A ,店鋪B雖然評價的人數少,可是好評上仍是比店鋪A多,總體比店鋪A好
假設:電影A有10個觀衆評分,5個爲五星,5個爲一星;電影B也有10個觀衆評分,都給了三星,這兩部電影在貝葉斯分數是同樣的,即:
\[ R_A=\frac{5*5+5*1}{10}=3 , R_B=\frac{10*3}{10}=3 , m=\frac{10+10}{2}=10, C=\frac{3+3}{2}=3 \]
\[ WR_A = \frac{v_A*R_A+m*C}{v_A+m} = \frac{10*3+10*3}{10+10}=3 \]
\[ WR_B = \frac{v_B*R_B+m*C}{v_B+m} = \frac{10*3+10*3}{10+10}=3 \]
計算結果徹底同樣!
豆瓣評分主要是依據平均分所得,當在評價人數不一樣可是豆瓣分同樣的狀況下,就可使用貝葉斯評分繼續判別電影的好壞
關注公衆號【機器學習和大數據挖掘】,回覆【漫威】便可下載原始數據和代碼