\({\boldsymbol{{C}}}_{\tilde{y}=i} ≔|{\boldsymbol{{X}}}_{\tilde{y}=i}|.\)
Độ tự tin trung bình của mô hình \({{\boldsymbol{{\phi}}}}\) đối với lớp \(i\in M\) là
\[\begin{equation}
- {\boldsymbol{{t}}}_i = \frac{ \sum_{{\boldsymbol{{x}}}\in{\boldsymbol{{X}}}_{\tilde{y}=i}}{p}_{{\boldsymbol{{\phi}}}}(\tilde{y}=i; {\boldsymbol{{x}}})}{{\boldsymbol{{C}}}_{\tilde{y}=i}}.
-\tag{1}
+ {\boldsymbol{{t}}}_i = \frac{1}{{\boldsymbol{{C}}}_{\tilde{y}=i}}
+ {\sum\limits_{{\boldsymbol{{x}}}\in{\boldsymbol{{X}}}_{\tilde{y}=i}}p_{\tilde{y}={i}}({{\boldsymbol{{x}}}})}.
+\tag{2}
\end{equation}\]
+Vì phép tính trung bình được thực hiện trên từng tập
+\({\boldsymbol{{X}}}_{\tilde{y}=i}\)
+nên có thể \(\sum\limits_{i\in M}{{\boldsymbol{{t}}}_i} \neq 1.\)
Với mỗi lớp \(i\in M\) ta chọn chỉ tiêu tự tin \({\boldsymbol{{t}}}_i\in(0,1)\)
-bằng độ tự tin trung bình (1).
+bằng độ tự tin trung bình (2).
Đối với từng mẫu \({\boldsymbol{{x}}}\) và từng nhãn \(i\), giá trị xác suất dự đoán
-\({p}_{{\boldsymbol{{\phi}}}}(\tilde{y}=i; {\boldsymbol{{x}}})\) đưa ra bởi mô hình \({{\boldsymbol{{\phi}}}}\),
+\(p_{\tilde{y}={i}}({{\boldsymbol{{x}}}})\) đưa ra bởi mô hình \({{\boldsymbol{{\phi}}}}\),
nếu không nhỏ hơn chỉ tiêu \({\boldsymbol{{t}}}_i\) thì ta cho rằng nhãn \(i\) có khả năng đúng với mẫu \({\boldsymbol{{x}}}\).
Tập hợp nhãn khả dĩ đối với mẫu \({\boldsymbol{{x}}}\) là
\[\begin{equation}
-L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})≔\left\{l\in M: {p}_{{\boldsymbol{{\phi}}}}(\tilde{y}=l;{\boldsymbol{{x}}})\geq {\boldsymbol{{t}}}_l\right\}
-\tag{2}
+L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})≔\left\{i\in M: p_{\tilde{y}={i}}({{\boldsymbol{{x}}}})\geq {\boldsymbol{{t}}}_i\right\}
+\tag{3}
\end{equation}\]
-Nếu \(L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})\neq\emptyset\) thì ta chọn một nhãn có xác suất dự đoán lớn nhất:
+
Với giả định xác suất (1)
+và chỉ tiêu tự tin (2),
+ta kỳ vọng \(L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})\neq\emptyset.\)
+Từ đó chọn một nhãn có xác suất dự đoán lớn nhất:
\[\begin{equation}
\hat{l}_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})≔
\begin{cases}
-\mathop{\rm arg max} \limits_{l\in L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})} {p}_{{\boldsymbol{{\phi}}}}(\tilde{y}=l;{\boldsymbol{{x}}}), & \text{không xét chỉ tiêu}\\
-\mathop{\rm arg max} \limits_{l\in L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})} \{{p}_{{\boldsymbol{{\phi}}}}(\tilde{y}=l;{\boldsymbol{{x}}}) - {\boldsymbol{{t}}}_l\}, & \text{có bù trừ chỉ tiêu}
+\mathop{\rm arg max} \limits_{i\in L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})} p_{\tilde{y}={i}}({{\boldsymbol{{x}}}}), & \text{không xét chỉ tiêu}\\
+\mathop{\rm arg max} \limits_{i\in L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})} \{p_{\tilde{y}={i}}({{\boldsymbol{{x}}}}) - {\boldsymbol{{t}}}_i\}, & \text{có bù trừ chỉ tiêu}
\end{cases}
-\tag{3}
+\tag{4}
\end{equation}\]
-để làm nhãn “đáng tin nhất” cho mẫu \({\boldsymbol{{x}}}.\)
-Ngược lại, nếu
-\({{\boldsymbol{{\phi}}}}\) dự đoán không có nhãn nào phù hợp với mẫu \({\boldsymbol{{x}}}\)
-thì \(L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})\equiv\emptyset.\)
+để làm nhãn “đáng tin nhất” cho mẫu \({\boldsymbol{{x}}}.\)
Xếp hạng khả nghi
-
Gọi \(\dot{{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j}\) là tập (bất khả tri) các mẫu có nhãn quan sát là \(i\) và nhãn thật là \(j\), ta ước lượng nó bằng cách dùng các nhãn đáng tin nhất \(\hat{l}_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})\) tại (3):
+
Gọi \(\dot{{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j}\) là tập (bất khả tri) các mẫu có nhãn quan sát là \(i\) và nhãn thật là \(j\), ta ước lượng nó bằng cách dùng các nhãn đáng tin nhất \(\hat{l}_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})\) tại (4):
\[\begin{equation}
{{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j} ≔
\left\{{\boldsymbol{{x}}}\in{\boldsymbol{{X}}}_{\tilde{y}=i}:
\hat{l}_{{{\boldsymbol{{\phi}}}}({\boldsymbol{{x}}}),{\boldsymbol{{t}}}} \equiv j
\right\}
-\tag{4}
+\tag{5}
\end{equation}\]
Đơn thuần (mà lại hiệu quả) nhất, ta nghi ngờ
các mẫu \(\left\{{\boldsymbol{{x}}}\in{{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j}: i\neq j\right\}\)
@@ -173,18 +185,18 @@
diff --git a/index.Rmd b/index.Rmd
index 1e43a04..af2120c 100644
--- a/index.Rmd
+++ b/index.Rmd
@@ -23,7 +23,9 @@ output:
\newcommand{\C}{{\vect{C}}}
\newcommand{\Ccheck}{\check{\vect{C}}}
\newcommand{\pt}{\dot{p}}
-\newcommand{\pc}{{p}}
+\newcommand{\pc}{p}
+\newcommand{\pyix}[2]{\pc_{\yo={#1}}({#2})}
+\newcommand{\pyx}[1]{\pyix{i}{#1}}
\newcommand{\ec}{{e}}
\newcommand{\Qt}{\dot{\vect{Q}}}
\newcommand{\Qc}{\vect{Q}}
@@ -69,7 +71,7 @@ Ví dụ khi phân loại 3 loài vật là chó, mèo và chuột, thì xác su
## Ví dụ cụ thể
-Xem ví dụ với [dữ liệu cụ thể ](lapros.pdf) tại [đây](lapros.pdf).
+Xem ví dụ với [dữ liệu cụ thể tại đây](lapros.jl.html).
## Ma trận nhiễu theo lớp
@@ -94,7 +96,17 @@ là xác suất mô hình $\model$ đưa ra đối với mẫu $\vect{x}$, dự
**Đầu vào**
1. Các nhãn $\yo_k$ đã quan sát được đối với các mẫu $\x_k\in\X$
-2. Xác suất $\pc(\yo=i; \vect{x}_k\in\vect{X})$ mà mô hình $\model$ dự đoán mẫu $\x_k\in\X$ có nhãn $i\in M$
+2. Xác suất $\pyx{\x_k}$ mà mô hình $\model$ dự đoán mẫu $\x_k\in\X$ có nhãn $i\in M$
+
+Mặc nhiên
+
+\begin{equation}
+\begin{cases}
+\pyx{\x} \geq 0 & \quad\forall i\in M, \forall\x\in\X \\
+\sum\limits_{i\in M}{\pyx{\x}} \equiv 1 & \quad\forall \x\in\X
+\end{cases}
+(\#eq:probasum1)
+\end{equation}
**Các bước**
@@ -112,14 +124,19 @@ $\vect{C}_{\yo=i} \defined |\X_{\yo=i}|.$
Độ tự tin trung bình của mô hình $\model$ đối với lớp $i\in M$ là
\begin{equation}
- \thres_i = \frac{ \sum_{\x\in\X_{\yo=i}}\pc_\model(\yo=i; \vect{x})}{\vect{C}_{\yo=i}}.
+ \thres_i = \frac{1}{\vect{C}_{\yo=i}}
+ {\sum\limits_{\x\in\X_{\yo=i}}\pyx{\x}}.
(\#eq:avgconfidence)
\end{equation}
+Vì phép tính trung bình được thực hiện trên từng tập
+$\X_{\yo=i}$
+nên có thể $\sum\limits_{i\in M}{\thres_i} \neq 1.$
+
Với mỗi lớp $i\in M$ ta chọn chỉ tiêu tự tin $\thres_i\in(0,1)$
bằng độ tự tin trung bình \@ref(eq:avgconfidence).
Đối với từng mẫu $\x$ và từng nhãn $i$, giá trị xác suất dự đoán
-$\pc_\model(\yo=i; \vect{x})$ đưa ra bởi mô hình $\model$,
+$\pyx{\x}$ đưa ra bởi mô hình $\model$,
nếu không nhỏ hơn chỉ tiêu $\thres_i$ thì ta cho rằng nhãn $i$ có khả năng đúng với mẫu $\x$.
Tập hợp nhãn khả dĩ đối với mẫu $\x$ là
@@ -127,24 +144,25 @@ Tập hợp nhãn khả dĩ đối với mẫu $\x$ là
\newcommand{\lmtx}{\hat{l}_{\model,\thres}(\x)}
\begin{equation}
-\Lmtx \defined \left\{l\in M: \pc_\model(\yo=l;\x)\geq \thres_l\right\}
+\Lmtx \defined \left\{i\in M: \pyx{\x}\geq \thres_i\right\}
(\#eq:eq2)
\end{equation}
-Nếu $\Lmtx\neq\emptyset$ thì ta chọn một nhãn có xác suất dự đoán lớn nhất:
+Với giả định xác suất \@ref(eq:probasum1)
+và chỉ tiêu tự tin \@ref(eq:avgconfidence),
+ta kỳ vọng $\Lmtx\neq\emptyset.$
+Từ đó chọn một nhãn có xác suất dự đoán lớn nhất:
\begin{equation}
\lmtx \defined
\begin{cases}
-\mathop{\rm arg max} \limits_{l\in \Lmtx} \pc_\model(\yo=l;\x), & \text{không xét chỉ tiêu}\\
-\mathop{\rm arg max} \limits_{l\in \Lmtx} \{\pc_\model(\yo=l;\x) - \thres_l\}, & \text{có bù trừ chỉ tiêu}
+\mathop{\rm arg max} \limits_{i\in \Lmtx} \pyx{\x}, & \text{không xét chỉ tiêu}\\
+\mathop{\rm arg max} \limits_{i\in \Lmtx} \{\pyx{\x} - \thres_i\}, & \text{có bù trừ chỉ tiêu}
\end{cases}
(\#eq:lmtx)
\end{equation}
để làm nhãn "đáng tin nhất" cho mẫu $\x.$
-Ngược lại, nếu
-$\model$ dự đoán không có nhãn nào phù hợp với mẫu $\x$
-thì $\Lmtx\equiv\emptyset.$
+
## Xếp hạng khả nghi
@@ -166,16 +184,16 @@ là có nhãn lỗi.
Xếp hạng mức độ khả nghi của các mẫu đó
dựa theo xác suất do mô hình $\model$ dự đoán:
\begin{equation}
-\ec({\x}) \defined \max_{j\neq i}{\pc(\yo=j; \x)}
--\pc(\yo=i; \x)\quad \forall \x\in\X_{\yo=i}
+\ec({\x}) \defined \max_{j\neq i}{\pyix{j}{\x}}
+-\pyx{\x}\quad \forall \x\in\X_{\yo=i}
(\#eq:errnoise)
\end{equation}
theo cách làm trong CleanLab của Curtis et al.’s (2021), và đảo dấu so với Wei et al.’s (2018).
Ta cũng có thể bù trừ chỉ tiêu tự tin vào để tính độ khả nghi:
\begin{equation}
e_\thres(\x) \defined
-\max_{j\neq i}{(\pc(\yo=j; \x)-\thres_j)}
--(\pc(\yo=i; \x) - \thres_i)
+\max_{j\neq i}{\{\pyix{j}{\x}-\thres_j\}}
+-\{\pyx{\x} - \thres_i\}
\quad \forall \x\in\X_{\yo=i}.
(\#eq:eq4)
\end{equation}
@@ -195,14 +213,14 @@ ví dụ $\C_{\yo=3,\yt=1} = 10$ có nghĩa là, đếm được
Vì \@ref(eq:eq3b) ước lượng
$\Xc_{\yo=i,\yt=j}\approx\Xt_{\yo=i,\yt=j}$ cho nên
-$\sum_{j\in M}\C_{\yo=i,\yt=j}
+$\sum\limits_{j\in M}\C_{\yo=i,\yt=j}
\approx \vect{C}_{\yo=i}.$
Hiệu chỉnh ma trận đếm cặp nhãn qua hai bước.
Bước đầu, hiệu chỉnh từng dòng theo số mẫu của từng lớp đã quan sát $i\in M,$
\begin{equation}
-\check{Q}_{\yo=i,\yt=j} = \frac{\C_{\yo=i,\yt=j}}{\sum_{j\in M}\C_{\yo=i,\yt=j}}
+\check{Q}_{\yo=i,\yt=j} = \frac{\C_{\yo=i,\yt=j}}{\sum\limits_{j\in M}\C_{\yo=i,\yt=j}}
{\vect{C}_{\yo=i}}.
(\#eq:eq6a)
\end{equation}
@@ -210,7 +228,7 @@ Bước đầu, hiệu chỉnh từng dòng theo số mẫu của từng lớp
Cuối cùng, ta chia đều toàn bộ để tổng ma trận trở thành $1.$
\begin{equation}
-\Qc_{\yo=i,\yt=j}=\frac{\check{Q}_{\yo=i,\yt=j}}{\sum_{i\in M,j\in M}\check{Q}_{\yo=i,\yt=j}}.
+\Qc_{\yo=i,\yt=j}=\frac{\check{Q}_{\yo=i,\yt=j}}{\sum\limits_{i,j\in M}\check{Q}_{\yo=i,\yt=j}}.
(\#eq:eq6b)
\end{equation}
diff --git a/lapros.jl b/lapros.jl
index 9560321..28f3333 100644
--- a/lapros.jl
+++ b/lapros.jl
@@ -9,14 +9,16 @@ begin
using Chain
using DataFrames
using DataStructures
+ import Random
+ using SparseArrays: spzeros
using StatsBase: sample
-end
+ using Statistics: mean
-# ╔═╡ 29cd589c-b3e9-4a65-9641-352129a27c1e
-# using PlutoUI; TableOfContents()
+ Random.seed!(333)
+end;
# ╔═╡ 34e904a0-5909-4cdd-a025-068dbb1a6cd1
-n = 8 # number of samples
+n = 10^7 # number of samples
# ╔═╡ 9cb3568a-9b59-438e-9ca0-c10c93247d92
md"""
@@ -27,7 +29,8 @@ Lấy ví dụ cụ thể
đối với $n mẫu dữ liệu
ta có các phân lớp,
nhãn quan sát và xác suất dự đoán
-như sau.
+như sau.
+Đặt mục tiêu viết thuật toán tìm nhãn lỗi chạy trong vòng 1 giây.
"""
# ╔═╡ dc3a9ad9-6a90-437b-9893-d59788b8bafb
@@ -45,6 +48,33 @@ p̂ = @chain rand(Float64, (n, m)) begin
# _[:, 2:end]
end
+# ╔═╡ bbb3b95f-e45f-46b6-b6e6-b41b2b283ab2
+@assert all(sum(p̂, dims=2) .≈ 1)
+
+# ╔═╡ 1a048638-4eda-4d6c-9009-6717a330aeb6
+md"""
+
+## TLDR
+
+Xếp hạng độ khả nghi của các nhãn là như sau.
+"""
+
+# ╔═╡ 1dbe808e-85e0-4052-b6ac-90fa86300ba7
+md"""
+Nếu không chỉ đỉnh `classes` thì dùng mặc định là các giá trị unique của `observed`.
+"""
+
+# ╔═╡ a6a56ac9-6849-49f9-bbce-4222cf663c80
+function lapros(
+ p::Array{Float64,2},
+ y::Array{Int64,1},
+)
+ M::Array{Int64,1} = unique(y)
+ M = sort(M)
+ # @show M
+ lapros(p, y, M)
+end
+
# ╔═╡ faa8ebef-ff1a-486d-926f-3ab1a782eaf1
md"""
@@ -53,11 +83,17 @@ md"""
Tập hợp mẫu quan sát được cho từng lớp là
"""
+# ╔═╡ 95d29260-af27-48ca-a3a7-120575b318a4
+Xỹ = [(1:n)[ỹ .== i] for i ∈ M]
+
# ╔═╡ 0327985e-859f-4c0e-a232-856aa31b0c44
md"""
Ta đếm được số lượng mẫu quan sát được cho từng lớp là
"""
+# ╔═╡ 846072fc-2269-4fbe-89d4-270b71cf5339
+C = [sum(ỹ .== i) for i ∈ M]
+
# ╔═╡ 68fef702-a604-4f03-87da-09984af59898
md"""
@@ -80,16 +116,54 @@ md"""
Ta có các tập nhãn khả tín như sau.
"""
+# ╔═╡ f8cbcd15-d2d0-4945-a80b-0e0e615d22e5
+# Lᵩ = [M[t2p_positive[i, :]] for i in 1:n]
+
# ╔═╡ 5be2ee06-178d-42ec-97b2-b51dbe189633
md"""
Danh sách nhãn đáng tin nhất đối với từng mẫu là như sau, trong đó $0$ đánh dấu trường hợp không có nhãn phù hợp.
"""
+# ╔═╡ 591f5a84-b437-4b59-9961-bc110e34eeae
+"Find the most likely labels for each sample.
+
+## Params:
+
+- mask_negative: For some specific sample, if the normalized probabilities are all negative then we use 0 to mark that there is no likely class label for the sample."
+function find_likely_label(t2p::Array{Float64,2}, mask_negative::Bool=false)
+ am = argmax(t2p, dims=2)[:]
+ likely_labels = last.(Tuple.(am))
+ if mask_negative
+ ifelse.(any(t2p .≥ 0, dims=2)[:], likely_labels, 0)
+ else
+ likely_labels
+ end
+end
+
# ╔═╡ 451f8698-2c6c-4cf1-8e1a-ede8cc1c535b
md"""
Xếp các mẫu vào ma trận có hàng thể hiện nhãn đã quan sát $\tilde{y}$, còn cột thể hiện nhãn đáng tin nhất $\hat{l}.$
"""
+# ╔═╡ 45b1feb2-45d3-46df-973a-8b95a70ea164
+# Xỹẏ = partition_X(l̂, ỹ, M)
+
+# ╔═╡ 2a49d3be-d6ae-43fd-8fe8-a14800c023c9
+function partition_X(
+ ls::Array{Int64,1},
+ ys::Array{Int64,1},
+ M::Array{Int64,1})
+ # @show ys
+ # @show ls
+ X_partition = [[] for i ∈ M, j ∈ M]
+ for (x, (i,j)) ∈ enumerate(zip(ys,ls))
+ if j ∈ M
+ push!(X_partition[i,j], x)
+ end
+ end
+ X_partition
+end
+
# ╔═╡ 9c063c91-0497-40c2-8eb1-bdf8060aaf70
md"""
## Độ khả nghi
@@ -97,103 +171,88 @@ md"""
Độ khả nghi của các mẫu dữ liệu là như sau.
"""
-# ╔═╡ 8fadfa66-a730-4f99-aa70-e25fec26cb09
-begin
- struct Lapros
- Xỹ::Array{Array{Int64,1},1}
- C::Array{Int64,1}
- t::Array{Float64,1}
- end
-
- function avg_class_confidence(
- ps::Array{Float64,2},
- ys::Array{Int64,1},
- M::Array{Int64,1},
- )
- Xỹ = [[] for _ in M]
- C = DefaultDict(0)
- t = DefaultDict(0)
- for (i,y) in enumerate(ys)
- push!(Xỹ[y], i)
- t[y] = (C[y] * t[y] + ps[i,y])/(C[y]+1)
- C[y] += 1
- end
- C = [C[k] for k in M]
- t = [t[k] for k in M]
- Lapros(Xỹ, C, t)
+# ╔═╡ b33c68aa-0a24-4622-8e4d-d9abbce885a5
+function rank_suspicious(
+ ps::Array{Float64,2},
+ ls::Array{Int64,1},
+ ys::Array{Int64,1},
+)
+ # @show ps
+ # @show ls
+ # @show ys
+ n = length(ys)
+ e = spzeros(Float64, n)
+ # @show e
+ ids = (ls.≠ys) .&& (ls.≠0)
+ for k in (1:n)[ids]
+ e[k] = ps[k, ls[k]] - ps[k, ys[k]]
end
-
- lapros = avg_class_confidence(p̂, ỹ, M)
-end;
+ # @show e
+ e
+end
-# ╔═╡ 95d29260-af27-48ca-a3a7-120575b318a4
-Xỹ = lapros.Xỹ
+# ╔═╡ 8fadfa66-a730-4f99-aa70-e25fec26cb09
+function avg_confidence(
+ ps::Array{Float64,2},
+ ys::Array{Int64,1},
+ M::Array{Int64,1},
+)
+ t = [mean(ps[ys .== i, i]) for i ∈ M]'
+end
-# ╔═╡ 846072fc-2269-4fbe-89d4-270b71cf5339
-C = lapros.C
+# ╔═╡ df59e679-7e5d-4c3e-b49d-6cd899ca55d9
+"Rank the suspiciouness of observed labels.
+
+Parameters:
+- `p`: predicted probabilities given by some model
+- `y`: observed labels of the samples
+- `M`: unique classes of possible labels
+
+If not specified, `M` will be computed by taking unique values of `y` and sort them.
+"
+function lapros(
+ p::Array{Float64,2},
+ y::Array{Int64,1},
+ M::Array{Int64,1},
+)
+ t = avg_confidence(p, y, M)
+ ll = find_likely_label(p .- t)
+ rank = rank_suspicious(p, ll, y)
+end
+
+# ╔═╡ 2c9a31f4-6abd-40ef-a3b3-f6eb39eda059
+errs = lapros(p̂, ỹ, M)
+
+# ╔═╡ 026a4124-a6df-4ae3-a23b-fd676fd3b2cb
+errs_ = lapros(p̂, ỹ)
+
+# ╔═╡ b8555fa5-d21c-44da-832c-1366f304cde4
+@assert all(errs .≡ errs_)
# ╔═╡ 1dba3ac3-eb7c-442c-a474-cd7b415a4594
-t = lapros.t
+t = avg_confidence(p̂, ỹ, M)
+
+# ╔═╡ 154ea90b-578c-4348-be28-69a3877e48d0
+sum(t)
# ╔═╡ 71c14b17-6fda-4b0a-b30f-c3c181d35b12
-t2p = p̂ .- t'
+t2p = p̂ .- t
+
+# ╔═╡ 5921b759-9474-414f-a25a-416aec299afb
+l̂ = find_likely_label(t2p)
+
+# ╔═╡ a7dfaa5e-7376-49c7-b025-f16e4c5b8f56
+rank_suspicious(t2p, l̂, ỹ)
# ╔═╡ 2dbdc102-5f61-4888-9bae-96d8bbf333a5
# Ma trận True/False thể hiện việc xác suất dự đoán có đạt chỉ tiêu hay không:
t2p_positive = t2p .≥ 0;
-# ╔═╡ f8cbcd15-d2d0-4945-a80b-0e0e615d22e5
-Lᵩ = [M[t2p_positive[i, :]] for i in 1:n]
-
-# ╔═╡ 591f5a84-b437-4b59-9961-bc110e34eeae
-l̂ = @chain argmax(t2p, dims=2) begin
- _[:]
- [id[2] for id in _]
- ifelse.(iszero.(sum(t2p_positive, dims=2))[:], 0, _)
-end
-
-# ╔═╡ 2a49d3be-d6ae-43fd-8fe8-a14800c023c9
-Xỹẏ = begin
- function partition_X(ls::Array{Int64,1}, ys::Array{Int64,1}, M::Array{Int64,1})
- # @show ys
- # @show ls
- X_partition = [[] for i ∈ M, j ∈ M]
- for (x, (i,j)) ∈ enumerate(zip(ys,ls))
- if j ∈ M
- push!(X_partition[i,j], x)
- end
- end
- X_partition
- end
- partition_X(l̂, ỹ, M)
-end
-
-# ╔═╡ b33c68aa-0a24-4622-8e4d-d9abbce885a5
-e = begin
- function rank(ps::Array{Float64,2},
- ls::Array{Int64,1},
- ys::Array{Int64,1},
- ts::Array{Float64,1},
- )
- # @show ps
- # @show ls
- # @show ys
- n = length(ys)
- e = zeros(Float64, n)
- # @show e
- for k in 1:n
- if ls[k] ∉ [0, ys[k]]
- e[k] = (ps[k, ls[k]] - ps[k, ys[k]]
- - ts[ls[k]] + ts[ys[k]])
- end
- end
- e
- end
- rank(p̂, l̂, ỹ, t)
-end
-
# ╔═╡ 82974108-2917-41f8-a8b2-0fe323331b48
-@assert t2p_positive == (p̂ .≥ t')
+@assert t2p_positive == (p̂ .≥ t)
+
+# ╔═╡ 29cd589c-b3e9-4a65-9641-352129a27c1e
+# using PlutoUI; TableOfContents()
# ╔═╡ 00000000-0000-0000-0000-000000000001
PLUTO_PROJECT_TOML_CONTENTS = """
@@ -201,6 +260,9 @@ PLUTO_PROJECT_TOML_CONTENTS = """
Chain = "8be319e6-bccf-4806-a6f7-6fae938471bc"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
+Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
+SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
[compat]
@@ -526,32 +588,44 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
# ╔═╡ Cell order:
# ╟─9cb3568a-9b59-438e-9ca0-c10c93247d92
-# ╟─34e904a0-5909-4cdd-a025-068dbb1a6cd1
+# ╠═34e904a0-5909-4cdd-a025-068dbb1a6cd1
# ╟─dc3a9ad9-6a90-437b-9893-d59788b8bafb
# ╟─d1dd37af-7def-4a27-add4-223bf76757e2
# ╟─8c9ff1af-26ef-42b4-8e1b-39d978b08674
# ╟─99e5c1b4-89a0-4e70-972e-37dd22d57d37
+# ╠═bbb3b95f-e45f-46b6-b6e6-b41b2b283ab2
+# ╟─1a048638-4eda-4d6c-9009-6717a330aeb6
+# ╠═2c9a31f4-6abd-40ef-a3b3-f6eb39eda059
+# ╠═df59e679-7e5d-4c3e-b49d-6cd899ca55d9
+# ╟─1dbe808e-85e0-4052-b6ac-90fa86300ba7
+# ╠═b8555fa5-d21c-44da-832c-1366f304cde4
+# ╠═026a4124-a6df-4ae3-a23b-fd676fd3b2cb
+# ╠═a6a56ac9-6849-49f9-bbce-4222cf663c80
# ╟─faa8ebef-ff1a-486d-926f-3ab1a782eaf1
-# ╟─95d29260-af27-48ca-a3a7-120575b318a4
+# ╠═95d29260-af27-48ca-a3a7-120575b318a4
# ╟─0327985e-859f-4c0e-a232-856aa31b0c44
# ╟─846072fc-2269-4fbe-89d4-270b71cf5339
# ╟─68fef702-a604-4f03-87da-09984af59898
-# ╟─1dba3ac3-eb7c-442c-a474-cd7b415a4594
+# ╠═1dba3ac3-eb7c-442c-a474-cd7b415a4594
+# ╠═154ea90b-578c-4348-be28-69a3877e48d0
# ╟─6c190eec-b8bc-4915-9d20-cac0280b4131
-# ╟─71c14b17-6fda-4b0a-b30f-c3c181d35b12
+# ╠═71c14b17-6fda-4b0a-b30f-c3c181d35b12
# ╟─73ef22d7-0961-46fa-93a8-c149c62f0ba8
# ╟─21b37653-4dc8-48c6-bc31-cd0449b24bc2
-# ╟─f8cbcd15-d2d0-4945-a80b-0e0e615d22e5
+# ╠═f8cbcd15-d2d0-4945-a80b-0e0e615d22e5
# ╟─5be2ee06-178d-42ec-97b2-b51dbe189633
-# ╟─591f5a84-b437-4b59-9961-bc110e34eeae
+# ╠═5921b759-9474-414f-a25a-416aec299afb
+# ╠═591f5a84-b437-4b59-9961-bc110e34eeae
# ╟─451f8698-2c6c-4cf1-8e1a-ede8cc1c535b
-# ╟─2a49d3be-d6ae-43fd-8fe8-a14800c023c9
+# ╠═45b1feb2-45d3-46df-973a-8b95a70ea164
+# ╠═2a49d3be-d6ae-43fd-8fe8-a14800c023c9
# ╟─9c063c91-0497-40c2-8eb1-bdf8060aaf70
-# ╟─b33c68aa-0a24-4622-8e4d-d9abbce885a5
-# ╟─8fadfa66-a730-4f99-aa70-e25fec26cb09
-# ╟─2dbdc102-5f61-4888-9bae-96d8bbf333a5
-# ╟─82974108-2917-41f8-a8b2-0fe323331b48
-# ╟─0911e262-5124-4aa9-b1ba-feacec87b49e
+# ╠═a7dfaa5e-7376-49c7-b025-f16e4c5b8f56
+# ╠═b33c68aa-0a24-4622-8e4d-d9abbce885a5
+# ╠═8fadfa66-a730-4f99-aa70-e25fec26cb09
+# ╠═2dbdc102-5f61-4888-9bae-96d8bbf333a5
+# ╠═82974108-2917-41f8-a8b2-0fe323331b48
+# ╠═0911e262-5124-4aa9-b1ba-feacec87b49e
# ╟─29cd589c-b3e9-4a65-9641-352129a27c1e
# ╟─00000000-0000-0000-0000-000000000001
# ╟─00000000-0000-0000-0000-000000000002