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散度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF MVVM框架 漂亮界面风格的WP
- 下一篇: 5款 Linux 常用远程连接工具,总有