10.3.2.1 使用連續處理樹
要把我們以前實現的 sumtree 函式,轉變成使用連續的版本,首先,要給這個函式新增乙個額外的引數(連續);其次,還需要改變函式返回結果的方式,不是簡單地返回值,而是把它作為引數值,給連續進行呼叫。 清單 10.18 是**的最終版本。
清單 10.18 使用連續,計算樹中元素的和 (f# interactive)
> let rec sumtreecont tree cont =
match tree with
| leaf(num) -> cont(num)
| node(left, right) –>
sumtreecont left (fun leftsum -> [1]
sumtreecont right (fun rightsum –> [2]
cont(leftsum + rightsum)));; [3]
val sumtreecont : inttree -> (int ->'a) –> 'a
修改葉子的分支很容易,因為它以前就是從葉子返回值。第二種情況就重要得多,我們使用的模式相似於前面的 c# 示例。我們呼叫函式計算左子樹元素的的和[1](這是尾遞迴),並把 lambda 函式作為它的第二個引數值。在 lambda 函式的內部,我們對右子樹做類似的事情[2](也是尾遞迴呼叫)。一旦我們有兩個子樹的和,就把它作為引數,呼叫最初得到的連續,(這還是尾遞迴呼叫)。
對於我們剛剛寫的這個函式,還有一件重要的事情,就是它的型別簽名。通常,我們不需要顯式寫出任何型別,f# 會為我們推斷出型別。這個函式把樹作為第乙個引數,連續作為第二引數。現在,連續的型別為 int –>'a,函式的整體結果是 'a;換句話說,整個函式的返回型別與連續的返回型別相同。
前面我們提到過,在**中,所有遞迴呼叫現在都是尾遞迴,所以,我們可以在不平衡樹上嘗試這個函式,在以前的版本中是失敗的:
> sumtreecont imbalancedtree (fun r –>
printfn "result is: %d" r);;
result is: 8736
val it : unit = ()
> sumtreecont imbalancedtree (fun a-> a);; <-- 從連續中返回和
val it : int = 8736
可以看到,現在的**可以執行非常大的樹,而沒有任何麻煩。第乙個示例,我們直接在連續中列印出結果,連續不返回任何值,所以,表示式的整體結果是 unit;在第二種情況下,我們給它乙個恒等函式(返回值就是引數值的函式)作為連續。恒等函式在 f# 庫中已經有了,所以,我們可以寫 id。 連續返回型別是 int,從呼叫 sumtreecont 返回的值就是樹中所有元素的和。
決策樹 連續值的處理
連續值處理 因為連續屬性的可取值數目不再有限,因此不能像前面處理離散屬性列舉離散屬性取值來對結點進行劃分。因此需要連續屬性離散化,常用的離散化策略是二分法,這個技術也是c4.5中採用的策略。下面來具體介紹下,如何採用二分法對連續屬性離散化 下面舉個具體的例子,來看看到底是怎樣劃分的。給定資料集如下 ...
資料連續化處理
這裡先舉個簡單的例子,很多朋友以前一定寫過類似這樣的例子 求編寫一函式,輸入年月日,求出該日是該年的第幾天.好的,現在大家 會怎麼寫呢?我的第一次 大概是這樣的 intgetday intyear,intmonth,intday 最後在下是否閏年 今天在fy 上看了連續化處理後,感悟頗深.對上面的 ...
使用pandas實現連續資料的離散化處理方式
python實現連續資料的離散化處理主要基於兩個函式,pandas.cut和pandas.qcut,前者根據指定分界點對連續資料進行分箱處理,後者則可以根據指定箱子的數量對連續資料進行等寬分箱處理,所謂等寬指的是每個箱子中的資料量是相同的。下面簡單介紹一下這兩個函式的用法 匯入pandas包 imp...