日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python计算矩阵的散度_数据集相似度度量之KLJS散度

發布時間:2023/12/14 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python计算矩阵的散度_数据集相似度度量之KLJS散度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原標題:數據集相似度度量之KL&JS散度

一、KL散度

1、什么是KL散度

KL散度又叫相對熵,是描述兩個概率分布差異的一種方法,有人將KL散度稱為KL距離,但實際上它不滿足距離概念中的兩個條件,a、對稱性,即D(P||Q)=D(Q||P); b、三角不等式;

2、有什么樣的作用

模型效果好不好,在數據劃分上大有講究,如果訓練集與測試集數據分布不滿足同分布,模型表現必然不會太好,因此劃分數據集之后對于兩個數據分布驗證變得非常重要,針對分類任務驗證概率質量相似度,針對回歸問題驗證兩者的概率密度相似度,兩者分布越相似,相對熵越接近于0;

3、實現方式

a、離散性標簽,各標簽概率及相應對數求和操作

b、連續型標簽,針對x的無個數區間概率及對數積分操作

fromsklearn importdatasets

fromcollections importCounter

importnumpy asnp

random_state= 32

defgetData(n_classes ,weights ,n_features ,n_samples):

train ,label=datasets.make_classification( n_classes=n_classes ,class_sep= 2,weights=weights ,n_features=n_features ,n_samples=n_samples ,random_state=random_state)

returntrain ,label

defcomputePdotLnP(p ,q ,I= True):

ifI:

returnp*np.log(p/q)

else:

returnp*np.log(p/q)* 0.01

defcomputeKL(train_label:np.array ,test_label:np.array):

KlValue= 0.0

n_train_label=Counter(train_label)

n_test_label=Counter(test_label)

forkey ,value inn_train_label.items():

p=value/train_label.shape[ 0]

q=n_test_label[key]/test_label.shape[ 0]

KlValue+=computePdotLnP(p ,q ,True)

returnKlValue

defcomputeSplitValue(label ,splitValue):

maxValue = np.max(label) + 0.1

minValue = np.min(label)

splitvalue = [i fori innp.arange(minValue ,maxValue ,splitValue)]

returnsplitvalue

defdataDiscretization(train_label ,label:np.array ,splitValue):

splitvalue=computeSplitValue(train_label ,splitValue)

splitDict={}

forrow inlabel:

fori inrange( len(splitvalue)- 1):

ifrow>=splitvalue[i] androw

ifsplitvalue[i] insplitDict:

splitDict[splitvalue[i]]+= 1

else:

splitDict[splitvalue[i]]= 1

returnsplitDict

defcomputeK_L(train_label:np.array ,test_label:np.array):

n_train_label=dataDiscretization(train_label ,train_label ,0.01)

n_test_label=dataDiscretization(train_label ,test_label ,0.01)

KlValue= 0.0

forkey ,value inn_train_label.items():

try:

p=value/train_label.shape[ 0]

q = n_test_label[key] / test_label.shape[ 0]

KlValue += np.abs(computePdotLnP(p ,q ,False))

except:

pass

return KlValue

train ,label_train=getData( n_classes= 2,weights=[ 0.1,0.9] ,n_features= 10,n_samples= 3000)

test ,label_test=getData( n_classes= 2,weights=[ 0.6,0.4] ,n_features= 10,n_samples= 3000)

print( "分類標簽的KL散度",computeKL(label_train ,label_test))

label_train_value=np.random.rand( 100)

label_test_value=np.random.rand( 100)

print( "連續標簽的KL散度",computeK_L(label_train_value ,label_test_value))

二、JS散度

1、JS散度與KL散度

之前有寫過KL散度,KL散度由于不符合距離中的對稱性,所以在KL散度的基礎上進行了改進,形成了JS散度,

KL散度計算公式:KL(P||Q)=sum(P(i)*log(P(i)/Q(i))

JS散度計算公式:JS(P||Q)=0.5*KL(P||(P+Q)/2)+0.5*KL(Q||(P+Q))

2、Python實現(離散變量)

fromsklearn importdatasets

fromcollections importCounter

importnumpy asnp

random_state= 32

defgetData(n_classes ,weights ,n_features ,n_samples):

train ,label=datasets.make_classification( n_classes=n_classes ,class_sep= 2,weights=weights ,n_features=n_features ,n_samples=n_samples ,random_state=random_state)

returntrain ,label

defcomputePdotLnP(p ,m ,I= True):

ifI:

returnp*np.log(p/m)

else:

returnp*np.log(p/m)

defcomputeJS(train_label:np.array ,test_label:np.array):

KlValue= 0.0

n_train_label=Counter(train_label)

n_test_label=Counter(test_label)

forkey ,value inn_train_label.items():

p=value/train_label.shape[ 0]

q=n_test_label[key]/test_label.shape[ 0]

m=(p+q)/ 2

KlValue+= 0.5*computePdotLnP(p ,m ,True)+ 0.5*computePdotLnP(q ,m ,True)

returnKlValue

train ,label_train=getData( n_classes= 2,weights=[ 0.6,0.4] ,n_features= 10,n_samples= 3000)

test ,label_test=getData( n_classes= 2,weights=[ 0.6,0.4] ,n_features= 10,n_samples= 3000)

print( "分類標簽的JS散度",computeJS(label_train ,label_test))

由于水平有限,請參照指正~返回搜狐,查看更多

責任編輯:

總結

以上是生活随笔為你收集整理的python计算矩阵的散度_数据集相似度度量之KLJS散度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。