1. 程式人生 > >貝葉斯網(2)Netica:從數據中學習CPT

貝葉斯網(2)Netica:從數據中學習CPT

指向 搭建 上一個 劃分 認知 圖劃分 4.0 ont 再次

1. 離散節點

在官方Tutorial中是有詳細的案例的,就是B篇3.3節,你可以動手把天氣預報這個實現一下:

http://www.norsys.com/tutorials/netica/secB/tut_B3.htm#LearningProbTables

技術分享圖片

2. 連續節點

假如我想輸入的不是離散的狀態,而是連續的數值,則不能像上一個案例一樣做了。

* 離散狀態:難,易;陰,晴,雨;是,否……這些都是多選一問題,天氣只能是“陰,晴,雨”三選一,課程難度只有“難,易”兩個選項,而不是“0為最易10為最難下,難度系數為5.312...”。

* 連續數值:房屋的面積,平均房間數(因為是平均房間所以可以是4.6這樣的數而非整數)。仍然以最簡單的貝葉斯網A→B為例,A為房屋面積,B為房價,則A可以是連續的數值。

Netica對連續節點的處理是:劃分區間,看給定的連續數值落在哪個區間內。這一操作被稱之為“離散化”。怎麽理解離散化呢,這讓我想起幾年前學習正態分布的時候網上提供的可視化程序均是通過繪制柱狀圖,而柱狀圖劃分的越細,就越接近連續狀態下的正態分布曲線。

下面給一個簡單的案例,波士頓房價,其中網絡結構由自己搭建(箭頭的指向自定義),節點之間的關聯采取“從數據中學習”的方式獲得(本質上是從數據中學習CPT,數據來源:波士頓房價數據集(Boston House Price Dataset)(下載地址:http://t.cn/RfHTAgY),簡化起見,在此我挑選了一氧化氮濃度、犯罪率以及平均房間數這三列)。

step 1: 把這個之間粘貼到txt文件中。

// ~->[CASE-1]->~

crime air room price

0.00632 0.5380 6.5750 24.00

0.02731 0.4690 6.4210 21.60

0.02729 0.4690 7.1850 34.70

0.03237 0.4580 6.9980 33.40

0.06905 0.4580 7.1470 36.20

0.02985 0.4580 6.4300 28.70

0.08829 0.5240 6.0120 22.90

0.14455 0.5240 6.1720 27.10

0.21124 0.5240 5.6310 16.50

0.17004 0.5240 6.0040 18.90

0.22489 0.5240 6.3770 15.00

step 2: 載入txt文件,自動生成節點,並且在彈出的對話框中指定“離散成多少個區間”。

技術分享圖片

step 3: 根據大致的因果關系手動連接節點構建網絡。

step 4: 再次載入同一個txt文件以學習節點與節點之間的關聯。

技術分享圖片

現在整個貝葉斯網就搭建好了。各個節點均為連續節點,也就是說我在獲取新數據的時候,可以直接輸入新數據(如:air=0.49):

技術分享圖片

然後根據數值所屬區間,Netica會自動給你歸入到low NO或high NO(總感覺和想象的有點不一樣,這樣略粗糙啊,不過這就是Netica的設定)。

現在對搭建好的網絡玩一下。可以發現將air調到“NO濃度最小”,crime調到“犯罪率最低”,room調到“房間數最多”的時候,房價屬於“高房價區間”的可能性是最大的,這符合人類的基本認知。

技術分享圖片

2018.9.26

貝葉斯網(2)Netica:從數據中學習CPT