2021年9月23日 星期四

使用LibreOffice製作代碼瀑布

Matrix_Digital_Rain_in_Excel_1

Matrix Digital Rain in LibreOffice

之前在facebook 看到一個沒有見過的效果,一時興起就研究了一下

如何使用LibreOffie 做一個代碼瀑布?

所謂的代碼瀑布,就是電影The Matrix(台譯:駭客任務)出現的一個經典畫面,其效果就是一條一條的綠色文字如雨一般的下降

網路上已經有人用Excel做過,身為LibreOffice使用者不免手癢,馬上做一個LibreOffice Calc版本

1. 準備一個RANDBETWEEN( )函式.

首先,我們在儲存格B1插入第一個函式

=RANDBETWEEN(1,9)

然後選取B2到B16的儲存格,將背景色和字體顏色均改成黑色 然後在儲存格A1補個9

2. 寫入公式

在儲存格B2到B16寫入以下公式

=MOD(ROW()+B$1-$A$1,15)+1

3. 設定條件式格式

選取B2到B16的儲存格後,選擇選單中的 格式(O) -> 條件式(O) -> 條件(A)

  • 條件1 : 選擇「公式」
  • 套用樣式 : 自訂一個新的樣式,將字型色彩設定成白色
  • 使用的公式如下
MOD(ROW()+B$1-$A$1,15)+1=6

新增後再點一次下方的「加入(A)」按鈕,新增一個條件2

  • 條件2 : 選擇「公式」
  • 套用樣式 : 自訂一個新的樣式,將字型色彩設定成亮綠色
  • 使用的公式如下
MOD(ROW()+B$1-$A$1,15)+1=5

新增後再點一次下方的「加入(A)」按鈕,新增一個條件3

  • 條件3 : 選擇「公式」
  • 套用樣式 : 自訂一個新的樣式,將字型色彩設定成暗綠色
  • 使用的公式如下
MOD(ROW()+B$1-$A$1,15)+1<5

4.為何要設定這些條件式格式?

以條件1寫入的公式舉例 我們在儲存格A1寫入過9,在儲存格B1寫入過RANDBETWEEN(1,9),假設B1的值是3

此時發生在儲存格B2的事如下

公式:

=MOD(ROW()+B$1-$A$1,15)+1

儲存格B2:

=MOD(2+3-9,15)+1

儲存格中的MOD(-4,15)+1 會得到12

儲存格B2設定的條件1:

= MOD(ROW()+B$1-$A$1,15)+1 = 6

最後會回傳 12=6 的邏輯判斷 FALSE

在條件式格式的作用下,這個FALSE會讓他無法作用,因此維持原來的黑色

但是發生在儲存格B11的事就不同

公式:

=MOD(ROW()+B$1-$A$1,15)+1

儲存格B11:

=MOD(11+3-9,15)+1=6

儲存格中的MOD(5,15)+1 會得到6

依照條件1最後會回傳 6=6 的邏輯判斷 TRUE

在條件式格式的作用下,這個TRUE會讓他作用,變成我們設定好的白色

條件2在這個基礎上把條件設定成公式要等於5

  1. MOD(ROW()+B$1-$A$1,15)+1 = 6
  2. MOD(ROW()+B$1-$A$1,15)+1 = 5

這個等於5會讓格式作用在比條件1向上移動一個儲存格,變成淺綠色

條件3是把這個公式設計成包含4、3、2、1,也就是小於5

MOD(ROW()+B$1-$A$1,15)+1 < 5

這樣的設定保證了我們可以得到 “深綠-深綠-深綠-深綠-淺綠-白”這樣順序的文字,只要A1的值不斷的+1,這個過程就可以無限循環

5.使用巨集

最後進入 工具(T) -> 巨集(M) -> 組織巨集(O) -> Basic語言(B) 將這個語法巨集嵌入到ods檔

Sub Main
    Sheet = ThisComponent.CurrentController.ActiveSheet
    Cell = Sheet.getCellRangeByName("A1")
    For i = 0 To 100
        Wait 100
        Cell.setValue(i)
    Next i
End Sub

可以選擇是否要採用表單控制項來啟動

6.產生文字

雖然可以產生數字,但是我們需要的是文字,因此要做進一步的改造

先增加一個sheet2,放入需要的文字

接下來在sheet1的B2寫入這個函式

=INDEX($sheet2.A$1:A$15,MOD(ROW()+B$1-$A$1,15)+1)

主要是將原本的數字用INDEX( )函式轉換成文字

完成後,將原本的儲存格B2向下複製到需要的儲存格,只是B1請保留原來的數字

後面在連同儲存格C1、D1等分別寫入不同的數字,營造高低不同的瀑布感

Reference

1.Matrix Digital Rain in Excel - XL n CAD

2020年4月18日 星期六

決策樹分割的差異-分類與迴歸

Gini_MSE_Notebook

這裡主要是說明決策樹的分類與迴歸樹最大的不同點。並且用最簡單的例子來說明 gini index 與 minimize square error

gini index

假設資料集合 S 包含 n 個類別,Gini(S)的定義為 $P_j$ 為在 S中的值組屬於類別j的機率 $$ Gini(S) = 1 - \sum_{j=1}^n P_j^2 $$

利用屬性A分割資料集合 S 為 S1 與 S2 (二元分割)。則根據此一分割要件的吉尼係數$Gini_A(S)$為 $$ Gini_A(S) = \frac{|S_1|}{|S|}Gini(S_1)+ \frac{|S_2|}{|S|}Gini(S_2) $$

不純度值的降低為:

$$ \Delta Gini(A) =Gini(S) - Gini_A(S) $$

挑選擁有最大不純度的降低值、或吉尼係數$Gini_A(S)$最小的屬性作為分割屬性。

一個節點

用紅黑球10顆來舉例,如果紅和黑是9:1

$$ Gini(S_{\{red,black\}})= 1 - \Big(\frac{9}{10}\Big)^2-\Big(\frac{1}{10}\Big)^2 = 0.18 $$

如果紅和黑是4:6

$$ Gini(S_{\{red,black\}})= 1 - \Big(\frac{4}{10}\Big)^2-\Big(\frac{6}{10}\Big)^2 = 0.48 $$

可以發現,對於一個節點來說,Gini Index 代表了內部的不純度,也就是比例越是平均,Gini值越高

分割後的節點

現在將 4:6 的紅黑球(Gini = 0.48)分成兩組各5顆$S_1$與$S_2$

$S_1$紅黑的比例為3:2 $\qquad$ $S_2$紅黑的比例為1:4

$$ \begin{aligned} Gini(S_{split}) &= \frac{5}{10}Gini(S_1)+ \frac{5}{10}Gini(S_2) \\ &= \frac{5}{10} \cdot 0.48 + \frac{5}{10} \cdot 0.32 \\ &= 0.4 \end{aligned} $$

然後計算 $\Delta Gini(Split)$的值 $$ \Delta Gini(Split) = 0.48 - 0.4 = 0.08 $$

 在決策樹上的運作方式

對於決策樹來說,Gini Index 是選擇分割屬性的方法,因此會比較兩種以上屬性的$\Delta Gini$,選擇降低最多的屬性

$\text{MAX}(\Delta Gini(A),\Delta Gini(B))$

minimize square error

定義 $x$ 和 $y$ $$ \begin{aligned} x &= x_1,x_2,x_3,x_4,...x_i \\ y &= y_1,y_2,y_3,y_4,...y_i \end{aligned} $$ 首先利用特徵A分出兩個區域 $R_1$ 與 $R_2$,Loss function 為預測值和真實值的誤差 $$ \begin{aligned} Los{s_{A}} &= \sum\limits_{x_i \in {R_1}} {(y_i - {c_1}} {)^2} + \sum\limits_{x_i \in {R_2}} {(y_i - {c_2}} {)^2} \end{aligned} $$

$Loss_{A}$中,$y$是$x$對應的真實值。我們的目標就是使得$Loss_{A}$最小化時的${c_1}$和${c_2}$,目標函式為:

$$ {\min_{c_1} \sum\limits_{x_i \in {R_1}} {{{(y_i - {c_1})}^2}} + \min_{c_2} \sum\limits_{x_i \in {R_2}} {{{(y_i - {c_2})}^2}} } $$

當式子為最小值時,$c_1$ 和 $c_2$ 分別為

$${c_1} =\frac{1}{N_1} \sum_{x_i \in R_1}^{} y_i$$$${c_2} =\frac{1}{N_2} \sum_{x_i \in R_2}^{} y_i$$

用圖可以簡單理解,下面是 $R_1$ 和 $R_1$。以及個別代表的$c_1$ 和 $c_2$

此時的 loss function 回傳的是 3.36

接下來稍微修正一下特徵,使分割改變,loss function 回傳的值變為 7.38。

只要分割後的誤差越大,這個值就會升高,最後形成誤差最小的迴歸線

參考資料

最直覺的分類--決策樹 採礦貓

分类与回归树(classification and regression tree,CART)之回归 天泽28

In [ ]:
 

使用LibreOffice製作代碼瀑布

Matrix_Digital_Rain_in_Excel_1 Matrix Digital Rain in LibreOffice 之前在facebook 看到一個沒有見過的效果,一時興起就研究了一下 如何使用LibreOffie...