<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 測試運行 - 使用 C# 實現線性判別分析 通過?[James McCaffrey](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=James+McCaffrey)?| 2015 年 10 月 |獲取的代碼:?[C#](http://download.microsoft.com/download/B/1/2/B1270324-5ED1-4FB4-9DEC-7F92DDE4D952/Code_McCaffrey.TestRun.1015.zip)[VB](http://download.microsoft.com/download/B/1/2/B1270324-5ED1-4FB4-9DEC-7F92DDE4D952/VBCode_McCaffrey.TestRun.1015.zip) 二進制分類問題的目標是變量的預測在兩個可能值之一可以執行的值。例如,您可能想要預測股票價格的一些公司 (增加或減少) 中基于預測值變量平均共享已銷售的數,深入了解事務,與收入的比率的價格數,等等類似的更改。或者您可能想要預測某人 (自由或保守) 政治傾角基于年齡、 收入、 教育水平,等等。 中有大約十幾個可用于二進制分類的主要算法。線性鑒別分析 (LDA) 是一種最早的方法,可以追溯 1930s年。這篇文章說明了什么 LDA,介紹其工作原理以及演示如何使用代碼實現 LDA。 實際上,不太可能您將需要編寫 LDA 代碼。不過,有三個原因您可能會發現這篇文章很有用。首先,了解如何進行編程 LDA 為您提供全面掌握如何 LDA 以防您曾經遇到過它的工作原理。第二,一些實現 LDA 時使用的編碼技術可以是其他,更常見的編程方案中非常有用。最后,LDA 理念是非常聰明,您可能發現 LDA 有趣本身。 若要獲得有個大概了解是哪些 LDA 二進制分類并查看本文所述觀點的最佳方法是看一下在演示程序?圖 1。 ![](https://box.kancloud.cn/2016-01-08_568f4ae72bff2.png)? 圖 1 線性 Descriminate 分析二進制分類演示 演示程序的目標是預測政治傾角,自由或保守的基于此人的存在時間和年收入的人員。演示使用隨只是八個項的一個小的定型數據集來創建 LDA 預測模型。Age 和 income 具有已規范化以某種方式,以便其數量級都大致相同。 因此,該自由是 0,保守為 1 已編碼政治傾角。與許多的二進制分類算法不同 LDA 還可以使用任何類型的編碼為變量來預測。因此政治傾角可能已編碼為"-1 和 + 1,或 A"和"B"。 基本 LDA 二進制分類可以處理任意數量的預測值的變量。并且可以擴展基本 LDA 來預測可采用三個或多個值之一的變量。例如,您可以預測政治傾角其中可能的值為自由、 保守和中等。本文介紹了僅二進制分類。 LDA 的關鍵是那個叫做線性鑒別,通常由小寫"w。 使用八個數據項,演示計算 w = (-0.868,-0.496)。W 數組將具有相同數目的值有預測值的變量。在計算 w,在后臺演示計算了一種方法的每個兩個類,然后使用了一種方法來計算每個類的散點圖矩陣并最后使用散點圖矩陣來計算類組合在散點圖矩陣。類中矩陣需要計算 w。 計算 w 后, 演示使用它來預測類新人員具有規范化 age = 4.0 和規范化收入 = 5.0。LDA 預測是該用戶可進行自由政治傾角。 本文假定您已至少中級編程技能,但不會假設您知道有關 LDA 分類算法的任何信息。此演示編碼使用 C# 中,但如果您想要重構為其他語言 (如 Visual Basic.NET 或 JavaScript 代碼應當不會多大力氣便。 ## 了解 LDA 二進制分類 中所示的兩個圖形說明了 LDA 二進制分類確保主要思想盡可能?圖 2。上面的圖表顯示了演示程序中的數據。三個藍點形式表示三個是自由的人。五個紅色的點是 conservatives。處的黃色點 (4.0、 5.0) 表示具有未知政治傾角的用戶。即使對于這樣的簡單問題不明顯如果未知的人員應為自由或保守的分類。 ![](https://box.kancloud.cn/2016-01-08_568f4ae76a4fd.png)![](https://box.kancloud.cn/2016-01-08_568f4ae776aa3.png)? 圖 2 LDA 預測使用鑒別向量 請注意的唯一原因數據可以繪制圖形中所示的演示?圖 2?是只有兩個預測值的變量。如果有兩個以上的預測值變量,它不是可能要查看的數據這樣很好地在 2D 圖形中,但該原理同樣 LDA 將適用。無論在二進制 LDA 中有多少個預測值變量,將僅有兩個類。很容易混淆的與要預測的變量可以采取 (總是正好兩個二進制分類) 的值的數目的預測值變量 (兩個或多個) 數。 大部分二進制分類算法將嘗試查找明確分隔兩個類的行 (從技術上講是向量)。例如,在上面的圖表中?圖 2, ,您可以想象一個假想分隔從有關運行的行 (3,9) 到 (5,0)。左側顯示行的任何未知的數據點將被歸類為自由,而右端上的任意點將是保守的。LDA 工作完全不同的方式。 LDA 的第一步是找到一條稱為鑒別線。在?圖 2, 、 鑒別行是為的綠色以及標識為鑒別 (0.868,0.496)。在 LDA,鑒別行始終由單個的終結點標識和起始點始終是隱式 (0,0,。。,0)。 但稍等一下 ;在演示程序的輸出?圖 1?顯示鑒別是 (-0.868,-0.496) 而不是 (+0.868,+0.496)。事實證明,乘以任何常量的鑒別組件并將對結果沒有影響。因此,若要使在下方的圖形?圖 2?看起來好多了,為了說明此重要的想法,我使用 (+0.868,+0.496) 對于 w 而不是實際的計算的值,這是負數。換而言之,我可以這兩個組件乘以-1。 另一個角度來講,鑒別可標識在綠色線條上的任何點?圖 2, ,例如-2 * (-0.868,-0.496) = (1.736,0.992)。在 LDA,標準版,但決不通用,方法是擴展鑒別以使其具有從原點長度為 1。請注意,長度從 (0,0) 到 (0.868,0.496) = sqrt ((0-0.868) ^2 + (0-0.496) ^2) = sqrt (0.754 + 0.246) = sqrt(1.000) = 1。 但鑒別矢量的意義是什么? 在?圖 2, ,有來自投影到鑒別行,與鑒別垂直虛線在哪里上每個數據點的黑色虛線。事實證明,鑒別是有一行,在開頭 (0,0),同時最大限度減少為每個類中,預計的點的距離和最大化投影的點的兩個組之間的距離。這一想法根本不是顯而易見的。 好了,但即使就可以計算一組數據的鑒別向量,它是在仍不清楚如何鑒別可以用來進行預測。在?圖 2, ,紫色的菱形標記為"是指"是兩個類表示的平均數據點。您可以看到平均值是數據點的兩個組之間的中間位置。現在假設向下移到綠色鑒別一行紫色的平均值為垂直虛線。有關在處將命中投影行 (5.2、 3.0)。 再假設垂直線從黃色的點進行分類向下移到綠色鑒別一行。由于點進行分類的投影投影的左側與平均值情況下處于打開狀態,因此它更接近于自由數據點的投影,并因此被歸類為自由。如果從未知點投影到鑒別行曾在投影的另一端上從平均值經歷過,該點將具有已劃分到的那樣保守。令人難以置信聰明的主意。 ## 實現 LDA 二進制分類 與一些 WriteLine 語句刪除和次要的編輯為節省空間的演示程序的整體結構所示?圖 3。若要創建演示程序,我啟動了 Visual Studio 并創建一個新 C# 控制臺應用程序名為 LinearDiscriminate 中。因此應運行任何版本的 Visual Studio,演示并沒有明顯的.NET 版本依賴性。模板代碼載入編輯器后,我將刪除所有 using 語句對頂級 System 命名空間的單個引用除外。在解決方案資源管理器窗口中,我將文件 Program.cs 重命名為 LinearDiscriminateProgram.cs 并允許 Visual Studio 會自動為我中重命名類 Program。 圖 3 總體演示程序結構 ~~~ using System; namespace LinearDiscriminate { ? class LinearDiscriminateProgram ? { ??? static void Main(string[] args) ??? { ????? Console.WriteLine("Begin LDA demo"); ????? // All program control statements here ????? Console.WriteLine("End LDA demo"); ????? Console.ReadLine(); ??? } ??? static int Prediction(double[][] data, ????? double[] x, double[][] w) { . . } ??? static int Prediction(double[][] data, ????? double[][] x, double[][] w) { . . } ??? static double[][] Mean(double[][] data, ????? int c) { . . } ??? static double[][] Discriminate(double[][] data, ????? bool unitize) { . . } ??? static double[][] ScatterWithin(double[][] data) { . . } ??? static double[][] Scatter(double[][] data, int c) { . . } ??? static double[][] Unitize(double[][] vector) { . . } ??? // Matrix helper methods here ? } } // ns ~~~ 演示程序雖太長,無法提供完整地在這里,但您可以在本文附帶的下載中找到的完整源代碼。我使用一種靜態方法的方法而不是面向對象的編程方法。 Main 方法首先設置硬編碼八項定型數據集中到一個數組的數組樣式矩陣: ~~~ double[][] data = new double[8][]; data[0] = new double[] { 1.0, 4.0, 0 }; data[1] = new double[] { 2.0, 2.0, 0 }; // Etc. for [2] through [6] data[7] = new double[] { 9.0, 8.0, 1 }; ShowMatrix(data, 2, true); ~~~ 在非演示方案中,可能會讀取到內存中使用一個名為某些方法的文本文件中的數據像 LoadData。計算鑒別執行如下所示: ~~~ double[][] w = Discriminate(data, true); Console.WriteLine("Discriminate is: "); ShowMatrix(w, 6, true); ~~~ 請注意鑒別方法的返回值是數組的數組矩陣而不是一個數組。在 LDA 中使用的操作的大多數都是矩陣操作如矩陣乘法和矩陣反轉。在這里,而不是具有兩個單元格的數組,w 是具有兩個行和一列的矩陣。這樣一列的矩陣有時稱為列矢量。除非您通常要使用矩陣,可能需要一段時間才能獲取習慣于使用它們 (而不數組。 在?圖 1, ,您可以看到多個中間對象將計算并顯示。顯示語句位于方法 Discriminate 和其幫助器方法和主要是為了幫助您了解 LDA。您可能會在生產代碼中刪除顯示語句。 設置項來預測這些語句包括: ~~~ double[] x = new double[] { 4.0, 5.0 }; Console.WriteLine("Predicting class for Age Income ="); ShowVector(x, 1); ~~~ 在這里,為調用方便起見,要預測的項位于在普通的數值數組中,盡管它將具有更高版本轉換為一個列的矩陣。預測語句是: ~~~ int c = Prediction(data, x, w); Console.Write("Predicted class: " + c); if (c == 0) ? Console.WriteLine(" (liberal)"); else ? Console.WriteLine(" (conservative)"); ~~~ 預測方法接受數據矩陣以計算平均值平均值中所示?圖 2。此方法還要求要預測的項、 x 和鑒別向量,w。 ## 計算鑒別 方法鑒別計算 LDA 鑒別向量。代碼中,使用 WriteLine 和顯示的語句中刪除,則非常短因為大部分工作通過幫助器方法: ~~~ static double[][] Discriminate(double[][] data, bool unitize) { ? double[][] mean0 = Mean(data, 0); ? double[][] mean1 = Mean(data, 1); ? double[][] Sw = ScatterWithin(data); ? double[][] SwInv = MatrixInverse(Sw); ? double[][] diff = MatrixSubtract(mean0, mean1); ? double[][] w = MatrixProduct(SwInv, diff); ? if (unitize == true) return Unitize(w); ? else return w; } ~~~ 鑒別 LDA 背后的數學函數是相當復雜,但結果卻相當簡單。幫助器方法平均值計算給定類 (0 或 1) 的平均數。例如,該表示自由 (類 0) 的三個數據項是 (1,4),(2,2) 和 (3,3)。其平均值為 ((1 + 2 + 3) / 3,(4 + 2 + 3) / 3) = (2.0,3.0)。 散點圖中矩陣是度量值的變量數據集的方式。使用了兩個類一種方法、 mean0 和 mean1 和散點圖中的矩陣 Sw 手中,鑒別就是軟件的逆和矩陣之間 mean0 mean1 的差異的矩陣乘積。 您可以找到介紹派生的計算公式為鑒別相當復雜數學 Internet 上的多個資源。請注意 w 派生的許多不同版本。特別是,您可能會看到對協方差和以散點圖之間 (Sb) 的引用。協方差是相當于散點圖中的數學實體。散點圖之間是鑒別 LDA 的公式派生中使用的數學實體,但散點圖之間不顯式使用計算鑒別或進行預測。 方法區分具有名為 unitize 的布爾參數,該值指示要擴展到單位長度,也就是說,長度等于 1.0 鑒別。在大多數情況下您想要傳遞的是 true 作為相應的參數。 ## 進行預測 演示程序雖有兩個重載的預測方法。第一個接受項來預測,x,作為正常的數值數組: ~~~ static int Prediction(double[][] data, double[] x, double[][] w) { ? double[][] xm = MatrixFromVector(x); ? return Prediction(data, xm, w); } ~~~ 此版本的預測用于調用方便起見,只是執行工作的預測的版本周圍的包裝: ~~~ static int Prediction(double[][] data, double[][] x, double[][] w) { ? int dim = data[0].Length - 1; // at least 2 ? double[][] wT = MatrixTranspose(w); // 1 x d ? double[][] m0 = Mean(data, 0); // d x 1 ? double[][] m1 = Mean(data, 1); // d x 1 ? double[][] m = MatrixAdd(m0, m1); // d x 1 ? m = MatrixProduct(m, 0.5); // d x 1? ? double[][] tc = MatrixProduct(wT, m); // ((1xd)(dx1) = 1 x 1 ? double[][] wTx = MatrixProduct(wT, x); // (1xd)(dx1) = 1 x 1 ? if (wTx[0][0] > tc[0][0]) return 0; else return 1; } ~~~ 方法預測計算 w 轉的置以便可在矩陣乘法。計算兩個類的方法,則這些兩種方式的平均值為組件的每個值乘以 0.5 來計算并隨后存儲在矩陣中 m。 矩陣 tc 是閾值常量和是鑒別矢量、 wT 和類方法中,平均值的轉置的乘積 m。矩陣 tc 將始終為 1 x 1 矩陣中,持有單個值。值在矩陣中 tc 表示到鑒別向量的平均投影。 投影要預測的項,x、 到鑒別向量計算與此類似,為鑒別向量和 x 的轉置的矩陣乘積。遺憾的是,因為的鑒別投影可以是正數或負數、 要占用更少的布爾值的比較運算符的或更高-比問題問題而異。最簡單的方法是嘗試更高-比并查看其是否達到了有意義的結果。您以編程方式可以確定哪種運算符若要使用,但該方法將添加更多代碼的速度比您所料。 在進行預測時的一個選項是通過考慮到每個類的概率調整為類表示平均值的投影。此調整因素是 log(p0 / p1),其中 p0 是類 0 的概率并且 p1 是類 1 的概率。對于演示數據,p0 = 3/8 = 0.375 和 p1 = 5/8 = 0.625,調整因素是 log(0.375 / 0.625) = log(0.6) =-0.22。請注意,如果兩個概率都被認為是相等,則 p0 = p1 和調整因子將是 log(1) = 0。 ## 注釋和限制 有一些實際幾個不同變體 LDA。本文中介紹的一個通常稱為 Fisher 的 LDA。LDA 還可用于功能選擇 (標識哪些預測值的變量最有用,這樣可以忽略不太有用的預測值) 以及分類。請注意其中是在自然語言處理過程中使用完全不同統計 LDA (潛在 Dirichlet 分配)。 盡管 LDA 二進制分類是數學上完善,但它具有幾個關鍵限制。在后臺,不同版本的 LDA 做出各種假設,例如預測值的變量通常是分布式而具有類似協。在許多情況下,這些假設不是 true。即便如此,在實踐中,LDA 時通常非常很好地甚至數學假設不滿足時。另一個數學限制是 LDA 必須計算的散點圖中矩陣反函數。矩陣反轉是一件非常麻煩的過程,并且可以輕松地失敗。 也許 LDA 二進制分類的最大限制是假定兩個類是線性可分離。簡單來說,這意味著,當作為 in 制成圖表圖 2, ,就可以找到一條直線分隔兩個類。很多問題的數據只是不是線性可分離。 在我看來,LDA 二進制分類是太棒了,但有備用的分類算法,值得注意的是邏輯回歸分類和神經網絡分類是更為實用。但 LDA 是確保有趣。 * * * Dr.James McCaffrey?*供職于華盛頓地區雷蒙德市沃什灣的 Microsoft Research。他參與過多個 Microsoft 產品的工作,包括 Internet Explorer 和 Bing。Scripto可通過?[jammc@microsoft.com](mailto:jammc@microsoft.com)?與 McCaffrey 取得聯系。*
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看