天天看點

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

作者:一隻愛笑的程式猿
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

首先我們看一下,這個代碼可以看到,上面

import numpy as np 這個numpy是用來做數學計算的包

import matplotlib.pyplot as plt 這個是用來繪圖的.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後接着我們看這裡:

我們準備資料,先得到一個X 這個x,是用np.random.rand(100,1)

産生随機數對吧,我們看看這個rand是怎麼産生随機數的

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

點進去這個rand方法,可以看到,裡面有介紹,說populate,填充,

a uniform distribution 是一個均勻的分布

可以看到是左閉右開的.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

下面還有例子是,np.random.rand(3,2) 這裡,表示的是

生成一個,3行,2列的随機數,可以看到上面也有例子,可以看到,資料的大小是0到1,

左閉右開的一個數.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們再看我們這裡寫的,

X = 2 * np.random.rand(100,1) 這裡 其實就是生成一個,100行 1列的資料,因為我們知道

資料範圍是0到1,是以這2 * 的資料範圍就是0 到2 對吧.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們再來看,這裡

y= 4+3 *X + np.random.randn(100,1) 這個是什麼什麼意思呢?

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

我們看看這個randn這個函數的解釋,可以看到是說是,一個standard normal distribution

是一個标準的,normal distribution 标準的正太分布對吧.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

下面也有例子可以看到,是寫的np.random.randn() 這個直接調用的話,傳回的是:

2.19238753...這樣一個數,這個數是什麼呢?

實際上他就是, x從負無窮到正無窮 ,然後 u = 0 ,方差是1的這樣的一個,正态分布中的一個值,

這裡就是随機取了一個2.19238753...傳回來.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們再看這裡,有個例子是:

N 這裡如果指定. (3,6.25) 意思就是,

u = 3 ,方差等于6.25 這樣一個正太分布中的取值,但要注意,這樣就不是标準正态分布了,

傳回的其實就是,這個正态分布的,x從負無窮到正無窮中的一個取值.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們來看一下,這裡的例子,這個

2.5 * np.random.randn(2,4) +3

這裡就是一個2行4列的, 一個标準正太分布,也就是u=0 方差為1的這個正太分布的值.可以看到.

擷取值,就是一個2行4列的矩陣.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們再來看,下面這個代碼:

y = 4 + 3 * X +np.random.randn(100,1)

這個是什麼?

其實就是y = yhat + e ebuselo對吧,其實就是真實值 = 預測值 + 誤差對吧,

那麼這裡的,np.random.randn(100,1),這個是個标準正态分布中的一組值,我們用它來模拟誤差,我們之前也推導的時候,說過,我們就是假設,誤差是随機的,并且,符合正太分布的,是以,這裡我們用

随機的正态分布的值,來代表這個ebuselo随機誤差,然後我們再看:

y = 4 + 3 * X +np.random.randn(100,1)

這裡預測值是什麼? 也就是4+ 3* X 對吧,那麼這裡的4和3是什麼呢?

也就是我們說的模型對吧.

我們之前說:y = ax +b 那麼,可以寫成 y = ax1 + b x0 ,這裡x0 =1 x1就是我們的資料,是以.

4 + 3 * X = yhat 也就是,x0 * 4 + 3 * X1 ,這裡的X1就是上面我們聲明的那個X對吧.

因而這裡w0 = 4 w1= 3,也就是我們說的模型.

是以這裡我們,其實就是要,利用上面的y = 4 + 3 * X +np.random.randn(100,1) 公式,

我們要通過,不停的輸入我們的x,y的值,然後得到一組組的,模型,也就是w0,w1,讓我們通過

這種方式得到的模型,盡可能w0 = 4 w1=3 就可以了,但是我們為什麼說盡可能?

因為還有ebuselo誤差對吧,要想, y = 4 + 3 * X +np.random.randn(100,1) 成立,

那麼除非,np.random.randn(100,1)取的的随機數全部都是0,這個機率太小了.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

是以我們計算的時候是不可能做到,做到讓w0 =4 w1=3的,除非我們說上面的情況,我們随機出來的

所有誤差都是0,但是那種可能性太低了.

但是我們可以求最優解,讓w0盡可能等于4,讓w1盡可能等于3.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們可以看到,上面其實我們就是得到了,兩組資料而已,一組是x

一組是y ,其中y是真實值,是我們用上面的公式,也就是y = yhat + ebuselo誤差得到的

,我們有了x,y的一組資料,那麼我們把資料帶入到,

seta = (XT*X)^-1 *XT*y 這樣的損失函數,我們說,通過線性代數的方法,我們就可以一步把解析解,

解出來.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們再來繼續看,這裡x_b = np.c_[np.ones((100,1)),X]

這個是什麼意思呢?

注意首先這裡的np.c c是combine是連接配接的意思,那麼,這裡,他其實就是要把x0,和x1,連接配接起來,

是什麼意思呢?

這裡的x0,我們說恒為1,也就是100行,1列,全部是1,是以,這裡 np.ones(100,1) ,就是擷取100行

1列的1,然後X呢? 是上面我們得到的,一個符合100行,1列的一個随機數,是以,現在我買通過

np.c得到的就是一個矩陣,一個100行,兩列,其中第一列全部是1的這樣一個矩陣.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們可以看到上面我們已經把x_b,這個變量列印出來了,是以我們執行一下看看,就可以看到

得到了一個矩陣,100行,兩列,第一列全部是1的矩陣.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們再來看,下面的一行代碼:

theta_best = np.linalg.inv...

這裡的np.linalg是什麼呢,我們點進去看看.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

可以看到這個np下面的,linalg,其實是 linear algebra對吧,也就是線性代數工具對吧.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們回過來再看看,下一步.

這裡

theta_best = np.linalg.inv(x_b.T.dot(x_b)).dot(x_b.T).dot(y)

這裡,我們首先看,這裡np.linalg.inv,這裡我們說linalg是線性代數工具,然後,這個inv是什麼意思呢?

其實就是inverse,取逆的意思,我們再看看,我們損失函數的,線性代數的表達那個公式:

theta = (XT.X)^-1 .XT.y 這個公式對吧.是以對應到這裡就是:

注意這裡的 (XT.X)^-1,也就是:

x_b.T.dot(x_b) 其實就相當于XT.X,這裡的 x_b.T,其實就是,x_b的轉置,然後.dot,指的是乘的意思,

是線性代數裡的乘,可以看到後續就很清楚了,其實就是

theta = (XT.X)^-1 .XT.y 把這個函數,用,np工具中的,線性代數表示了一下,然後,我們再去

執行,可以看到這個損失函數的,最優解就被計算出來了.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

是以可以看到這裡得到的結果,其實,3.839...就是我們說的w0也就是4,那麼3.2267...就是我們上面說的w1,也就是3,也就是說,但我們的,這兩個模型是,w0 = 3.839... w1 = 3.2267...的時候,我們的

資料帶入進去以後,預測到的結果可以使得誤差最小.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

那麼這裡我們可以看到計算的很快對吧,但是實際上,是因為我們的次元隻有2個次元,x0,x1,而且

我們的資料比較小,但是實際上的應用中,往往可能考慮上億個參數,也就是,x0到x1億,

并且矩陣也很大,這時候如果再用一步求解的方式,用這個線性代數的方式就很費勁了.

算不出來了. ,還有就是我們的資料比較少,隻有,100組資料對吧

如果資料規模特别大,那麼也很難直接通過解方程的方式得到解析解.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

而我們說在人工智能的時代,做預測實際上是資料為王的,也就說,隻有資料量大結果才準參數越大,

結果才準,是以說,這個也是有沖突的地方. 一方面資料量大直接解方程出不來結果,一方面又必須資料量大,才有意義,是以有了下面的方法.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

在說方法之前,我們先來看一下,上面我們已經通過解方程的方式,得到了,兩個權重,或者說叫做

模型W0,W1,那麼有了這個W0,W1,我們就可以去驗證一下我們做出的預測對不對,

y = w0 * x0 + w1 *x1 這裡我們有了,w0,w1,是以我們這裡再準備x0,x1就可以了,我們說

x0是1,是以這裡我們先準備x1可以看到上面,x_new = np.array([0],[2]),我們這裡生成了,0,2這樣一個

兩行一列的資料對吧,

然後我們再:

x_new_b = np.c_[(np.ones((2,1))),x_new] 其實就是把 1,1 和0,2 連接配接起來對吧

生成兩組資料,也就是:

1 0

1 2

這樣一個矩陣.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

這裡我們有了準備的x資料了,然後我們又知道,x.seta =y 為什麼會有這個公式了?

因為我們知道損失函數是:seta = (XT.X)^-1 . XT.Y 也就是

seta = 1/XT.X .XT.Y 是以簡化後就是 seta = Y/X

也就是說X.seta =Y

而seta這裡其實就是指的我們求出來的,那組模型對吧.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

可以看到這裡的X.seta =y hat 其實就是得出的預測值,

因為這裡的X,我們說是一個m行n列的矩陣,然後乘以seta,這裡的seta,其實就是n列的模型對吧,

這裡是w0,w1,是以m行 n列的x資料,再乘以n列的模型資料,就得到了預測值,其實也就是

y = w0x0 + w1x1 這樣對吧.因為這裡的seta,我們知道,其實就是我們通過解方程得到的,最優解,也就是模型對吧.

然後我們去執行去看看結果:

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

可以看到這裡執行以後得到的預測值,這裡是4.00153876對吧,yhat1,

我們看看,因為我們這裡x0是1,是以y=4+3*x +np.random.randn(100,1)

y = 4 x0 + 3* x1 +np.random.randn(100,1)

這裡我們知道x0 =1 x1,我們第一組資料取的是0,第二組是2對吧

是以帶入就是y =4+ 0 +np.random.randn(100,1)

是以可以看到,得到并不是4,真實值是4對吧,因為我們說,這裡是有誤差的,是因為我們得到的w0 和w1模型有誤差對吧

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

可以看到得到w0是4.0015...w1是2.978...并不是4,3對吧,是以說有誤差的.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後下一步,我們用圖形來表示一下,這個結果,可以看到

這裡plt是個繪圖的庫,plt.plot是(x_new,y_predict,'r-')這個意思是說,

在圖形上用r就是red紅色,并且用-直線來畫圖,來表示第二次我們造的測試資料,

我們通過第一組測試資料得到的w0,w1,然後把第二組資料帶入,就得到了用我們的

模型得到的預測值.

然後plt.plot(x,y,'b.'),b就是blue就是用藍色的.線 點線來表示,第一次我們造的測試資料

也就是第一組資料,我們通過這一組資料得到了w0 和w1,這個模型對吧

然後plt.axis([0,2,0,15]),就是說x軸是0到2,y軸是0到15

然後我們執行去看看.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

可以看到上面藍色的點就是,我們第一次的測試資料對吧,而第二次我們是根據得到的

w0,w1這個模型,得到的一個預測值,也就是紅色的那根線對吧.是以呢,可以看到

這個紅色的預測值,實際上,也就是模型,可以保證,圖上的所有點,到紅線的距離,加起來平方加和,然後

得到的值最小對吧,也就是誤差最小.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們繼續看,如果我們再去執行一遍的話會看到得到的結果跟原來不一樣了

這個是為什麼呢

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

很簡單因為我們的資料是随機出來的對吧,可以看到上面x,y值,是随機的,是以每次都不一樣,是以

每次出來的圖形也是有所不一樣.

但是預測值可以看到都是差不多的對吧.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們再來看下一個比較重要的概念,因為我們說,

利用一次性解出答案的方式,不是不行,但是往往因為我們的資料參數太多,導緻,解公式太複雜

而不能得到結果.是以就需要用到梯度下降法.

首先可以看到我們的公式中:

seta = (XT.X)^-1 . XT.Y 這個是損失函數,那麼如果我們這裡隻看:

XT.X 這裡我們分析一下,實際上,這個是兩個矩陣相乘,也就兩個對稱矩陣,因為XT是X的轉置.

那麼這個時候複雜度就是ON的3次方什麼意思? 也就是如果X的特征數量翻倍,那麼計算時間大緻上要是2的三次方,也就是說是8倍,是原來資料的8倍.

也就是說:

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

比如你的參數是2個的話那麼,需要2s的計算時間,如果是4個的話,需要的時間就是16秒

是比原來2的時候多了,2的三次方也就是8倍的慢 2*8 = 16, 如果是8個的話,需要的時間就是32秒,比原來2的時候多了,2的三次方8倍的慢, 2個八倍的慢 ,也就是 2* 16 = 32s

當然如果這裡說,8000個參數呢?那需要花費的時間就不可想象了.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

是以這裡我們可以用梯度下降法來解決這個問題,怎麼弄了?

可以看到首先,我們知道y = x^2 是一個凸函數,對吧開口向上的,它有極小值,這個要知道,

然後我們再來看我們的損失函數:可以看到J(seta) = E(i=1到m)(yhat-yi)^2 這個損失函數

跟上面我們計算seta一樣,這裡的seta也就是我們說的,去根據公式計算w0,w1...模型對吧

也就是說,我們的seta,模型定了以後,就會得到一個j(seta) 這個函數的值,然後seta也就是

這個另一組模型定了的話,我們又可以得到一個新的j(seta)值,這樣的話,我們就可以根據

模型中w0,w1..也就是seta,得到很多的j(seta)值,最終,我們可以畫出來上面的那樣的圖

可以看到,下面的最小值,的時候,損失函數的值最小,這個時候對應的w0,w1...對應的seta

模型也就是我們要找的模型了.

這樣的方法是一步步來找到最優解的,不用一次性利用線性方程求解的方式來求解析解,

這樣就可以對一些,要花很長時間來求得解析解的方程,來通過這種方式,逐漸得到最優解了.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

這是因為首先我們知道,損失函數J(seta) = E i=1到m (y hat -yi)^2 我們知道這個函數是一個凸函數,

是以,當我們有一個seta的值的時候,就會通過這個函數得到一個J(seta),這就相當于y = x+b,一樣的,

有了一個x就得到一個y,隻不過這裡是,有了一個seta 就有了一個J(seta),有了這個關系就可以畫出,

這個函數曲線,可以看到,函數曲線就是上面這個樣子的,至于為什麼說這個函數是個凸函數呢?

因為我們都知道y=x^2 是 凸函數,右上角那樣畫出來對吧,這個J(seta) = E i=1到m (y hat -yi)^2,

是以也是凸函數了.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們來看這裡,我們說損失函數是一個,凸函數,可以看到凸函數,隻有波谷,如果有兩個波谷可以看到,跟下面那個圖

一樣就不是凸函數了,凸函數隻有一個最小值. 非凸函數可能有多個,比如,下面那個圖,右邊那個是全局最小值,然後

左邊那個是局部最小值.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

這裡,首先我們要知道,這個圖形對應的函數是

損失函數也就是J(seta) = E i=1到m (yi - x.seta)^2 對吧其實就是.

E i=1到m (yi-yhat)^2 這裡的yhat 其實就是x.seta 對吧,因為我們知道,y = ax+b

其實可以寫成y = a.x1 + b .x0 這裡我們把x0設定為一個固定的值,是以這裡的x0設定為0,

是以就可以認為是y = a.x1對吧,是以這裡就可以寫成 x.seta = yhat 對吧

然後我們再看,梯度下降法,就是剛開始我先給seta 初始化一個任意值,這個值是 (-無窮 到 +無窮),比如

可以看到我初始化了一個,上圖左側的random initial value 這個值,然後,帶入我們的損失函數,就可以得到

J(seta) 也就是,對應的cost函數的值,也就是得到了y的值,也可以認為,然後我們,在這個點,畫出一個

切線,這個切線這裡,有一個斜率對吧,這個斜率,就是對這個切線求導得到的,可以看到在最小值的左側的時候,

這個斜率,也就是這個切線的倒數,我們寫成縮寫g, 求g,也就是gradient,就是求導的意思,這個導數,在最小值

左側是時候是小于0的對吧.

然後,我們有一個公式:seta t+1 = seta t - g.阿爾法 這裡我們知道,我們找的這個seta值,比如是seta t,那麼

我們這裡減去此時的,把seta t帶入損失函數得到的,j(seta)對應的斜率, 可以看到,其實就是減去一個小于零的數

對吧,減去小于零的數,那麼,seta t+1 就會變大對吧,是以,這樣我們就得到了,seta t+1 ,也就是...我們取的seta值

就慢慢往右靠了,可以看到,往右靠,其實就是接近最小值了對吧.

然後seta t+1帶入到損失函數,可以看到又得到一個j(seta) t+1 對吧,就相當于,y值向下了,就跟下山一樣,

這個叫做梯度下降法.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們第一步用初始化的seta值,得到了對應j(seta)

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們再去,根據seta t+1 = seta t-g 阿爾法

根據這個,來去計算出seta t+1的值,然後再帶入,損失函數,然後繼續計算j(seta) t+1 ,這個時候,

seta的值就會一點點,往右移動,越來越接近 最小值時候的seta值.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們得到seta t+2 以後,然後再帶入到,seta t+2 = seta t+1 - g阿爾法

就這樣一步步,梯度下降,慢慢像最小值靠攏.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後這裡要注意這裡,seta t+3 = seta t+2 -g阿爾法

這裡的這個阿爾法...這個被稱為學習率

什麼意思呢? 這個決定了,seta t+1 的跨度,如果 這個學習率,值特别大的話,可能,得到seta t+1 一步就跨到,最小值右邊去了

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

可以看到如果學習率,很大,得到的seta t+1 的值,就會很大,那麼很可能會一步就跨到了

最小值seta的 右邊去了,然後 ,這個時候右邊的這個斜率可以看到,就會是大于0的了,那麼

把這個斜率大于0的斜率,帶入到 seta t+1 = seta t -gh 中,帶入到裡面以後, 這個時候,因為g斜率是大于0的,是以

得到的這個seta t+1 ,就變小了這個時候,是以這個時候,seta t+1的值,就會變小了,也就是

會往左移了,可以看到,不管怎麼做,其實...這個方法,都會,讓seta 自動的,往,最小值靠攏對吧...

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

但是這裡就要知道了,

如果seta t+1 = seta t - g阿爾法 如果,這個阿爾法學習率,太大的話,就會引起, seta 一會走到了,最小seta值的,左邊,一會

走到了最小seta值的右邊,就會引起震蕩.

如果阿爾法這個,學習率的值,太小的話,那麼就會導緻,走得慢對吧,走得慢,那麼疊代次數就多

疊代次數多,那麼運作的就慢,學習的就慢.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

這裡還要知道一點,就是,這個 seta t+1 = seta t - g阿爾法 這個阿爾法的值,被稱為 學習率我們知道了,其實每個公司,

這個學習率的設定,都可以說是公司機密了,怎麼設定,能讓這個學習,次數少,疊代次數少,更快獲得結果,消耗的資源

也更少, 這個學習率很重要

這個學習率也叫做 haperparameter 超參數也叫做,然後還有一個的,由于,切線的斜率,往往不可能最後,會等于0,

那麼這個時候,我們就會指定一個值,這個值叫做threadhold 門檻值, 這個g=0,是不可能的在實際中,是以

比如我們指定,當g < 0.15的時候,我們就認為,可以了,學習到位了...可以用來預測了...就是 g< threadhold

的時候就可以了..當然這個0.15 是我們指定的.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

是以可以看到,其實梯度下降法,就是,4步

1.初始化一個seta值

2.求目前是seta值對應的y值 也就是j(seta) 的值,然後求出,這個點,對應地方的斜率 g

3.然後利用seta t+1 =seta t -g阿爾法u 來計算seta t+1 然後再帶入2中計算,循環往複

4.直到收斂 斜率的值 小于等于門檻值的時候 就完成了.

這裡這個seta t+1 =seta t -g阿爾法u 這裡的阿爾法u這裡,成為haperparameter 超參數,這個

超參數決定了,這個解析解求算的速度對吧,如果太大我們說會震蕩,太小,可能疊代次數就越多,是以這個超參數的選擇

很重要,這也是各個公司的秘密所在了.

然後這裡的斜率,也就是梯度,如果随着不停的計算,快要等于0了,這個時候就說明,這個就已經符合我們的

要求了,但是這個梯度一般很難達到0,那麼這個時候就需要有個門檻值,這個門檻值也是一個超參數,叫做threadhold

,比如我們規定這個門檻值小于0.15就夠用了,能預測的足夠準了比如說.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後這裡其實梯度下降法就是一個試的過程,通過不斷的嘗試,來得到一個相對精确的可用的模型,其實

現實生活中我們也往往都是通過不停的嘗試,最後得到一個模型.或者規律

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們說梯度下降法實際上就是利用了導函數對吧,利用了斜率

利用了損失函數的 的斜率

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

可以看到損失函數上面,這個函數我們經過一次變化

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

對他進行求導就可以得到:

j(theta) = (yihat -yi) ^2 對吧 我們就求這個導函數,斜率最下的時候就可以了,也就是,

j(theta) 幾乎等于0的時候,對應的theta值其實就是,對應的w,權重參數對吧.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

這裡我們再說一個架構,這個scikit-learn架構

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

可以看到這裡scikit-learn 這裡包含了,求解析解的函數了,

求導函數的,解析解 已經包含到這個包裡了

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

可以看到也是開源的

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

這裡我們可以不用自己,調用np的線性代數等方法,自己去利用,損失函數去計算了

我們利用scikit-learn會更簡單,因為它裡面提供了,直接計算解析解的方法

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

我們可以看一下,這裡我們要用到np 導入這個包,還有導入sklearn.linear_model import LinearRegression

LinearRegression 這個就是,線性回歸,是sklearn給封裝好的,我們直接用就可以了,可以看到這一下代碼就簡單多了

這裡還是準備 x, y 資料,然後,帶入函數是損失函數的導函數,一步計算最小值

可以看到這裡,先擷取了LinearRegression線性回歸這個類的,執行個體,然後直接調用.fit(x,y) 就可以了

這個.fit 就是,直接一步求出解析解的方法,這個.fit 類似于spark中的,train,訓練的意思對吧,然後,這個訓練以後,就可以

直接列印出結果了,上面這個,就是..

通過lin_reg.intercept_,lin_reg.oef_

這個,其實就是lin_reg通過這個執行個體,列印出結果對吧,這個結果 可以看到lin_reg.intercept_,這個是截距,

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

截距其實,就是實際值,到預測值的距離,也就是說,預測值+截距 =實際值

也就相當于w0 ,然後 ,lin_reg.oef_ 就相當于 w1,w2,w3...這樣,這要看我們的,函數是幾元的,

對吧,幾元就會輸出幾個.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

可以看到這裡我們直接調用lin_reg.fit(x,y) 可以看到就一步給算出解析解了

可以看到是4.07.. 2.96...很接近 4,3了對吧

這裡為什麼不是等于4,3 因為我們的y x 後面,添加了随機數了對吧.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

然後我們再看看,如果我們通過求解析解的方式,得到了W0,W1了,然後,我們再進行,有新的資料預測是時候,

我們就可以直接lin_reg.predict(x_new) ,就可以用來做預測了對吧

就相當于帶入新的資料,來預測y值了.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

實際上這個sklearn架構在你安裝Anaconda的時候就自動提供了對吧.這個anaconda是蟒蛇的意思.

純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集
純手動搭建大資料叢集架構_記錄008_搭建Zookeeper叢集

​編輯

總結一下學的内容.

繼續閱讀