使用Python計算數(shù)據(jù)集中不同維度下的方差和 JS 散度

在數(shù)據(jù)挖掘領域中,我們經(jīng)常需要衡量不同維度之間的差異或相似度。為了實現(xiàn)這一目標,通常需要使用各種方法來計算兩個樣本之間的差異。例如,KS 檢驗和相對熵等方法可以用于連續(xù)變量的比較。

本文將介紹如何使用 Python 和 Pandas 庫來計算數(shù)據(jù)集中不同維度下的方差和 JS 散度,以評估各維度變化的波動大小。

代碼實現(xiàn):

首先,定義一個函數(shù) JS_divergence() 來計算兩個分布之間的 JS 散度:

import scipy.stats as ss

def JS_divergence(p, q, base):
    M = (p+q)/2
    return 0.5 * ss.entropy(p, M, base=base) + 0.5 * ss.entropy(q, M, base=base)

接下來,定義一個函數(shù) compute_metrics() 來計算指定維度下的方差和 JS 散度:

import pandas as pd
import numpy as np

def compute_metrics(df, dim):
    var = np.var(df.query(f"dimension == '{dim}'")['pred'] - df.query(f"dimension == '{dim}'")['actual'])
    js_div = JS_divergence(df.query(f"dimension == '{dim}'")['pred'], df.query(f"dimension == '{dim}'")['actual'], 2)
    
    return [var, js_div]

然后,我們將數(shù)據(jù)存儲在一個 Pandas 數(shù)據(jù)框中,并使用上述函數(shù) compute_metrics() 對每個維度計算方差和 JS 散度:

lists = [['分發(fā)模塊','精選', 100000,85000]
        ,['分發(fā)模塊','關注', 20000,10000]
        ,['分發(fā)模塊','發(fā)現(xiàn)', 1000,1500]
        ,['用戶分類','兒童', 2000,2000]
        ,['用戶分類','青年', 30000,19500]
        ,['用戶分類','中年', 69000,50000]
        ,['用戶分類','老年', 20000,25000]
      ]

df = pd.DataFrame(lists, columns=['dimension', 'indicator', 'pred', 'actual'])

# 計算方差和 JS 散度
metrics = {}
for dim in df['dimension'].unique():
    metrics[dim] = compute_metrics(df, dim)

print(pd.DataFrame(metrics, index=['Var', 'JS_Div']))

最后,我們得到了各維度下的方差和 JS 散度指標。

總結:

本文介紹了如何使用 Python 和 Pandas 庫計算數(shù)據(jù)集中不同維度下的方差和 JS 散度。這些指標可以用于評估各維度變化的波動大小,從而實現(xiàn)異常維度挖掘和數(shù)據(jù)分析等目的。希望對大家有啟發(fā)!

本文由mdnice多平臺發(fā)布

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容