前言
很久沒寫博客了,一直想把自己的一些知識進行沉淀,畢竟時間久了,就很容易忘記。所以想了想,為了不讓自己忘記,干脆就寫成博客,還可以和大家一起探討和學習,於是我決定在周末空余時間寫寫關於人工智能與機器學習應用系列的文章,今天就從最簡單的機器學習模型開始。
問題起源
求解多元一次方程的解似乎看起來不是一件很難的事情,可以通過方程組的合並求解,從技術可行性上是完全沒有問題的,但是能否有一個通用的模型幫助我們去求解多元一次方式呢?例如給定下列方程:
5x+ 2y = 10
x + 4y = 11
通過方程組的合並消元求解,則很容易得 x=1,y=0.25。如果寫一個求解的該二元一次方程的求解函數,似乎也不是什么難事,但是如果變量不只是兩個,對方程組合並消元的復雜度則會加大,甚至造成程序的可讀性也變差。
機器學習的核心思想源自於數學,方程組合並消元的方法只是數學中人們總結的技巧,但並不是方程組求解的原始思路,此時此刻,我們需要借助最原始的數學思維幫助我們建立一個數學模型,輔助求解多元一次方程組。
問題抽象
我們將公式進一步抽象,變成程序可理解的數組,如下
5x+ 2y = 10 轉變為數組[5,2,10]
x + 4y = 11 轉變為數組[1,4,11]
我們希望有一個數學模型的輸入是兩個數組:[5,2,10],[1,4,11],輸出是方程求解的數組[1,0.25]。即希望有下所示的功能,將數學問題轉變了計算機的工程問題,則期望的是如下的工程求解:
// 定義線性方程組求解模型,2表示變量的個數 LinearEquation linearEquation = LinearEquation(2); // 將第一個方程加入到模型中[5,2,10] linearEquation.addEquation(new Double[]{5.0, 2.0}, 10.0); // 將第二個方程加入到模型中[1,4,11] linearEquation.addEquation(new Double[]{1.0, 4.0}, 11.0); // 模型進行訓練 linearEquation.practice(); // 輸出訓練后的x和y的值 System.out.println(Arrays.toString(linearEquation.getVariables()));
模型引入
對機器學習而言,永遠逃不過兩類計算,一個是距離計算,一個是概率計算。而方程式中的x和y我們可以理解為權重,即當x和y為某值時(5x+2y-10) 的距離盡可能短,使得幾乎等於0,同理(x+4y-11)的距離也盡可能短,使得幾乎也等於0,權重或為概率或為距離。類似這樣的計算,很容易想到人工神經網絡。
人工神經網絡可以處理線性與非線性的問題,由於本問題是求解多元一次方程,因此是線性問題,可以采用人工神經網絡中最基本的模型感知器進行求解,感知器是Frank Rosenblatt在1957年就職於Cornell航空實驗室(Cornell Aeronautical Laboratory)時所發明的一種人工神經網絡。它可以被視為一種最簡單形式的前饋神經網絡,是一種二元線性分類器。感知器使用特征向量來表示的前饋神經網絡,把矩陣上的輸入x(實數值向量)映射到輸出值 f(x)上(一個二元的值)。感知器模型如下圖所示:

通過上圖可以看出,感知器模型由一下幾個部分組成:
1. 輸入。輸入主要是包括n個輸入項pi,以及每一個輸入項下對應的權重wi
2. 激活函數。感知器可以靈活選擇激活函數。激活函數給神經元引入了非線性因素,使得神經網絡可以任意逼近任何非線性函數,這樣神經網絡就可以應用到眾多的非線性模型中。
3. 輸出。感知器的輸出則比較容易理解如下公式所示,其中b是偏執項
一個較為實際的理解感知器即為:輸入的x是對結果y的影響參數,但是每一個輸入的x對y的影響都有相應的權重w,最終對y的影響結果則等於每一個輸入與權重之和的累積。
模型應用與求解多元一次方程
感知器的訓練過程是使得對應的w
i處於某值的時候,輸入的x
i能夠得到相應的y,實際也是在求w
i的過程。而在對多元一次方程求解的時候,可以將未知數x
i的系數視為w
i,則多元一次方程是已知w
i,y,求x
i的過程。因此,我們可以將方程中的x
i視為感知器中w
i,方程中的w
i視為x
i,這樣求方程的解,則完全轉變為感知器的訓練過程。而方程式的系數即可為感知器的訓練集。如果方程式有三個未知數,則至少有三個方程(即三個訓練集)才可能獲得解,應用代碼如下所示:
// 方程式一: 10.0*x1+2.0*x2 = 12.0 // 方程式二:1.0*x1+1.0*x2 = 2.0 // 根據上述方程可知: x1 = 1.0, x2 = 1.0 com.iveely.ml.application.LinearEquation linearEquation = new com.iveely.ml.application.LinearEquation(2); linearEquation.addEquation(new Double[]{10.0, 2.0}, 12.0); linearEquation.addEquation(new Double[]{1.0, 1.0}, 2.0); linearEquation.practice(); Double[] ret = linearEquation.getVariables(); // 計算結果誤差需小於0.1,可以根據學習速率和迭代次數調整精確度 assertEquals(1.0, ret[0], 0.1); assertEquals(1.0, ret[1], 0.1);
歸納總結
這是機器學習中神經網絡最基本的實際應用,感知器能夠解決多元一次方程問題的根本原因也是在於線性可分,理論上其它的機器學習模型也是可以做到。如果方程無解,則可以通過最小二乘法,找到一條最佳的直線,盡可能滿足點的覆蓋。