**
實現: 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 importa=[1,0,1]
b=[0,1,0]
#輸出:
-0.7999999999999998
**完全相反居然不是-1??
我又把函式拿出來單獨做了運算,發現:
(conf_mat)
(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
(expected_count,numerator,denominator)
return 1.0 - numerator /denominator
a=[1,0,1]
b=[0,1,0]
#輸出:
[[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 ...