基於C#的機器學習--貝葉斯定理-執行數據分析解決肇事逃逸之謎

貝葉斯定理-執行數據分析解決肇事逃逸之謎

在這一章中,咱們將:html

  1. 應用著名的貝葉斯定理來解決計算機科學中的一個很是著名的問題。
  2. 向您展現如何使用貝葉斯定理和樸素貝葉斯來繪製數據,從真值表中發現異常值等等

貝葉斯定理概況

       當咱們使用貝葉斯定理的時候,咱們是在測量一件事發生的概論程度:算法

   上式表示在給定事件B的狀況下事件A發生的機率。編程

       機率一般被量化爲0和1之間的一個數,包括這二者;0表示不可能,1表示絕對確定。機率越大,肯定性越大。擲骰子獲得6的機率和擲硬幣獲得正面的機率這兩個例子大家確定很熟悉。還有另外一個大家天天都熟悉和遇到的例子:垃圾郵件。網絡

       咱們全部人一般一成天都在打開電子郵件(有些人甚至整夜都在打開!)伴隨着咱們所期待的信息,咱們也將迎來那些咱們不肯意、也不肯意接收的信息。咱們都討厭處理垃圾郵件。我天天收到的郵件中有一封是垃圾郵件的機率是多少?我關心它的內容的機率是多少?咱們是怎麼知道的?app

       讓咱們來談談垃圾郵件過濾器是如何工做的,由於,這多是咱們可使用的關於機率的最好的例子!框架

       大多數垃圾郵件過濾器的工做方式(至少在最基本的層次上)是定義一個單詞列表,用於指示咱們不想要或不要求接收的電子郵件。若是郵件中包含這些詞,就會被認爲是垃圾郵件.機器學習

從公式化的角度來看是這樣的:ide

根據給定的一組單詞,判斷電子郵件是垃圾郵件的機率:維基百科中的用戶Qniemiec有一個使人難以置信的可視化圖表,該圖表充分解釋了機率視圖的每一個組合,該視圖由兩個事件樹的疊加表示。這是一個完整的貝葉斯定理的可視化,它由兩個事件樹圖的疊加表示:函數

如今,咱們來看一個很是著名的問題。它有不少名字,但最基本的問題是所謂的出租車問題。這是咱們的場景,咱們將嘗試用機率和貝葉斯定理來解決。工具

一名Uber司機捲入了一塊兒肇事逃逸事故。著名的黃色出租車和Uber司機是在這個城市運營的兩家公司,隨處可見。咱們獲得如下數據:

  1. 該市85%的出租車是黃色的,15%是Uber。
  2. 一名目睹者指認了肇事逃逸車輛的身份,並表示車上貼着Uber的貼紙。話雖如此,咱們不知道證人的證詞有多可靠,所以法院決定對用戶進行測試並肯定其可靠性。最終,法院得出結論,證人在80%的狀況下正確識別了兩輛車中的每一輛,但在20%的狀況下未能識別。

這是很重要的,因此請注意接下來的內容:

咱們的兩難境地是:事故中涉及的車輛是Uber司機仍是黃色出租車的機率是多少。

從數學上來講,如下就是咱們如何獲得咱們須要的答案的過程:

  1. 正確識別的Uber司機總數爲:

    15*0.8=12

  1. 目睹者有20%的時間是錯誤的,因此錯誤識別的車輛總數是:

    85*0.2=17

  1. 所以,證人確認的車輛總數爲12 + 17 = 29。所以,他正確識別Uber司機的機率是

    12/29=41.3%

       如今,讓咱們看看是否能夠開發一個簡單的程序來幫助咱們得出這個數字,以證實咱們的解決方案是可行的。爲此,咱們將深刻研究咱們的第一個開源工具包:Encog。Encog被設計用來處理這樣的問題。

       Encog框架是一個成熟的機器學習框架,由Jeff Heaton先生開發。希頓先生還出版了幾本關於Encog框架以及其餘主題的書籍,若是您打算普遍使用這個框架,我鼓勵您去尋找它們。

       讓咱們看看解決這個問題所須要的代碼。你會注意到,數學,統計學,機率…這些都是從你那裏抽象出來的。Encog可讓您專一於您試圖解決的業務問題。             

static void Main(string[] args)

        {

            //建立一個貝葉斯網絡

            BayesianNetwork network = new BayesianNetwork();

            //建立肇事逃逸事件

            BayesianEvent UberDriver = network.CreateEvent("肇事逃逸");

            //建立目睹者事件

            BayesianEvent WitnessSawUberDriver =network.CreateEvent("目睹肇事逃逸");

            //把兩個事件關聯起來

            network.CreateDependency(UberDriver, WitnessSawUberDriver);

            //肯定結構

            network.FinalizeStructure();

            //創建真值表

            UberDriver?.Table?.AddLine(0.85, true);

            WitnessSawUberDriver?.Table?.AddLine(0.80, true, true);

            WitnessSawUberDriver?.Table?.AddLine(0.20, true, false);

            //初始化貝葉斯網絡

            network.Validate();

            Console.WriteLine(network.ToString());

            Console.WriteLine($"參數數量:{ network.CalculateParameterCount()}");

            //枚舉查詢

            EnumerationQuery query = new EnumerationQuery(network);

            //證據是有人看見Uber司機撞了車

            query.DefineEventType(WitnessSawUberDriver,EventType.Evidence);

            //結果是Uber司機真這麼作了

            query.DefineEventType(UberDriver, EventType.Outcome);

            query.SetEventValue(WitnessSawUberDriver, false);

            query.SetEventValue(UberDriver, false);

            query.Execute();

            Console.WriteLine(query.ToString());

            Console.ReadKey();

        }

       好,讓咱們把它分解成更容易消化的部分。咱們要作的第一件事是建立一個貝葉斯網絡。這個物體將是解開咱們這個謎的核心。貝葉斯網絡對象是機率和分類引擎的包裝器。

       貝葉斯網絡由一個或多個貝葉斯事件組成。事件將是證據、結果或隱藏的三種不一樣類型之一,一般對應於訓練數據中的一個數字。事件老是離散的,可是連續值(若是存在而且須要)能夠映射到離散值的範圍。

       在建立初始網絡對象以後,咱們爲Uber司機以及聲稱看到肇事逃逸司機的目睹者建立一個事件。咱們將在Uber司機和目睹者之間創建一個依賴關係,而後肯定咱們網絡的結構。      

   //建立一個貝葉斯網絡

     BayesianNetwork network = new BayesianNetwork();

     //建立肇事逃逸事件

     BayesianEvent UberDriver = network.CreateEvent("肇事逃逸");

     //建立目睹者事件

     BayesianEvent WitnessSawUberDriver =network.CreateEvent("目睹肇事逃逸");

     //把兩個事件關聯起來

     network.CreateDependency(UberDriver, WitnessSawUberDriver);

     //肯定結構

     network.FinalizeStructure();

       接下來,咱們須要構建實際的真值表。真值表是一個函數可能具備的全部值的列表。有一行或多行復雜度不斷增長,最後一行是最終的函數值。若是你還記得邏輯理論,基本上有三種操做可使用:NOT, AND和OR。0一般表示false, 1一般表示true。

       若是咱們再深刻一點,就會發現咱們獲得了下面的規則

             If A = 0, -A = 1

    If A = 1, -A = 0

    A+B = 1, except when A and B = 0

    A+B = 0 if A and B = 0

    A*B = 0, except when A and B = 1

    A*B = 1 if A and B = 1

         如今,回到咱們的代碼。

         爲了構建真值表,咱們須要知道機率和結果值。在咱們的問題中,Uber司機捲入事故的可能性是85%。至於目睹者,有80%的可能他們說的是真話,有20%的可能他們錯了。咱們將使用真值表的AddLine函數添加這些信息。      

     //創建真值表

     UberDriver?.Table?.AddLine(0.85, true);

     WitnessSawUberDriver?.Table?.AddLine(0.80, true, true);

     WitnessSawUberDriver?.Table?.AddLine(0.20, true, false);

     //初始化貝葉斯網絡

     network.Validate();

       這是一個擴展真值表,顯示了兩個變量P和Q的全部可能真值函數。

         若是咱們要對真值表進行更普遍的編程,下面是一個例子:

    a?.Table?.AddLine(0.5, true); // P(A) = 0.5

    x1?.Table?.AddLine(0.2, true, true); // p(x1|a) = 0.2

    x1?.Table?.AddLine(0.6, true, false);// p(x1|~a) = 0.6

    x2?.Table?.AddLine(0.2, true, true); // p(x2|a) = 0.2

    x2?.Table?.AddLine(0.6, true, false);// p(x2|~a) = 0.6

    x3?.Table?.AddLine(0.2, true, true); // p(x3|a) = 0.2

    x3?.Table?.AddLine(0.6, true, false);// p(x3|~a) = 0.6

         如今咱們的網絡和真值表已經構建好了,是時候定義一些事件了。

如前所述,事件是證據、隱藏或結果的任何一種。隱藏的事件既不是證據也不是結果,但仍然與貝葉斯圖自己有關。咱們不會使用隱藏,但我想讓你知道它確實存在。

要解開咱們的謎團,咱們必須積累證據。在咱們的案例中,咱們掌握的證據是,目睹者報告稱看到一名Uber司機參與了這起肇事逃逸事件。咱們將定義一種事件類型的證據,並將其分配給證人報告的內容。若是結果,是一個優步司機,因此咱們會給它分配一個事件類型的結果。

最後,咱們必須認可,至少在某些時候,目睹者看到一名優步司機捲入其中的報告是不正確的。所以,咱們必須爲目睹者沒有看到優步司機和優步司機沒有參與的兩種可能性建立事件值:

    //枚舉查詢

     EnumerationQuery query = new EnumerationQuery(network);

     //證據是有人看見Uber司機撞了車

     query.DefineEventType(WitnessSawUberDriver,EventType.Evidence);

     //結果是Uber司機真這麼作了

     query.DefineEventType(UberDriver, EventType.Outcome);

     query.SetEventValue(WitnessSawUberDriver, false);

     query.SetEventValue(UberDriver, false);

     query.Execute();

         注意,咱們將要執行的查詢是EnumerationQuery。該對象容許對貝葉斯網絡進行機率查詢。這是經過計算隱藏節點的每一個組合並使用總機率找到結果來實現的。若是貝葉斯網絡很大,性能可能會不好,但幸運的是,它不是。

         最後,咱們對貝葉斯網絡定義執行查詢並打印結果,正如咱們所但願的,是41.3%。

         做爲練習,看看如今是否可使用Encog來解決另外一個很是著名的示例。在這個例子中,咱們早上醒來發現草是溼的。是下雨了,仍是灑水器開着,仍是二者都開了?這是咱們的真值表在紙和筆上的樣子:

下雨的機率:

完整真值表:

繪製數據

如前所述,樸素貝葉斯在解決複雜狀況方面的效率驚人。雖然在某些狀況下,它的性能確定會優於其餘算法,但它只是應用於您的問題的一個很好的初試算法。由於與許多其餘模型相比,咱們只須要很是少的訓練數據。

         在下一個應用程序中,咱們將使用奇妙的Accord.NET機器學習框架,它爲咱們提供了一種工具,咱們可使用該工具輸入數據、查看繪製的數據,並瞭解假陽性和假陰性。咱們將可以爲存在於數據空間中的對象輸入數據,並將它們分類爲綠色或藍色。咱們將可以改變這些數據,看看它們是如何分類的,更重要的是,它們是如何可視化表示的。咱們的目標是瞭解新數據到達時屬於哪組;它們不是綠色就是藍色。此外,咱們但願跟蹤假陽性和假陰性。樸素貝葉斯會根據數據空間中的數據爲咱們作這些事。記住,在咱們訓練樸素貝葉斯分類器以後,最終目標是它可以從之前從未見過的數據中識別出新的對象。若是不能,那麼咱們須要回到訓練階段。

         咱們簡單地討論了真值表,如今是時候回過頭來,在這個定義後面添加一些正式的東西了。更具體地說,咱們用一個混淆矩陣來討論。在機器學習中,混淆矩陣(錯誤矩陣或匹配矩陣)是一種表佈局,可讓您可視化算法的性能。每一行表示預測的類實例,而每一列表示實際的類實例。它被稱爲混淆矩陣,由於可視化能夠很容易地看出你是否混淆了二者。

         真值表的抽象視圖是這樣的:

 

X 如今

(X present)

X 缺省

(X absent)

 

檢測結果呈陽性

(Test positive)

真陽性

(True positive)

假陽性

(False positive)

陽性總分

(Total positive)

  • 檢測結果呈陰性
  • (Test negative)

假陰性

(False negative)

真陰性

(False negative)

陰性總分

(Total negative)

 

X發生的總分

(Total negative)

X沒發生的總分

(Total negative)

總和

(Grand total)

       對同一個真值表的更直觀的視圖是這樣的:

最後,對於一個真正的混淆矩陣有一個更正式的觀點:

       在機器學習領域,真值表/混淆矩陣容許您直觀地評估算法的性能。正如您將在下面的應用程序中看到的,每當添加或更改數據時,您將可以看到是否出現了這些錯誤或負面條件。

       目前,咱們將要開始測試的數據在綠色和藍色對象之間平均分配,因此在沒有任何合理的可能性下,任何新的狀況更有多是其中一種或者另外一種,而不是其餘種。這種合理的機率,被稱爲先驗機率。先驗機率是基於咱們對數據所見的先驗經驗,在不少狀況下,這些信息被用來在結果發生以前預測結果。給定一個先驗機率,咱們就會得出一個結論,這個結論就成爲咱們的後驗機率。

       在咱們的案例中:

  1. 綠色對象的先驗機率是綠色對象的總數/數據空間中對象的總數
  2. 藍色對象的先驗機率等於藍色對象的總數/數據空間中對象的總數

讓咱們進一步看看發生了什麼。

能夠在下面的截圖中看到咱們的數據。X和Y列表示數據空間中沿着X和Y軸的座標,G列是一個標籤,表示對象是否爲綠色。記住,監督學習應該給出咱們想要達到的目標,樸素貝葉斯應該讓咱們很容易看出這是否正確。

 

       若是咱們使用前面的數據並建立它的散點圖,它將看起來像下面的屏幕截圖。如你所見,數據空間中的全部點都被繪製出來了,那些G列值爲0的點被繪製成藍色,而那些值爲1的點被繪製成綠色。

       每一個數據點在數據空間中的X/Y位置上繪製,用X/Y軸表示:

       可是,當咱們向數據空間添加新對象時,樸素貝葉斯分類器沒法正確分類,會發生什麼狀況呢?咱們最終獲得了假陰性和假陽性,以下所示:

因爲咱們只有兩類數據(綠色和藍色),所以咱們須要肯定如何正確分類這些新數據對象。如您所見,咱們有14個新的數據點,顏色編碼顯示它們與x軸和y軸的對齊位置。

如今讓咱們以完整的形式查看應用程序。如下是個人主屏幕截圖。在屏幕左側的Data Samples選項卡下,咱們能夠看到已經加載了數據空間。在屏幕的右邊,咱們能夠看到咱們有一個散點圖,它能夠幫助咱們可視化數據空間。如您所見,全部的數據點都被正確地繪製和着色了。

若是咱們看看機率是如何分類和繪製的,你會發現數據幾乎以兩個封閉但重疊的簇的形式出現:

當空間中的一個數據點與另外一個不一樣顏色的數據點重疊時,咱們就須要樸素貝葉斯來完成它的工做。

若是切換到模型測試選項卡,就能夠看到添加的新數據點。

接下來,讓咱們修改已經添加的一些數據點,以顯示任何一個數據點如何變爲假陰性或假陽性。請注意,咱們在開始這個練習時使用了7個假陰性和7個假陽性。

咱們以前所作的數據修改結果以下圖所示。如你所見,咱們如今有額外的誤報:

我將把數據的實驗留給您,並繼續您的樸素貝葉斯學習!

總結

在這一章中,咱們學習了機率論,貝葉斯定理,樸素貝葉斯定理,以及如何將其應用於實際問題。咱們還學習瞭如何開發一種工具來幫助咱們測試分類器,並查看咱們的數據是否包含任何假陰性或陽性。

在下一章中,咱們將深刻探討機器學習的世界,並討論強化學習。

轉載請註明出處:http://www.javashuo.com/article/p-rktegeet-et.html 

文章發表的另外一個地址:https://blog.csdn.net/wyz19940328/article/details/85863533

相關文章
相關標籤/搜索