当前位置:科学 > 正文

纯手动搭建大数据集群架构_记录008_搭建Zookeeper集群

2023-03-04 21:00:43  来源:一只爱笑的程序猿


​编辑


(相关资料图)


首先我们看一下,这个代码可以看到,上面


import numpy as np 这个numpy是用来做数学计算的包


import matplotlib.pyplot as plt 这个是用来绘图的.


​编辑


然后接着我们看这里:


我们准备数据,先得到一个X 这个x,是用np.random.rand(100,1)


产生随机数对吧,我们看看这个rand是怎么产生随机数的


​编辑


点进去这个rand方法,可以看到,里面有介绍,说populate,填充,


a uniform distribution 是一个均匀的分布


可以看到是左闭右开的.


​编辑


下面还有例子是,np.random.rand(3,2) 这里,表示的是


生成一个,3行,2列的随机数,可以看到上面也有例子,可以看到,数据的大小是0到1,


左闭右开的一个数.


​编辑


然后我们再看我们这里写的,


X = 2 * np.random.rand(100,1) 这里 其实就是生成一个,100行 1列的数据,因为我们知道


数据范围是0到1,所以这2 * 的数据范围就是0 到2 对吧.


​编辑


然后我们再来看,这里


y= 4+3 *X + np.random.randn(100,1) 这个是什么什么意思呢?


​编辑


我们看看这个randn这个函数的解释,可以看到是说是,一个standard normal distribution


是一个标准的,normal distribution 标准的正太分布对吧.


​编辑


下面也有例子可以看到,是写的np.random.randn() 这个直接调用的话,返回的是:


2.19238753...这样一个数,这个数是什么呢?


实际上他就是, x从负无穷到正无穷 ,然后 u = 0 ,方差是1的这样的一个,正态分布中的一个值,


这里就是随机取了一个2.19238753...返回来.


​编辑


然后我们再看这里,有个例子是:


N 这里如果指定. (3,6.25) 意思就是,


u = 3 ,方差等于6.25 这样一个正太分布中的取值,但要注意,这样就不是标准正态分布了,


返回的其实就是,这个正态分布的,x从负无穷到正无穷中的一个取值.


​编辑


然后我们来看一下,这里的例子,这个


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


这里就是一个2行4列的, 一个标准正太分布,也就是u=0 方差为1的这个正太分布的值.可以看到.


获取值,就是一个2行4列的矩阵.


​编辑


然后我们再来看,下面这个代码:


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,这个概率太小了.


​编辑


所以我们计算的时候是不可能做到,做到让w0 =4 w1=3的,除非我们说上面的情况,我们随机出来的


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


但是我们可以求最优解,让w0尽可能等于4,让w1尽可能等于3.


​编辑


然后我们可以看到,上面其实我们就是得到了,两组数据而已,一组是x


一组是y ,其中y是真实值,是我们用上面的公式,也就是y = yhat + ebuselo误差得到的


,我们有了x,y的一组数据,那么我们把数据带入到,


seta = (XT*X)^-1 *XT*y 这样的损失函数,我们说,通过线性代数的方法,我们就可以一步把解析解,


解出来.


​编辑


然后我们再来继续看,这里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的这样一个矩阵.


​编辑


然后我们可以看到上面我们已经把x_b,这个变量打印出来了,所以我们执行一下看看,就可以看到


得到了一个矩阵,100行,两列,第一列全部是1的矩阵.


​编辑


然后我们再来看,下面的一行代码:


theta_best = np.linalg.inv...


这里的np.linalg是什么呢,我们点进去看看.


​编辑


可以看到这个np下面的,linalg,其实是 linear algebra对吧,也就是线性代数工具对吧.


​编辑


然后我们回过来再看看,下一步.


这里


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工具中的,线性代数表示了一下,然后,我们再去


执行,可以看到这个损失函数的,最优解就被计算出来了.


​编辑


所以可以看到这里得到的结果,其实,3.839...就是我们说的w0也就是4,那么3.2267...就是我们上面说的w1,也就是3,也就是说,但我们的,这两个模型是,w0 = 3.839... w1 = 3.2267...的时候,我们的


数据带入进去以后,预测到的结果可以使得误差最小.


​编辑


那么这里我们可以看到计算的很快对吧,但是实际上,是因为我们的维度只有2个维度,x0,x1,而且


我们的数据比较小,但是实际上的应用中,往往可能考虑上亿个参数,也就是,x0到x1亿,


并且矩阵也很大,这时候如果再用一步求解的方式,用这个线性代数的方式就很费劲了.


算不出来了. ,还有就是我们的数据比较少,只有,100组数据对吧


如果数据规模特别大,那么也很难直接通过解方程的方式得到解析解.


​编辑


而我们说在人工智能的时代,做预测实际上是数据为王的,也就说,只有数据量大结果才准参数越大,


结果才准,所以说,这个也是有冲突的地方. 一方面数据量大直接解方程出不来结果,一方面又必须数据量大,才有意义,所以有了下面的方法.


​编辑


在说方法之前,我们先来看一下,上面我们已经通过解方程的方式,得到了,两个权重,或者说叫做


模型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


这样一个矩阵.


​编辑


这里我们有了准备的x数据了,然后我们又知道,x.seta =y 为什么会有这个公式了?


因为我们知道损失函数是:seta = (XT.X)^-1 . XT.Y 也就是


seta = 1/XT.X .XT.Y 所以简化后就是 seta = Y/X


也就是说X.seta =Y


而seta这里其实就是指的我们求出来的,那组模型对吧.


​编辑


可以看到这里的X.seta =y hat 其实就是得出的预测值,


因为这里的X,我们说是一个m行n列的矩阵,然后乘以seta,这里的seta,其实就是n列的模型对吧,


这里是w0,w1,所以m行 n列的x数据,再乘以n列的模型数据,就得到了预测值,其实也就是


y = w0x0 + w1x1 这样对吧.因为这里的seta,我们知道,其实就是我们通过解方程得到的,最优解,也就是模型对吧.


然后我们去执行去看看结果:


​编辑


可以看到这里执行以后得到的预测值,这里是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模型有误差对吧


​编辑


可以看到得到w0是4.0015...w1是2.978...并不是4,3对吧,所以说有误差的.


​编辑


然后下一步,我们用图形来表示一下,这个结果,可以看到


这里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


然后我们执行去看看.


​编辑


可以看到上面蓝色的点就是,我们第一次的测试数据对吧,而第二次我们是根据得到的


w0,w1这个模型,得到的一个预测值,也就是红色的那根线对吧.所以呢,可以看到


这个红色的预测值,实际上,也就是模型,可以保证,图上的所有点,到红线的距离,加起来平方加和,然后


得到的值最小对吧,也就是误差最小.


​编辑


然后我们继续看,如果我们再去执行一遍的话会看到得到的结果跟原来不一样了


这个是为什么呢


​编辑


很简单因为我们的数据是随机出来的对吧,可以看到上面x,y值,是随机的,所以每次都不一样,所以


每次出来的图形也是有所不一样.


但是预测值可以看到都是差不多的对吧.


​编辑


然后我们再来看下一个比较重要的概念,因为我们说,


利用一次性解出答案的方式,不是不行,但是往往因为我们的数据参数太多,导致,解公式太复杂


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


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


seta = (XT.X)^-1 . XT.Y 这个是损失函数,那么如果我们这里只看:


XT.X 这里我们分析一下,实际上,这个是两个矩阵相乘,也就两个对称矩阵,因为XT是X的转置.


那么这个时候复杂度就是ON的3次方什么意思? 也就是如果X的特征数量翻倍,那么计算时间大致上要是2的三次方,也就是说是8倍,是原来数据的8倍.


也就是说:


​编辑


比如你的参数是2个的话那么,需要2s的计算时间,如果是4个的话,需要的时间就是16秒


是比原来2的时候多了,2的三次方也就是8倍的慢 2*8 = 16, 如果是8个的话,需要的时间就是32秒,比原来2的时候多了,2的三次方8倍的慢, 2个八倍的慢 ,也就是 2* 16 = 32s


当然如果这里说,8000个参数呢?那需要花费的时间就不可想象了.


​编辑


所以这里我们可以用梯度下降法来解决这个问题,怎么弄了?


可以看到首先,我们知道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


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


这样的方法是一步步来找到最优解的,不用一次性利用线性方程求解的方式来求解析解,


这样就可以对一些,要花很长时间来求得解析解的方程,来通过这种方式,逐步得到最优解了.


​编辑


这是因为首先我们知道,损失函数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,


所以也是凸函数了.


​编辑


然后我们来看这里,我们说损失函数是一个,凸函数,可以看到凸函数,只有波谷,如果有两个波谷可以看到,跟下面那个图


一样就不是凸函数了,凸函数只有一个最小值. 非凸函数可能有多个,比如,下面那个图,右边那个是全局最小值,然后


左边那个是局部最小值.


​编辑


​编辑


这里,首先我们要知道,这个图形对应的函数是


损失函数也就是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值向下了,就跟下山一样,


这个叫做梯度下降法.


​编辑


然后我们第一步用初始化的seta值,得到了对应j(seta)


​编辑


然后我们再去,根据seta t+1 = seta t-g 阿尔法


根据这个,来去计算出seta t+1的值,然后再带入,损失函数,然后继续计算j(seta) t+1 ,这个时候,


seta的值就会一点点,往右移动,越来越接近 最小值时候的seta值.


​编辑


​编辑


然后我们得到seta t+2 以后,然后再带入到,seta t+2 = seta t+1 - g阿尔法


就这样一步步,梯度下降,慢慢像最小值靠拢.


​编辑


然后这里要注意这里,seta t+3 = seta t+2 -g阿尔法


这里的这个阿尔法...这个被称为学习率


什么意思呢? 这个决定了,seta t+1 的跨度,如果 这个学习率,值特别大的话,可能,得到seta t+1 一步就跨到,最小值右边去了


​编辑


可以看到如果学习率,很大,得到的seta t+1 的值,就会很大,那么很可能会一步就跨到了


最小值seta的 右边去了,然后 ,这个时候右边的这个斜率可以看到,就会是大于0的了,那么


把这个斜率大于0的斜率,带入到 seta t+1 = seta t -gh 中,带入到里面以后, 这个时候,因为g斜率是大于0的,所以


得到的这个seta t+1 ,就变小了这个时候,所以这个时候,seta t+1的值,就会变小了,也就是


会往左移了,可以看到,不管怎么做,其实...这个方法,都会,让seta 自动的,往,最小值靠拢对吧...


​编辑


但是这里就要知道了,


如果seta t+1 = seta t - g阿尔法 如果,这个阿尔法学习率,太大的话,就会引起, seta 一会走到了,最小seta值的,左边,一会


走到了最小seta值的右边,就会引起震荡.


如果阿尔法这个,学习率的值,太小的话,那么就会导致,走得慢对吧,走得慢,那么迭代次数就多


迭代次数多,那么运行的就慢,学习的就慢.


​编辑


这里还要知道一点,就是,这个 seta t+1 = seta t - g阿尔法 这个阿尔法的值,被称为 学习率我们知道了,其实每个公司,


这个学习率的设定,都可以说是公司机密了,怎么设置,能让这个学习,次数少,迭代次数少,更快获得结果,消耗的资源


也更少, 这个学习率很重要


这个学习率也叫做 haperparameter 超参数也叫做,然后还有一个的,由于,切线的斜率,往往不可能最后,会等于0,


那么这个时候,我们就会指定一个值,这个值叫做threadhold 阈值, 这个g=0,是不可能的在实际中,因此


比如我们指定,当g < 0.15的时候,我们就认为,可以了,学习到位了...可以用来预测了...就是 g< threadhold


的时候就可以了..当然这个0.15 是我们指定的.


​编辑


所以可以看到,其实梯度下降法,就是,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就够用了,能预测的足够准了比如说.


​编辑


然后这里其实梯度下降法就是一个试的过程,通过不断的尝试,来得到一个相对精确的可用的模型,其实


现实生活中我们也往往都是通过不停的尝试,最后得到一个模型.或者规律


​编辑


然后我们说梯度下降法实际上就是利用了导函数对吧,利用了斜率


利用了损失函数的 的斜率


​编辑


可以看到损失函数上面,这个函数我们经过一次变化


​编辑


对他进行求导就可以得到:


j(theta) = (yihat -yi) ^2 对吧 我们就求这个导函数,斜率最下的时候就可以了,也就是,


j(theta) 几乎等于0的时候,对应的theta值其实就是,对应的w,权重参数对吧.


​编辑


这里我们再说一个框架,这个scikit-learn框架


​编辑


可以看到这里scikit-learn 这里包含了,求解析解的函数了,


求导函数的,解析解 已经包含到这个包里了


​编辑


可以看到也是开源的


​编辑


这里我们可以不用自己,调用np的线性代数等方法,自己去利用,损失函数去计算了


我们利用scikit-learn会更简单,因为它里面提供了,直接计算解析解的方法


​编辑


我们可以看一下,这里我们要用到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_,这个是截距,


​编辑


截距其实,就是实际值,到预测值的距离,也就是说,预测值+截距 =实际值


也就相当于w0 ,然后 ,lin_reg.oef_ 就相当于 w1,w2,w3...这样,这要看我们的,函数是几元的,


对吧,几元就会输出几个.


​编辑


可以看到这里我们直接调用lin_reg.fit(x,y) 可以看到就一步给算出解析解了


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


这里为什么不是等于4,3 因为我们的y x 后面,添加了随机数了对吧.


​编辑


然后我们再看看,如果我们通过求解析解的方式,得到了W0,W1了,然后,我们再进行,有新的数据预测是时候,


我们就可以直接lin_reg.predict(x_new) ,就可以用来做预测了对吧


就相当于带入新的数据,来预测y值了.


​编辑


实际上这个sklearn框架在你安装Anaconda的时候就自动提供了对吧.这个anaconda是蟒蛇的意思.


​编辑


总结一下学的内容.



关键词:

推荐阅读

通用设备介绍 通用设备包括什么?

通用设备介绍一、通用设备。办公和商务通用设备,包括文化办公机械、消防设备、电机、变压器、锅炉、空调设备、清洁卫生设备、通讯设备、视 【详细】

美国UFO探索事件 全面解析美国UFO探索事件

一般在发生UFO探索事件之后,许多的研究人员都会认真的去分析此事件发生的前因后果,去搜集一些相关的证据,但是其实我们还能够从这些事件 【详细】

汽车吸尘器好用吗?汽车吸尘器真的有用么?

现在随着大家都逐渐拥有了自己的汽车,很多人对汽车的一些相关工具也还是逐步的关注了起来。其中车载吸尘器就是大家关注度最高的产品,那么 【详细】

航天员太空生活舱内景曝光 在太空中航天员之间是如何交流的呢?

航天员太空生活舱内景曝光,航天员在天上是如何生活的呢?中国载人航天工程空间站、神舟系列载人飞船、天舟系列货运飞船和长征系列运载火箭 【详细】

稀土镁合金简介 稀土镁合金的未来发展趋势

稀土镁合金一般指稀土元素的镁合金。镁合金是工程应用中最轻的金属结构材料,具有低密度、高比强度、高比刚度、高减震、易加工、易回收等优 【详细】

关于我们  |  联系方式  |  免责条款  |  招聘信息  |  广告服务  |  帮助中心

联系我们:85 572 98@qq.com备案号:粤ICP备18023326号-40

科技资讯网 版权所有