聚類精確度(Cluster Accuracy)

2021-10-05 09:49:33 字數 2641 閱讀 3264

聚類精確度(cluster accuracy,ac)用於比較獲得標籤和資料提供的真實標籤:

a c=

∑i=1

nδ(s

i,ma

p(ri

))

nac = \frac^\delta(s_i , map(r_i))}

ac=n∑i

=1n​

δ(si

​,ma

p(ri

​))​

其中:r

ir_i

ri​為聚類後的標籤。s

is_i

si​為真實標籤。n

nn為資料總的個數。δ

\delta

δ表示指示函式,具體如下:

δ (x

,y)=

1 & if x=y \\ 0 & otherwise \end

δ(x,y)

={10

​ifx

=yot

herw

ise​

而式中的map則表示最佳類標的重現分配,以確保統計的正確。一般的該最佳重分配可以通過匈牙利演算法(kuhn-munkres or hungarian algorithm)實現,從而在多項式時間內求解該任務(標籤)分配問題。

需要numpy和sklearn庫。利用sklearn呼叫匈牙利演算法

也可以直接呼叫scikit-learn庫中的函式來計算metrics.accuracy_score(y_true, y_pred)

import numpy as np

from sklearn import metrics

defacc

(y_true, y_pred)

:"""

calculate clustering accuracy. require scikit-learn installed

# arguments

y: true labels, numpy.array with shape `(n_samples,)`

y_pred: predicted labels, numpy.array with shape `(n_samples,)`

# return

accuracy, in [0,1]

"""y_true = y_true.astype(np.int64)

assert y_pred.size == y_true.size

d =max(y_pred.

max(

), y_true.

max())

+1w = np.zeros(

(d, d)

, dtype=np.int64)

for i in

range

(y_pred.size)

: w[y_pred[i]

, y_true[i]]+=

1from sklearn.utils.linear_assignment_ import linear_assignment

ind = linear_assignment(w.

max(

)- w)

return

sum(

[w[i, j]

for i, j in ind])*

1.0/ y_pred.size

if __name__ ==

'__main__'

:# a為真實值、b,c,d為等效果的**值 即: func(a,b)=func(a,c); func(b,d)=func(c,d);

a = np.array([1

,1,1

,1,1

,1,2

,2,2

,2,2

,2,3

,3,3

,3,3

])b = np.array([1

,2,1

,1,1

,1,1

,2,2

,2,2

,3,1

,1,3

,3,3

])c = np.array([2

,1,2

,2,2

,2,2

,1,1

,1,1

,3,2

,2,3

,3,3

])# 將b中的 1 與 2 互換

d = np.array([1

,3,1

,1,1

,1,1

,3,3

,3,3

,2,1

,1,2

,2,2

])# 將b中的 2 與 3 互換

# 測試

print

(acc(a, b)

)# 0.7058823529411765

print

(acc(a, c)

)# 0.7058823529411765

print

(metrics.accuracy_score(a, b)

)# 0.7058823529411765

print

(acc(b, d)

)# 1.0

print

(acc(c, d)

)# 1.0

BC高精確度函式使用。

bc是binary calculator的縮寫。bc 函式的引數都是運算元加上乙個可選的 int scale 比如string bcadd string left operand,string right operand int scale 如果scale沒有提供,就用bcscale的預設值。這裡大...

關於C timer 時間精確度的問題

我想用精確的時間計算,需要精確到毫秒級別,執行後發下有誤差。請教高人怎麼實現。c code?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 staticsystem.diagnostics.stopwatch stw newsystem.d...

精確度,召回率,真陽性,假陽性

已知如圖 金標準 標準集 演算法 集 驗證存在 t 驗證不存在 f 合計 存在 p 為正,真實為正 tp 為正,真實為負 fp p 為正樣本 不存在 n 為負,真實為正 fn 為負,真實為負 tn n 為負樣本 合計t 驗證為正樣本 f 驗證為負樣本 所有樣本數 p n或者t f 簡化後 標準集測試...