離散label的優化trick

2022-05-09 03:21:13 字數 2425 閱讀 5394

**

實現: rater_a = np.array(rater_a, dtype=int)

rater_b = np.array(rater_b, dtype=int)

assert(len(rater_a) ==len(rater_b))

if min_rating is

none:

min_rating =min(min(rater_a), min(rater_b))

if max_rating is

none:

max_rating =max(max(rater_a), max(rater_b))

conf_mat =confusion_matrix(rater_a, rater_b,

min_rating, max_rating)

#計算混淆矩陣

num_ratings =len(conf_mat)

num_scored_items =float(len(rater_a))

hist_rater_a =histogram(rater_a, min_rating, max_rating)

hist_rater_b =histogram(rater_b, min_rating, max_rating)

numerator = 0.0denominator = 0.0

for i in

range(num_ratings):

for j in

range(num_ratings):

expected_count = (hist_rater_a[i] *hist_rater_b[j]

/num_scored_items)

d = pow(i - j, 2.0) / pow(num_ratings - 1, 2.0)#

d是懲罰係數,以指數增加,當兩個label比如0-3/0-4就會懲罰指數增加

#如果i==j的話,那麼d=0

numerator += d * conf_mat[i][j] /num_scored_items

denominator += d * expected_count /num_scored_items

return 1.0 - numerator / denominator

對它的介紹:

也就是說,如果a和b完全一樣,那麼返回值為1,numerator 值為1;

那麼什麼情況下會返回-1呢?

嘗試了一下下面的例子:

from ml_metrics import

a=[1,0,1]

b=[0,1,0]

print

#輸出:

-0.7999999999999998

**完全相反居然不是-1??

我又把函式拿出來單獨做了運算,發現:

print

(conf_mat)

print

(hist_rater_a,hist_rater_b)

for i in

range(num_ratings):

for j in

range(num_ratings):

expected_count = (hist_rater_a[i] *hist_rater_b[j]

/num_scored_items)

d = pow(i - j, 2.0) / pow(num_ratings - 1, 2.0)

numerator += d * conf_mat[i][j] /num_scored_items

denominator += d * expected_count /num_scored_items

print

(expected_count,numerator,denominator)

return 1.0 - numerator /denominator

a=[1,0,1]

b=[0,1,0]

print

#輸出:

[[0, 1], [2, 0]]

[1, 2] [2, 1]

0.6666666666666666 0.0 0.0

0.3333333333333333 0.3333333333333333 0.1111111111111111

1.3333333333333333 1.0 0.5555555555555556

0.6666666666666666 1.0 0.5555555555555556

-0.7999999999999998

可以手動算一下,確實是這樣的。

與二次方的相比,只有d的計算方式不同:

d = abs(i - j) / float(num_ratings - 1)

這樣的話,它對不同的label沒有特別的懲罰,label之間如果誤判的話代價是相同的。

語法上的小trick

雖然不寫建構函式也是可以的,但是可能會開翻車,所以還是寫上吧。提供三種寫法 使用的時候只用 注意,這裡的a i gg 3,3,3 的 gg 不能打括號,否則就是強制轉換了。inline char nc inline int read read 函式返回的就是讀入資訊。對於乙個迭代器it,那麼它代表了...

c 的矩陣乘法加速trick

最近讀rnnlm的源 發現其實現矩陣乘法時使用了乙個trick,這裡描述一下這個trick。首先是正常版的矩陣乘法 其實是矩陣乘向量 void matrixxvector float destvect,float srcmatrix,intsrcmatrix rownum,intsrcmatrix ...

void 型指標的小小trick

指標的概念還是有很多tricks的,這裡的p如果宣告為int 型的指標,則 2 p sizeof int 則是p的位址加上sizeof int 個int型大小的位址增量 include typedef struct test int first int second mytype int main ...