請問各位高手,這行公式要怎麼用程式來表達
重新看一下公式
拆解一下
以下把解釋寫在註解裡:
import numpy as np
def g_x1_prime__calc(
# 這邊的變數是根據公式寫的
g_x1, g_r, b_1, n_1, l_1, u_1, SAMPLE_POINTS=2000):
"""
因為式子是要從給定的 e 範圍中
找出符合 mod 條件的
然後根據 | e - g_x1 | 取 argmin (也就是那個 e)
因此⋯⋯
"""
# e 的可能範圍,從 l_1 到 u_1
# 這邊 np.linspace 的 `num` 參數可以決定要從區間抽幾個點
# 抽愈多點愈精確但運算也會愈慢
e_range = np.linspace(l_1, u_1, num=SAMPLE_POINTS)
# 然後把條件寫成一個函數
condition = lambda e: (
# 這邊就是那個 mod,當然你要用 abs, **, %
# 或許也行,只是 numpy 可能會更精確?
np.mod(np.abs(e - g_r), np.power(2, n_1))
==
# 抱歉這邊前面寫錯了,這樣才是同餘
np.mod(b_1, np.power(2, n_1))
)
# 然後只保留符合上述條件的 e
# 符合的 `e_after_condition` 會是 True
e_after_condition = condition(e_range)
# 篩選出來之後
valid_e = e_range[e_after_condition]
# 再一一代入 `np.abs(valid_e - g_x1)`
# 再把那個 e 在 valid_e 的 index 用 np.argmin 找出
# 最後再根據此 index 找到 e, a.k.a. `e_argmin`
e_argmin = valid_e[
np.argmin(
np.abs(valid_e - g_x1)
)]
# 回傳出去
return e_argmin
如果要計算就只要
g_x1_prime = g_x1_prime__calc(g_x1, g_r, b_1, n_1, l_1, u_1)
請問,我理解公式這樣有問題嗎?
abs(e-g_x1) 或 abs(e-g_r) 近似於 b_1(mod2**n1)
argmin_e就是取最小值
這樣對嗎?
另外用您的程式跑了一下產生一些問題:
attempt to get argmin of an empty sequence
所以我一行一行印出來檢查,
發現e_after_condition值全部都是flase
因此valid_e出現的就是空值 =[]
感謝大大您的解釋很詳細,只是小妹學藝不精才又有其他問題請教
您好,請問您的這條公式是從哪個地方得到的呢?
很抱歉我其實不敢說我那樣的解讀是完全正確的,只是正巧可以用我學過的記號(notation)拼湊出來而已
argmin 記號是指把一個集合的數代入某個式子,取出會使得這個式子最小的那個數
但我比較不確定的是您的式子這邊是真的兩槓還是只是「集合條件符號」與「絕對值符號」貼太近而已
而我在離散數學學過的同餘符號會被這樣寫:
當時回答一時忘記只要餘數相同就可以成立了,所以上面的條件可能太嚴苛,導致 e_after_condition 能是 True 的太少(當然還是可能真的沒有,那這樣也確實取不出 argmin)。
我再想想怎麼修正好了⋯⋯
————————————————————————————————————
我的意思是指
26 除以 12 的餘數是 2
(26 % 12 == 2)
因此
26 ≡ 2 (mod 12)
但其實
26 ≡ 14 (mod 12)
也是成立的,然而這不代表
26 % 12 == 14
而是
26 % 12 == 14 % 12
所以應該是改成
np.mod(np.abs(e - g_r), np.power(2, n_1))
==
np.mod(b_1, np.power(2, n_1))
當然這邊的前提是整個式子我沒有理解錯(因為這樣的排版我比較少看到)
您好,是由一篇文章中取得這公式
Adaptive pixel value differencing steganography using both vertical and horizontal edges
是為了寫出這篇文章中的實驗過程
非常感謝您花費寶貴的時間替我講解,最後得出了正確的解答,修改程式如下:
import numpy as np
def g_x1_prime__calc(
g_x1, g_r, b_1, n_1, l_1, u_1):
e_range = np.linspace(l_1, u_1, (abs(l_1 - u_1)+1))
condition = lambda e: (np.mod(np.abs(e - g_r), np.power(2, n_1)) == b_1))
e_after_condition = condition(e_range)
valid_e = e_range[e_after_condition]
e_argmin = valid_e[np.argmin(np.abs(valid_e - g_x1))]
return e_argmin
文章內原文如下圖:
實際程式執行結果如下:
再次感謝您的解答以及詳細解說,真的幫助到我很多,非常感謝您