iT邦幫忙

1

[已解決]python 公式轉換

  • 分享至 

  • xImage

https://ithelp.ithome.com.tw/upload/images/20230222/20156927cQc6OsCzuS.jpg
請問各位高手,這行公式要怎麼用程式來表達

jeffeux iT邦新手 4 級 ‧ 2023-02-22 23:12:08 檢舉
我發現我居然不能回答了 :'(
注意,因為排版問題我用「 」(全形空白)取代了「 」(兩個半形空白)
請勿直接複製貼上,需要把全形空白換回半形才能執行

```python
import numpy as np

def g_x1_prime(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
  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)) == b_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
```
jeffeux iT邦新手 4 級 ‧ 2023-02-22 23:13:54 檢舉
(我發現我刪不掉,已經移上去了)
注意,因為排版問題我用「 」(全形空白)取代了「 」(兩個半形空白)
請勿直接複製貼上,需要把全形空白換回半形才能執行
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
jeffeux
iT邦新手 4 級 ‧ 2023-02-23 14:06:09
最佳解答

formula

重新看一下公式

formula

拆解一下

formula_analyzed

以下把解釋寫在註解裡:

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)
看更多先前的回應...收起先前的回應...
qq99131 iT邦新手 5 級 ‧ 2023-02-23 19:18:37 檢舉

請問,我理解公式這樣有問題嗎?
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出現的就是空值 =[]

感謝大大您的解釋很詳細,只是小妹學藝不精才又有其他問題請教

jeffeux iT邦新手 4 級 ‧ 2023-02-24 04:24:47 檢舉

您好,請問您的這條公式是從哪個地方得到的呢?
很抱歉我其實不敢說我那樣的解讀是完全正確的,只是正巧可以用我學過的記號(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

jeffeux iT邦新手 4 級 ‧ 2023-02-24 04:27:51 檢舉

所以應該是改成

np.mod(np.abs(e - g_r), np.power(2, n_1)) 
    ==
np.mod(b_1, np.power(2, n_1))

當然這邊的前提是整個式子我沒有理解錯(因為這樣的排版我比較少看到)

qq99131 iT邦新手 5 級 ‧ 2023-02-24 09:00:49 檢舉

您好,是由一篇文章中取得這公式
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

文章內原文如下圖:
https://ithelp.ithome.com.tw/upload/images/20230224/20156927ZxACKkcDds.jpghttps://ithelp.ithome.com.tw/upload/images/20230224/20156927nyPWUb72tG.jpghttps://ithelp.ithome.com.tw/upload/images/20230224/20156927x9Mb8dXS2i.jpg

實際程式執行結果如下:
https://ithelp.ithome.com.tw/upload/images/20230224/20156927rdavUKJ8GV.pnghttps://ithelp.ithome.com.tw/upload/images/20230224/20156927EMSx3hFACT.pnghttps://ithelp.ithome.com.tw/upload/images/20230224/20156927I22iPiHlSW.jpg

再次感謝您的解答以及詳細解說,真的幫助到我很多,非常感謝您

我要發表回答

立即登入回答