前端機器學習——線性迴歸傳送門javascript
機器學習愈來愈火,而做爲一個遊手好閒的前端程序員!我固然要看一下這個機器學習,是個什麼東西。html
咱們用機器學習能夠作什麼呢,他和咱們前端有什麼關係呢? 比方說咱們作一個數據管理平臺,老闆要看數據狀況,獲得一些規律或者信息(幾月賺錢多啊,賣啥賺錢多啊,下個月銷售量估計怎樣啊),這個時候後段給了你之前每一天的各類數據,某某日,啥啥啥,咋咋地買的好很差。咱們不可能就給老闆看這些點,像個芝麻燒餅同樣。因此咱們就須要用到機器學習,將這些點擬合成一條合適的線(最簡單的線性迴歸),就顯得很好。(別問爲啥不是後端返回來線的截距和斜率,問就是自食其力),下面的我就舉一個小栗子,寫一個小demo,經過你不斷選擇色塊,分析你喜歡的顏色特徵,來預測在下一個色塊的選擇中你的選擇是?前端
我是照着python代碼手擼的js版本,其實沒有什麼難度,js與python相比,因爲沒有矩陣,我使用的是二維數組遍歷進行運算的,其餘也沒什麼,下面話很少說,直接貼代碼。java
// python代碼
import numpy as np
def sigmoid(z):
sigmoid = 1.0 / (1.0 + np.exp(-z))
return sigmoid
# 梯度方向
def gradient(X, h, y):
gradient = np.dot(X.T, (h - y)) / y.shape[0]
return gradient
# 邏輯迴歸過程
def Logistic_Regression(x, y, lr=0.05, count=200):
intercept = np.ones((x.shape[0], 1)) # 初始化截距爲 1
x = np.concatenate((intercept, x), axis=1)
w = np.zeros(x.shape[1]) # 初始化參數爲 0
for i in range(count): # 梯度降低迭代
z = np.dot(x, w) # 線性函數
h = sigmoid(z)
g = gradient(x, h, y) # 計算梯度
w -= lr * g # 經過學習率 lr 計算步長並執行梯度降低
return w # 返回迭代後的梯度和參數
//這是我手動選擇色塊獲得的假數據,爲何是三維呢?由於我只存了兩個色塊三原色的差值
x = np.array([
[-255, -255, -255],
[-12, 43, -89],
[-42, -25, 102],
[7, 202, 81],
[142, -67, -120],
[100, 52, -6],
[-19, -41, -24],
[-108, 179, 78],
[-192, 166, 27],
[80, -30, -47],
[53, 38, 140]
])
y = np.array([1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0])
w = Logistic_Regression(x, y)
複製代碼
// js代碼
// 這個是假數據,註釋掉了,由於把它總體封裝成了一個方法
// const x = [
// [-255, -255, -255],
// [-12, 43, -89],
// [-42, -25, 102],
// [7, 202, 81],
// [142, -67, -120],
// [100, 52, -6],
// [-19, -41, -24],
// [-108, 179, 78],
// [-192, 166, 27],
// [80, -30, -47],
// [53, 38, 140]
// ]
// const y = [1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0]
// const z = [-30, 100, -66]
// 入參x是以前色塊的數據矩陣(條件),y是選擇矩陣(結果),z是最後選擇時色塊的色差(最新條件)
export const MySigmod = function(x, y, z) {
//sigmod函數
const sigmod = function(z) {
let c = []
for(let i = 0; i < z.length; i++) {
c.push(1/(1+Math.exp(-z[i])))
}
return c
}
//梯度方向
const gradient = function(x, h, y) {
let g = []
for(let j = 0; j < x[0].length; j++) {
let c = 0
for(let i = 0; i < y.length; i++) {
c = c + x[i][j] * (h[i] - y[i])
}
c = c / y.length
g.push(c)
}
return g
}
//邏輯迴歸過程
function Logistic_Regression(x, y, lr=0.05, count=500) {
let w = []
x.map(item => {
item.push(1)
})
for(let i = 0; i < x[0].length; i++) {
w.push(0)
}
for(let m = 0; m < count; m++) {
let z = []
for(let i = 0; i < x.length; i++) {
let item = 0
for(let j = 0; j < w.length; j++) {
item = item + x[i][j] * w[j]
}
z.push(item)
}
let h = sigmod(z)
let g = gradient(x, h, y)
for(let i = 0; i < w.length; i++) {
w[i] = w[i] - lr * g[i]
}
// l = loss(h, y)
}
return w
}
let w = Logistic_Regression(x,y)
//使用求出的權重係數盡心選擇
let p = w[0]
for(let i = 0; i < z.length; i++) {
p = p + z[i] * w[i]
}
p = 1/(1+Math.exp(p))
return p
}
複製代碼
就算大功告成啦,看一下能不能成功呢!我以前選的都是淺色,因此應該選左面。估計結束! python
那麼它的原理是什麼呢,他怎樣知道我想要的是淺色色塊的呢。 這個就是用到了機器學習中第二基礎的算法——邏輯迴歸(我本身以爲是第二基礎,第一基礎我以爲是線性迴歸,就只是我以爲啊~~),邏輯迴歸是一個名爲迴歸實爲分類的算法,用來二分類,輸出的結果是一個機率(選某一邊的機率),將以前的選擇變成機率,擬合到sigmod函數上,而sigmod函數以下:程序員
而這個z就是咱們熟悉(或者不熟悉)的線性迴歸函數模型了:算法
這就是sigmod函數的圖像,他的輸入範圍是正無窮到負無窮,輸出範圍是0到1,咱們就用它來表明咱們估計的機率,大於0.5我猜選右面,小於0.5我猜選左面(這個0.5不是定死的,在醫療中或者其餘要求偏差較嚴重的方面,這個值徹底能夠是0.3,0.2一類,反正輸出的是機率) 後端
這個公式表示參數𝜃在給定輸出爲x的狀況下的似然函數等於,在給定參數爲𝜃和x{i},的狀況下,取y{i}的機率。注意:此處的豎槓並不表示條件件機率,僅僅是一種取該值的含義。 其中P分爲兩種狀況,P(y=0)=g(z)和P(y=1)=1-g(z),那麼咱們經過整合把它變成一個式子,數組
其中g()就是上面的sigmod函數,z等於w{i}x{i}的累加,θ是w{i}的矩陣,而後將似然函數變成對數似然函數:機器學習
將這個式子稱以-1/m變成梯度降低函數,而後對各個權重求導,獲得對應的梯度(最快降低方向):
具體求導過程能夠去機器學習算法 --- 邏輯迴歸及梯度降低大神的博客那裏看下。 如今咱們也知道了梯度的公式,而後不斷執行直到找到這個函數結果幾乎不變就是咱們想要的點了。