谁知道 酒吧玩的石头剪刀布 英文怎么玩 例如输的人指定谁喝酒 左边还是右边 喝几杯 我想知道手势是什么?

机器学习笔记机器学习笔记就是笔记而已。关注专栏更多最新文章{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\u002Fpay.zhihu.com\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&title&:&第二周笔记:多元线性回归&,&author&:&lov1&,&content&:&第一周的笔记里,我们假设函数是这样的:\u003Cequation\u003Eh(x)=\\theta_{0} *x^0 +\\theta _{1}*x^1+\\theta _{2}*x^2+...+\\theta _{n}*x^n+...\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E也就是,自变量只有一个,x。无论是x的1次方还是x的n次方,都只有一个x,也就是就一个特征量。然而人都是贪得无厌的,只有一个特征量,咋预测呢?\u003C\u002Fp\u003E\u003Cp\u003E所以要学习\u003Cb\u003E“多特征预测”\u003C\u002Fb\u003E(多元线性回归)\u003C\u002Fp\u003E\u003Cp\u003E我们现在把x不看作字母x,而看作向量x。\u003C\u002Fp\u003E\u003Cp\u003E那么,\u003Cequation\u003Ex=[x_1,x_2,x_3,...,x_i,...]\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E现在来看\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E,假设x没有2次方以上的情况,那么原假设函数(在x只有1个的情况下):\u003Cequation\u003Eh(x)=\\theta_{0} +\\theta_{1} *x\u003C\u002Fequation\u003E就变成了\u003Cequation\u003Eh(x)=\\theta_{0} +\\theta_{1} *x_1+\\theta_{2} *x_2+\\theta_{3} *x_3+...+\\theta_{i} *x_i+....\u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cp\u003E现在我们在\u003Cequation\u003Ex=[x_1,x_2,x_3,...,x_i,...]\u003C\u002Fequation\u003E增加一项\u003Cequation\u003Ex_0\u003C\u002Fequation\u003E,令\u003Cequation\u003Ex_0\u003C\u002Fequation\u003E=1,那么\u003Cequation\u003Ex=[x_0,x_1,x_2,x_3,...,x_i,...]\u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cp\u003E现在把\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E也看作向量,那么\u003Cequation\u003E\\theta=[\\theta_0,\\theta_1,\\theta_2,\\theta_3,...,\\theta_i,...]\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E那么\u003Cequation\u003Eh(x)=\\theta_{0} +\\theta_{1} *x_1+\\theta_{2} *x_2+\\theta_{3} *x_3+...+\\theta_{i} *x_i+....\u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cp\u003E就可以简化为:\u003Cequation\u003Eh(x)=\\theta^{T} *X\u003C\u002Fequation\u003E或者\u003Cequation\u003Eh(x)=\\theta\\cdot
*X\u003C\u002Fequation\u003E看你自己习惯。\u003C\u002Fp\u003E\u003Cp\u003E原来计算\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E用的公式也可以直接套用:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003E\\theta_{j}=\\theta_{j}-\\alpha *\\frac{d}{d\\theta_{j} } J_{\\theta} \u003C\u002Fequation\u003E (这两个公式等号是赋值。)\u003C\u002Fp\u003E\u003Cp\u003E~→ \u003Cequation\u003E\\theta_{j}=\\theta_{j}-\\alpha \u002Fm*\\sum_{i}^{m}{} (h(x_i) -y_{i}
)*x_{i,j}\u003C\u002Fequation\u003E(据说有很多人搞混那个\u003Cequation\u003Ex_{i,j}\u003C\u002Fequation\u003E的,j是表示第几个特征量,i表示这个特征量对应的训练样本里(数组)里的第几个,第一周没那个j是因为我们假设的特征量只有一个……)\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E重复赋值,直到令函数得到的返回值最小。这一步你可以直接用matlab给的优选函数。无所谓。\u003C\u002Fp\u003E\u003Cp\u003E那么这就是多特征预测的基本方式,就是仅仅把原来的一个特征量,变成了多个特征量组成的向量,相应的\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E也是向量了而已。计算代价函数,计算最小化时的\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E,都没啥大的区别。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E注意:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E多特征预测时,要做归一化处理,也就是根据一定的比例,把每个特征值,缩放到一个特定区间内(一般是缩放到-1~1之间)。以免发生类似于“计算四肢数量和精子数量对泡妞影响”这种问题时,由于一个特征的范围是0~4之间,另一个是十亿级别的,结果梯度下降时很难下降到一个合理的预测范围……\u003C\u002Fp\u003E\u003Cp\u003E那么,如何做归一化处理呢?\u003C\u002Fp\u003E\u003Cp\u003E很简单,让计算机对x中的每个\u003Cequation\u003Ex_i\u003C\u002Fequation\u003E作如下处理:\u003Cequation\u003Ex_i=(x_i-u_i)\u002Fs_i\u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cp\u003E一般选择\u003Cequation\u003Eu_i\u003C\u002Fequation\u003E为均值,\u003Cequation\u003Es_i\u003C\u002Fequation\u003E为方差,也有人令\u003Cequation\u003Eu_i\u003C\u002Fequation\u003E为最小值,\u003Cequation\u003Es_i\u003C\u002Fequation\u003E为极差的。这个随便你。\u003C\u002Fp\u003E\u003Cp\u003E然后是\u003Cequation\u003E\\alpha \u003C\u002Fequation\u003E的选取问题。\u003Cequation\u003E\\alpha \u003C\u002Fequation\u003E选大了,没一会儿就变成“梯度上升”了。\u003Cequation\u003E\\alpha \u003C\u002Fequation\u003E选小了。半天你都下降不到合适点。\u003C\u002Fp\u003E\u003Cp\u003E如果x的特征值,有必要对某个x解高次,比如对于某个x,并不是\u003Cequation\u003E\\theta_i*x_i\u003C\u002Fequation\u003E,而是\u003Cequation\u003E\\theta_i*x_i+\\theta_j*x_i^2+...\\theta_k*x_i^n...\u003C\u002Fequation\u003E这种的话,把所有的高次的x看作一个新的特征量即可,,,\u003C\u002Fp\u003E\u003Cp\u003E比如把\u003Cequation\u003Ex_i^2\u003C\u002Fequation\u003E就看作一个新的特征量\u003Cequation\u003Ex_j\u003C\u002Fequation\u003E就好。对了,这种高次的,有可能会过大或者过小,记得要缩放(归一化处理)……\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E然后,这周讲了一个玩意,叫做正规方程。(然而大部分时候用梯度下降就够了……)\u003C\u002Fp\u003E\u003Cp\u003E正规方程的代价函数(J)长这样:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003EJ(\\theta)=a*\\theta^2+b*\\theta+c\u003C\u002Fequation\u003E(1维情况下)\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E然而你如何换一个角度看的话,其实和梯度下降的区别不大:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003EJ({\\theta_i})=1\u002F2m*\\sum_{i}^{m}{} ((h(x_i)-y_i
)^2\u003C\u002Fequation\u003E
\u003Cequation\u003EJ({\\theta})=1\u002F2m*\\sum_{i}^{m}{} ((h(X)-y
)^2\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E是不是很熟悉啦?区别在于,这里的\u003Cequation\u003Ex\\in X\u003C\u002Fequation\u003E,\u003Cequation\u003EX\u003C\u002Fequation\u003E是一个包含所有\u003Cequation\u003E[1,x_1^T,x_2^T,x_3^T,...,x_i^T...]\u003C\u002Fequation\u003E的矩阵。为啥是矩阵呢?因为这里的1是一排1,是[1,1,1,1,1,1,1,1,1,1...],\u003Cequation\u003Ex_1\u003C\u002Fequation\u003E是一排,也就是\u003Cequation\u003E[x_{1}^{\\theta_1} ,x_{1}^{\\theta_2},x_{1}^{\\theta_3},...x_{1}^{\\theta_n},...
]\u003C\u002Fequation\u003E这种形式……啊你知道就行了这没必要记。\u003C\u002Fp\u003E\u003Cbr\u003E要记的是\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E的计算方式(\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E是一堆\u003Cequation\u003E\\theta_i\u003C\u002Fequation\u003E组成的向量)\u003Cequation\u003E\\theta=(X^T*X)^{-1} *X^T*y\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E用代码表示就是……\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Etheta=pinv(X'*X)*X'*y\u003C\u002Fcode\u003E\u003Cp\u003E嗯,这样就记住编程的时候,T是‘,pinv是-1了。记不住随时可以回来看。\u003C\u002Fp\u003E\u003Cp\u003E正规方程有个好处,不用选取\u003Cequation\u003E\\alpha \u003C\u002Fequation\u003E,不用迭代,不用正规化特征量。然而正规方程的比起梯度下降有个严重的问题,当特征量很多时(例如你要通过喜欢过这个女孩的所有男孩的特征,来预测这个女孩时,如果你选的是个美女,你又把每个男孩都当作不同的特征量来训练样本……嗯,说不定特征量能上万?)正规方程会很卡。啊,土豪请无视。然而电脑很卡出数据很慢对于大多数人来说是不可改变的,选取\u003Cequation\u003E\\alpha \u003C\u002Fequation\u003E,正规化特征量,对很多人来说是可以通过写几个loop解决的。\u003C\u002Fp\u003E\u003Cp\u003E顺便说一句,既然看到了-1,数学比较敏感的同学应该想到了,有些数字比如0,是没法取倒数的,这样的时候就因为0不能作分母,无法用正规方程了。那么也就是X中,\u003Cequation\u003Ex_i=x_j*k\u003C\u002Fequation\u003E(k是任意实数,当然也包括0)时,你就没法用正规方程了。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E这种情况一般是把特征重复了……比如你要做个函数预测一个男生泡妞和他家房子大小的相关性时,你把一个特征量按平方米算,另一个特征量按亩算。那我们都知道一亩等于k个平方米(反正k是实数,我才懒得为了举个例子去查具体是多少呢)所以相当于一个特征两次使用了,导致你矩阵中有一行会变成0,你就用正规方程就得出错了。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E(我把正规方程推导过程写下来了。有兴趣的自己推导了可以过来对照一下。\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& data-editable=\&true\& data-title=\&正规方程的推导过程 - 机器学习笔记 - 知乎专栏\& class=\&\&\u003E正规方程的推导过程 - 机器学习笔记 - 知乎专栏\u003C\u002Fa\u003E)\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E(这周接下来的内容是讲如何在matlab或者0ctave上画图的,我就不做笔记了,如果有需要,请在Octave里打“help”即可……)\u003C\u002Fp\u003E&,&updated&:new Date(&T23:55:53.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:4,&likeCount&:12,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T07:55:53+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic3.zhimg.com\u002F6d29e8b9b1dd4b6cde315_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:4,&likesCount&:12},&&:{&title&:&第三周笔记:逻辑回归及正则化&,&author&:&lov1&,&content&:&这周学的是“逻辑回归算法”(分类算法)\u003Cp\u003E在这个算法里,我们的假设函数\u003Cequation\u003Eh(x)\u003C\u002Fequation\u003E长这样:\u003Cequation\u003Eh(x)=\\frac{1}{1+e^{-\\theta^T*X} } \u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E简化一下,把\u003Cequation\u003E\\theta^T*X\u003C\u002Fequation\u003E叫做Z,那么原函数就变成了\u003Cequation\u003Eg(z)=\\frac{1}{1+e^{-z} } \u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E图示如下:\u003Cimg src=\&faa829b805c529c5ddac7dd.png\& data-rawwidth=\&492\& data-rawheight=\&306\&\u003E是不是感觉长得很像累计分布函数啊……\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&a23df30a3d3d1ee490542.png\& data-rawwidth=\&500\& data-rawheight=\&354\&\u003E(第二个图是累计分布函数的)\u003C\u002Fp\u003E\u003Cp\u003E嗯。反正差不多,所以高数的知识可以直接拿过来用了。\u003C\u002Fp\u003E\u003Cp\u003E逻辑回归算法,计算目的是为了分类。按照图中所示,当\u003Cequation\u003Ez&0\u003C\u002Fequation\u003E的时候,\u003Cequation\u003Eg(z)\u003C\u002Fequation\u003E大于0.5,那么假如你要分类,1为在某类,0为不在某类,那\u003Cequation\u003Eg(z)\u003C\u002Fequation\u003E四舍五入就是1个1……。同理,z&0时,g(z)&0.5,四舍五入到0……(当然实际不是这么做的,实际做法是用数学方法使z的绝对值超过一个界限,使得\u003Cequation\u003Eg(z)\u003C\u002Fequation\u003E和1或者0很近。)\u003C\u002Fp\u003E\u003Cp\u003E我们可以把g(z)=0.5,也就是z=0的时候,称为\u003Cb\u003E决策边界\u003C\u002Fb\u003E。假设y为结果,y的值是1或者0。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E那么,z=0,也就是\u003Cequation\u003E\\theta^T*X\u003C\u002Fequation\u003E=0的时候为边界。\u003Cequation\u003E\\theta^T*X\\geq 0\u003C\u002Fequation\u003E时y=1。\u003Cequation\u003E\\theta^T*X& 0\u003C\u002Fequation\u003E时y=0。分类就靠这个……\u003C\u002Fp\u003E\u003Cp\u003E然后继续,机器学习嘛,根据前两周的经验,肯定有那个J,代价函数。逻辑回归算法的代价函数如下:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003EJ=1\u002Fm*\\sum_{i=1}^{m}({h(x_i)-y_i} )^2\u003C\u002Fequation\u003E(m是y总数,嫌麻烦的话,和第二周一样,如果你把那个加和符号去掉,那么这里x和y就变成向量了也就是:\u003Cequation\u003EJ=1\u002Fm*({h(x)-y} ).^2\u003C\u002Fequation\u003E。)\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E然后因为y只有0和1两个取值,这里就可以分两种情况讨论,让y从函数中去掉:\u003C\u002Fp\u003E\u003Cp\u003Ey=0:\u003Cequation\u003EJ=1\u002Fm*\\sum_{1}^{m}({h(x)-0} )^2\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003Ey=1:\u003Cequation\u003EJ=1\u002Fm*\\sum_{1}^{m}({h(x)-1} )^2\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E然而我们发现,这样拿出来的函数,因为y一会儿是1,一会儿是0,得到的图像如下(左边的)然而左边的凹凸不平(非凸),不方便梯度下降,我们想要的是右边那种滑溜溜(凸)的图像。:\u003C\u002Fp\u003E\u003Cimg src=\&7ce98c3ddfb66f8a423176.jpg\& data-rawwidth=\&403\& data-rawheight=\&125\&\u003E\u003Cbr\u003E所以我们假设有个函数cost,\u003Cequation\u003Ecost=(h(x),y)\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E原函数J变成了\u003Cequation\u003EJ=1\u002Fm*\\sum_{1}^{m}(cost(h(x),y)\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E反正我们要的是\u003Cequation\u003Ecost=(h(x),y)\u003C\u002Fequation\u003E符合决策边界的条件就可以了,反正都把结果四舍五入成1或者0了,也没必要非得是某个函数对吧?\u003C\u002Fp\u003E\u003Cp\u003E所以它是什么函数无所谓。只要(它的函数处理了x以后,得到的y)符合决策边界的条件即可。而现在我们希望得到一个滑溜溜的凸函数。那么我们就假设(注意,这是假设出来的,符合条件的函数之一,没说非得这样。然而这是已有的函数中最好的。):\u003C\u002Fp\u003E\u003Cp\u003Ey=1的时候,\u003Cequation\u003Ecost=(h(x),y)=-log(h(x))\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003Ey=0的时候,\u003Cequation\u003Ecost=(h(x),y)=-log(1-h(x))\u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cp\u003E它们的图像如下:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cimg src=\&49cbe0cc62e00e.png\& data-rawwidth=\&800\& data-rawheight=\&603\&\u003E\u003Cp\u003E符合条件。那么这时候还有一个问题,大家都很懒对吧,懒得分情况讨论,那么如何做呢?\u003C\u002Fp\u003E\u003Cp\u003E你看,由于y只有1和0两个值,所以我们就直接把两种情况的cost函数相加,然后分别乘以y和y-1即可:\u003C\u002Fp\u003E\u003Cequation\u003Ecost=(h(x),y)=-y*log(h(x))+(y-1)log(1-h(x))\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E看,是不是很方便呢?\u003C\u002Fp\u003E\u003Cp\u003E于是原来的那个代价函数J就变成了:\u003C\u002Fp\u003E\u003Cequation\u003EJ=1\u002Fm*\\sum_{1}^{m}(-y*log(h(x))+(y-1)log(1-h(x)))\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E然后照旧,我们目的是拿x和y训练样本得到\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E嘛!所以对这玩意求导,然后取个α,然后不断重复梯度下降……以得到\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E,就是下面这个玩意:\u003C\u002Fp\u003E\u003Cp\u003E(repeat:)\u003Cequation\u003E\\theta_j=\\theta_j-\\alpha *\\frac{d}{d\\theta_j}J(\\theta) \u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E这坨玩意里,我们需要计算\u003Cequation\u003E\\frac{d}{d\\theta_j}J(\\theta) \u003C\u002Fequation\u003E,直接照搬之前笔记里的,\u003Cequation\u003E\\frac{d}{d\\theta_j}J(\\theta) =1\u002Fm*\\sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}\u003C\u002Fequation\u003E即可。只不过这里的\u003Cequation\u003Eh(x)=\\frac{1}{1+e^{-\\theta^T*X} } \u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E于是我们最终得到的\u003C\u002Fp\u003E\u003Cp\u003E(repeat:)\u003Cequation\u003E\\theta_j=\\theta_j-\\alpha \u002Fm*\\sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E逻辑回归函数就是这样了。\u003C\u002Fp\u003E\u003Cp\u003E然后是拟合问题,下面是3种情况:\u003Cimg src=\&c278dcb3c42ff6b9c7d914b85030d77d.jpg\& data-rawwidth=\&894\& data-rawheight=\&316\&\u003E\u003C\u002Fp\u003E\u003Cp\u003E第一种是欠拟合,通常是因为特征量选少了。第二种是我们想要的,第三个是过拟合,通常是因为特征量选多了。\u003C\u002Fp\u003E\u003Cp\u003E欠拟合的解决方法是增加特征量。\u003C\u002Fp\u003E\u003Cp\u003E过拟合的解决方法是减少特征量或者正则化。\u003C\u002Fp\u003E\u003Cp\u003E比如我们的逻辑回归函数,不选个自定义的函数,就用我们那个类似泰勒展开式的函数来做的画,这货长得凹凸不平的\u003Cimg src=\&e77581efac20c424c0741.png\& data-rawwidth=\&332\& data-rawheight=\&242\&\u003E,一点都不光滑。那么,按照这货拟合回来的函数,十有八九也是过拟合了。于是我们就会得到一个类似这样的决策边界(蓝色线)显然,这条决策边界很……不实用。\u003Cimg src=\&b1dccf4b3f.jpg\& data-rawwidth=\&399\& data-rawheight=\&126\&\u003E\u003C\u002Fp\u003E\u003Cp\u003E我们想要的,是一根滑溜溜的凸函数,但是我们又不能确定哪些特征量该去掉,所以我们就选择正则化的方式解决过拟合。\u003C\u002Fp\u003E\u003Cp\u003E正则化的方法,就是给代价函数后面加个“惩罚项”……来降低它对数据的拟合能力。\u003C\u002Fp\u003E\u003Cp\u003E于是我们的\u003Cequation\u003EJ=1\u002F2m*\\sum_{1}^{m}(-y*log(h(x))+(y-1)log(1-h(x)))\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E就变成了:\u003Cequation\u003EJ=1\u002F2m*(\\sum_{1}^{m}(-y*log(h(x))+(y-1)log(1-h(x)))+\\lambda \\sum_{j=1}^{n}{\\theta_j^2} )\u003C\u002Fequation\u003E(这里n表示特征量的总数,意思就是让所有的n个正义的\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E为了解决过拟合问题,大喊一声“合体!”然后一起来惩罚那个过度拟合了的函数……\u003Cequation\u003E\\lambda \u003C\u002Fequation\u003E是正规化参数,决定了你惩罚得有多狠。你要惩罚狠点,你就把\u003Cequation\u003E\\lambda \u003C\u002Fequation\u003E提高一点,\u003Cequation\u003E\\lambda \u003C\u002Fequation\u003E过高会变得欠拟合,\u003Cequation\u003E\\lambda \u003C\u002Fequation\u003E过小无法解决过拟合。)\u003C\u002Fp\u003E\u003Cp\u003E那么我们的\u003Cequation\u003E\\theta_j=\\theta_j-\\alpha \u002Fm*\\sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}\u003C\u002Fequation\u003E就顺利变成了:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003E\\theta_j=\\theta_j(1-\\alpha *\\lambda \u002Fm)-\\alpha \u002Fm*\\sum_{i=1}^{m}({(h(x_i)-y_i)} *x_{i,j})\u003C\u002Fequation\u003E
~→\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003E\\theta_j=\\theta_j-\\alpha \u002Fm*(\\sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}+\\lambda \u002Fm*\\theta_j)\u003C\u002Fequation\u003E。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E注意,当\u003Cequation\u003E\\theta_0\u003C\u002Fequation\u003E的时候,由于\u003Cequation\u003Ex_0\u003C\u002Fequation\u003E=1,所以这一项不会欠拟合也不会过拟合,所以不惩罚它。\u003C\u002Fp\u003E\u003Cp\u003E然后,如果你用的不是线性回归,而是正规方程的话,同理,给\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cequation\u003E\\theta=(X^T*X)^{-1} *X^T*y\u003C\u002Fequation\u003E加个惩罚项就好了。这里加的惩罚项为\u003Cequation\u003E\\varsigma \u003C\u002Fequation\u003E,\u003Cequation\u003E\\varsigma \u003C\u002Fequation\u003E是一个n+1阶的单位矩阵把第一项变成0(因为第一项不惩罚),我们把\u003Cequation\u003E\\varsigma \u003C\u002Fequation\u003E写作varsigma,代码差不多就是下面这个:\u003Ccode lang=\&text\&\u003Evarsigma =ones(n+1,n+1); #没有ones方法的自己写个循环给列表赋值,非常简单。\nvarsigma [0,0]=0 #python,c,php等编程的话,等这里是0,0\nvarsigma [1,1]=0 #matlab等这里是1,1,因为一个从0开始计数,一个从1开始计数。真是……就不能统一一下么,老因为这个引起一群嘴强王者的唇战。\n写出来差不多就是这样一个矩阵:\n[\n0,0,0,0,0,0,0,0,...,0,0\n0,1,0,0,0,0,0,0,...,0,0\n0,0,1,0,0,0,0,0,...,0,0\n0,0,0,1,0,0,0,0,...,0,0\n0,0,0,0,1,0,0,0,...,0,0\n0,0,0,0,0,1,0,0,...,0,0\n0,0,0,0,0,0,1,0,...,0,0\n0,0,0,0,0,0,0,1,...,0,0\n.
.\n0,0,0,0,0,0,0,0,...,0,1\n]\u003C\u002Fcode\u003E\u003Cp\u003E得到的正规化后的公式为\u003Cequation\u003E\\theta=(X^T*X+\\lambda *\\varsigma )^{-1} *X^T*y\u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E第三周笔记结束。\u003C\u002Fp\u003E&,&updated&:new Date(&T19:28:51.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:3,&likeCount&:42,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T03:28:51+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic3.zhimg.com\u002Fa71b27bd0bdcfbd1a8631bf_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:3,&likesCount&:42},&&:{&title&:&第四周笔记:神经网络是什么&,&author&:&lov1&,&content&:&神经网络是什么?\u003Cp\u003E\u003Cimg src=\&b82650c47eed7b4bcded2bd.jpg\& data-rawwidth=\&640\& data-rawheight=\&427\&\u003E图中可以看出,就是一个细胞元,由突触,连接到另外几个细胞元,组成的三维网状结构。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cimg src=\&cddc0cd1bcc.jpg\& data-rawwidth=\&756\& data-rawheight=\&388\&\u003E\u003Cbr\u003E\u003Cp\u003E细胞元之间传递信息的方式是兴奋或者抑制,可以按照上节课的逻辑回归算法的0和1来看待。同一时间,突触只能单向传递信号。\u003C\u002Fp\u003E\u003Cp\u003E所以,把神经网络符号化,简化一下就是这样:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&cd4983cac374c5cc2a1fc87.png\& data-rawwidth=\&400\& data-rawheight=\&282\&\u003E我们把每一次,函数接收的所有数据,叫做一个层。简单地可以把数据接收作为层1,接受到层1的所有数据并处理的叫做层2,接收层2数据并处理后传递给下一次用的数据叫做层3……依此类推。\u003C\u002Fp\u003E\u003Cp\u003E那么这样的话,多出来的那个+1是怎么回事呢?任何一个参数的0次方就是1……表示一个常数也称之为偏置项。\u003C\u002Fp\u003E\u003Cimg src=\&c11e267cdff5.png\& data-rawwidth=\&827\& data-rawheight=\&510\&\u003E\u003Cp\u003E按照我们之前笔记里的,把\u003Cequation\u003Ex_0\u003C\u002Fequation\u003E记作1,把\u003Cequation\u003Ea_0\u003C\u002Fequation\u003E记作1,那么,上面那个网络就变成了下面这样了。\u003C\u002Fp\u003E\u003Cp\u003E我们把从外接接受数据的层,称之为输入曾(input layer),产生最终结果的层,称之为输出层(Output layer),中间的所有层我们一般不直接看到,所以称之为隐藏层(hiden layer)。\u003C\u002Fp\u003E\u003Cp\u003E我们把隐藏层j里的第i个数据表示为\u003Cequation\u003Ea_i^{(j)}\u003C\u002Fequation\u003E,处理上一层的所有数据,得到这个数据的函数的参数\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E表示为(向量)\u003Cequation\u003E\\theta_i\u003C\u002Fequation\u003E,(向量)\u003Cequation\u003E\\theta_i\u003C\u002Fequation\u003E里的第k个数据为\u003Cequation\u003E\\theta_{ik}\u003C\u002Fequation\u003E,处理它们的函数为\u003Cequation\u003Eg_\\theta(x)\u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E例如,如果j等于2,也就是第2层,这个层里有3个数据,分别是\u003Cequation\u003Ea_1^{(2)}\u003C\u002Fequation\u003E,\u003Cequation\u003Ea_2^{(2)}\u003C\u002Fequation\u003E,\u003Cequation\u003Ea_3^{(2)}\u003C\u002Fequation\u003E,其中\u003Cequation\u003Ea_1^{(2)}=g(\\theta_1^{(2)}.*X)\u003C\u002Fequation\u003E,也就是:\u003Cequation\u003Ea_1^{(2)}=g(\\theta_{10}^{(2)}*x_0+\\theta_{11}^{(2)}*x_1+\\theta_{12}^{(2)}*x_2+\\theta_{13}^{(2)}*x_3)\u003C\u002Fequation\u003E。同理,\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003Ea_2^{(2)}=g(\\theta_2^{(2)}.*X)\u003C\u002Fequation\u003E,也就是:\u003Cequation\u003Ea_2^{(2)}=g(\\theta_{20}^{(2)}*x_0+\\theta_{21}^{(2)}*x_1+\\theta_{22}^{(2)}*x_2+\\theta_{23}^{(2)}*x_3)\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003Ea_3^{(2)}=g(\\theta_3^{(2)}.*X)\u003C\u002Fequation\u003E,也就是:\u003Cequation\u003Ea_3^{(2)}=g(\\theta_{30}^{(2)}*x_0+\\theta_{31}^{(2)}*x_1+\\theta_{32}^{(2)}*x_2+\\theta_{33}^{(2)}*x_3)\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E而如果j大于2,那么里面的X就是\u003Cequation\u003E[a_0^{(j-1)},a_1^{(j-1)},a_2^{(j-1)},a_3^{(j-1)}]\u003C\u002Fequation\u003E也就是x变成了a,也就是\u003Cequation\u003Ea_i^{(j)}=g(\\theta_i^{(j-1)}.*A^{(j-1)})\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E同理,最后一个要得出的输出曾,也是\u003Cequation\u003Eh_\\theta(x)=g(\\theta_i^{(3)}.*A^{(3)})\u003C\u002Fequation\u003E(假设有3层。)\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E神经网络算法,就是模仿细胞的传递方式,每个“层”相当于包含很多细胞(函数),来处理上一层细胞传递过来的数据。每一层的数据依赖于上一层的数据,以及每一层的\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E。常说的“我不知道是怎么实现的”说的就是隐藏层。\u003C\u002Fp\u003E\u003Cp\u003E然后是理解神经网络为什么能分类……\u003C\u002Fp\u003E\u003Cp\u003E还是拿逻辑回归当作里面的小函数举例:就是那个\u003Cequation\u003Eg(\\theta*x)\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E那个函数图不是长这样吗?\u003C\u002Fp\u003E\u003Cimg src=\&f943ecd1f9de4f756b3d890.png\& data-rawwidth=\&492\& data-rawheight=\&306\&\u003E\u003Cp\u003E那神经网络,就是兴奋和抑制,我们把兴奋当作1,抑制当作0。由于是以逻辑回归举例,所以特征量1或者0对吧。逻辑回归嘛。逻辑无非是,是,非,与,或,异或。其他的都是建立在这个之上的。\u003C\u002Fp\u003E\u003Cp\u003E先说\&是\&:\u003Cequation\u003Eg(\\theta*x)\u003C\u002Fequation\u003E中,\u003Cequation\u003E\\theta*x\u003C\u002Fequation\u003E大于10,那么\u003Cequation\u003Eg(\\theta*x)\u003C\u002Fequation\u003E就无限趋近于1了对吧。所以系统学习时拟合个数字出来\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E大于10的出来就可以了。例如\u003Cequation\u003Eg(20*x-10)\u003C\u002Fequation\u003E就可以表示逻辑是。这时候如果x为0,那就是否。(而如果你选择\u003Cequation\u003Eg(\\theta*x)=g(10*x)\u003C\u002Fequation\u003E的话,当x为0,就是0.5……成薛定谔的猫了。)\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E然后\&非\&:同理,\u003Cequation\u003Eg(\\theta*x)\u003C\u002Fequation\u003E中,\u003Cequation\u003E\\theta*x\u003C\u002Fequation\u003E小于10,就非常近似于0了。所以系统学习时拟合个数字出来\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E出来,让\u003Cequation\u003E\\theta*x\u003C\u002Fequation\u003E小于10即可。例如\u003Cequation\u003Eg(10-20*x)\u003C\u002Fequation\u003E就可以表示逻辑非。\u003C\u002Fp\u003E\u003Cp\u003E然后是与:同理,\u003Cequation\u003Eg(\\theta_0+\\theta_1*x_1+\\theta_2*x_2)\u003C\u002Fequation\u003E中,x1和x2同为1时\u003Cequation\u003E(\\theta_0+\\theta_1*x_1+\\theta_2*x_2)\u003C\u002Fequation\u003E大于10,就非常近似于1了。也很简单,比如:\u003Cequation\u003Eg(-30+20*x_1+20*x_2)\u003C\u002Fequation\u003E就满足条件。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E然后是或:\u003Cequation\u003Eg(\\theta_0+\\theta_1*x_1+\\theta_2*x_2)\u003C\u002Fequation\u003E中,x1和x2有一个为1,\u003Cequation\u003E(\\theta_0+\\theta_1*x_1+\\theta_2*x_2)\u003C\u002Fequation\u003E大于10即可。也很简单,比如:\u003Cequation\u003Eg(-10+20*x_1+20*x_2)\u003C\u002Fequation\u003E就满足条件。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E然后是异或,异或其实就是一个x1先是一下,另一个x1非一下的与组合……比如x1是,x2非时才成立,\u003Cequation\u003Eg(\\theta_0+\\theta_1*x_1+\\theta_2*x_2)\u003C\u002Fequation\u003E中\u003Cequation\u003Eg(-10+20*x_1-20*x_2)\u003C\u002Fequation\u003E就可以了。\u003C\u002Fp\u003E\u003Cp\u003E所以你看,也就是说(在我们假设的结果和特征量都只有0和1的情况下),每一层有\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E和\u003Cequation\u003Ex\u003C\u002Fequation\u003E就可以得到下一层了。神经网络就是把很多层拉到一起,看起来复杂了些。\u003C\u002Fp\u003E\u003Cp\u003E而多元分类问题里的话,就是把里面的参数变成向量(和矩阵)而已(和之前笔记里一样)。实际算法都差不多。\u003C\u002Fp\u003E\u003Cp\u003E第四周笔记结束(这样看神经网络就好入门多了……先理解是什么,为什么有效,下周再理解怎么用。一上来就来让你算\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E,搞不懂反向传播算法,是好多人神经网络算法学蒙了的重要原因……)。\u003C\u002Fp\u003E&,&updated&:new Date(&T22:31:37.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:3,&likeCount&:28,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T06:31:37+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic3.zhimg.com\u002Ffbddd3ecaab93e37ffc811cc_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:3,&likesCount&:28},&&:{&title&:&第五周笔记:神经网络分类问题应用&,&author&:&lov1&,&content&:&\u003Ch2\u003E\u003Cb\u003E分类问题是什么?\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E简单来说,假设nxn矩阵K,K的每列表示对一个特征的分类,一共n个特征。\u003C\u002Fp\u003E\u003Cp\u003E当n为1时,K就是[0]或者[1],意思就是这个特征有还是没有。这时候输出的单元(向量)是一个。\u003C\u002Fp\u003E\u003Cp\u003E当n&=2时,K可以写成\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E[\n1,0...0,0\n0,1...0,0\n.
.\n0,0...1,0\n0,0...0,1\n]\n[\n1,0...0,0\n0,0...1,0\n.
.\n0,1...0,0\n0,0...0,1\n]\n这类的矩阵形式\u003C\u002Fcode\u003E\u003Cp\u003E这样,这个矩阵是n个单元(向量)凑到一起的,每个向量当作一个特征的分类,单个向量里,1的位置在哪儿,表示该特征分到那一类。那么,神经网络分类问题,就是算出这样一个矩阵来。\u003C\u002Fp\u003E\u003Cp\u003E怎么算呢?既然分类问题是一个单元推衍到多个单元,计算方式也可以理解为,计算单元分类问题,推衍到多元分类问题。\u003C\u002Fp\u003E\u003Cp\u003E单元分类问题,我们的逻辑回归算法的代价函数长这样:\u003C\u002Fp\u003E\u003Cequation\u003EJ=1\u002F2m*(\\sum_{i=1}^{m}(-y_i*log(h(x_i))+(y_i-1)log(1-h(x_i)))+\\lambda \\sum_{j=1}^{n}{\\theta_j^2} )\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E推衍到多元,就是简单地多加一个纬度,然后加起来而已。公式和上面那个长得很像,如下:\u003C\u002Fp\u003E\u003Cequation\u003EJ=1\u002F2m*(\\sum_{i=1}^{m}\\sum_{k=1}^{K}(-y_{k,i}*log(h(x_{i}))_k+(y_{k,i})log(1-h(x_{i})))_k+\\lambda \\sum_{l=1}^{L-1}\\sum_{i=1}^{sl}\\sum_{j=1}^{sl+1}{\\theta_{l,ji}} )\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E之前笔记里有说过,机器学习问题,就是要计算\u003Cequation\u003EJ(\\theta) \u003C\u002Fequation\u003E和\u003Cequation\u003E\\frac{d}{d\\theta_j}J(\\theta) \u003C\u002Fequation\u003E,这里也一样。只不过这里的\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E变成了一堆\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E凑在一起 ,我们把符号写为大写\u003Cequation\u003E\\Theta \u003C\u002Fequation\u003E表示这是一堆小\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E向量凑在一起合体变成的矩阵,原公式就变成了要计算\u003Cequation\u003EJ(\\Theta) \u003C\u002Fequation\u003E和\u003Cequation\u003E\\frac{d}{d\\Theta_{i,j}}J(\\Theta) \u003C\u002Fequation\u003E。\u003C\u002Fp\u003E\u003Cp\u003E所以,神经网络分类算法变成了两个具体问题。第一个,计算\u003Cequation\u003EJ(\\Theta) \u003C\u002Fequation\u003E第二个,计算\u003Cequation\u003E\\frac{d}{d\\Theta_{i,j}}J(\\Theta) \u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003EJ(\\Theta) \u003C\u002Fequation\u003E的公式我们已经有了,就是上面那个,因为我们theta的符号由小写变大写了,稍微改一下就是了:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cequation\u003EJ(\\Theta)=1\u002F2m*(\\sum_{i=1}^{m}\\sum_{k=1}^{K}(-y_{k,i}*log(h(x_{i}))_k+(y_{k,i})log(1-h(x_{i})))_k+\\lambda \\sum_{l=1}^{L-1}\\sum_{i=1}^{sl}\\sum_{j=1}^{sl+1}{\\Theta_{l,ji}} )\u003C\u002Fequation\u003E\u003Cp\u003E这样就OK了。那么问题来了,如何计算\u003Cequation\u003E\\frac{d}{d\\Theta_{i,j}}J(\\Theta) \u003C\u002Fequation\u003E呢?\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E用反向传播算法。\u003C\u002Fp\u003E\u003Cp\u003E那什么是反向传播算法呢?\u003C\u002Fp\u003E\u003Cp\u003E理解这个问题,首先要理解什么是正向的传播。\u003C\u002Fp\u003E\u003Cp\u003E上一周笔记里面,我们记了,每一层的数据是上一层数据处理的结果,用数学语言表示出来如下:\u003C\u002Fp\u003E\u003Cequation\u003Ea^{(1)}=x\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cequation\u003Ez^{(2)}=\\Theta^{(1)}*a{(1)}\u003C\u002Fequation\u003E,\u003Cequation\u003Ea^{(2)}=g(z^{(2)})+a_0^{(2)}\u003C\u002Fequation\u003E(\u003Cequation\u003Ea_0^{(2)}\u003C\u002Fequation\u003E就是1啦。之所以写成这样是表示它插入位置)\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003Ez^{(3)}=\\Theta^{(2)}*a{(2)}\u003C\u002Fequation\u003E,\u003Cequation\u003Ea^{(3)}=g(z^{(3)})+a_0^{(3)}\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003Ez^{(4)}=\\Theta^{(3)}*a{(3)}\u003C\u002Fequation\u003E,\u003Cequation\u003Ea^{(4)}=g(z^{(4)})+a_0^{(4)}\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E……依此类推.\u003C\u002Fp\u003E\u003Cp\u003E可以看到,我们计算i层的玩意是基于i-1层的东西。\u003C\u002Fp\u003E\u003Cp\u003E那么反向传播算法,简单理解的话,就是把这个过程“倒过来”,计算i层的东西,基于i+1层就可以了。\u003C\u002Fp\u003E\u003Cp\u003E以前我们计算\u003Cequation\u003E\\frac{d}{d\\Theta_{i,j}}J(\\Theta) \u003C\u002Fequation\u003E用的是什么公式呢?(\u003Cequation\u003E\\frac{d}{d\\theta_j}J(\\theta) =1\u002Fm*\\sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}\u003C\u002Fequation\u003E)\u003C\u002Fp\u003E\u003Cp\u003E我们可以看到,其中有一个\u003Cequation\u003E{(h(x_i)-y_i)}\u003C\u002Fequation\u003E对吧,这是什么玩意呢?这是计算我们的假定函数和真实函数之间的偏差。\u003C\u002Fp\u003E\u003Cp\u003E那么,我们反向传播算法,定义一个这样的,计算第n层j列的元素偏差的值,假设这个符号是\u003Cequation\u003E\\delta _j^{(n)}\u003C\u002Fequation\u003E,称之为“代价函数偏差”\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cp\u003E以总共4层,第四层就是最后一层为例,这个\u003Cequation\u003E\\delta _j^{(n)}\u003C\u002Fequation\u003E就变成了:\u003Cequation\u003E\\delta _j^{(4)}=a_j^{(4)}-y_j\n\u003C\u002Fequation\u003E这最后一层没问题,就按照定义来而已。\u003C\u002Fp\u003E\u003Cp\u003E那么倒数第二层(正数第3层)呢?\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003E\\delta _j^{(3)}=((\\Theta^{(3)})^T*\\delta _j^{(4)}).*g'(z^{(3)})\n\u003C\u002Fequation\u003E其实就是用我们正向传播的函数,拿\u003Cequation\u003E\\delta _j^{(4)}\u003C\u002Fequation\u003E作为参数,导过来而已……理解不了请往上看看正向传播的这一层的函数,然后自己用结果倒推参数,你会得到一样的公式。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E同理,第二层就是:\u003Cequation\u003E\\delta _j^{(2)}=((\\Theta^{(2)})^T*\\delta _j^{(3)}).*g'(z^{(2)})\n\u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cp\u003E第一层就是……第一次不需要计算偏差啦……因为这是我们输入的特征量的层。第一层就是输入层特征量x。\u003C\u002Fp\u003E\u003Cp\u003E然后说如何应用这个偏差计算我们需要的\u003Cequation\u003E\\frac{d}{d\\Theta_{i,j}}J(\\Theta) \u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E为了写起来方便,先定义一个偏差总量\u003Cequation\u003E\\Delta\u003C\u002Fequation\u003E,\u003Cequation\u003E\\Delta_{i,j}^{(l)}\u003C\u002Fequation\u003E=0。\u003Cp\u003E然后,计算出这一层总偏差\u003Cequation\u003E\\Delta_{i,j}^{(l)}=\\Delta_{i,j}^{(l)}+a_j^{(l)}*\\delta ^{(l+1)}\u003C\u002Fequation\u003E(这里等号是赋值符号。)\u003C\u002Fp\u003E\u003Cp\u003E然后用我们对于代价函数偏差的定义,照搬之前的公式,\u003Cequation\u003E\\frac{d}{d\\Theta_{i,j}}J(\\Theta) \u003C\u002Fequation\u003E就等于:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003E\\frac{d}{d\\Theta_{i,j}}J(\\Theta) =1\u002Fm*\\Delta_{i,j}^{(l)}+\\lambda *\\Theta_{i,j}^{(l)}\u003C\u002Fequation\u003E(j!=0时,这里等号依然是赋值符号。)\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003E\\frac{d}{d\\Theta_{i,j}}J(\\Theta) \u003C\u002Fequation\u003E=\u003Cequation\u003E\\frac{d}{d\\Theta_{i,j}}J(\\Theta) =1\u002Fm*\\Delta_{i,j}^{(l)}\u003C\u002Fequation\u003E(j=0时。原因和以前一样,第一层不需要正则化)\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E到这里,你就从数学上理解了神经网络算法的分类问题了。如果你实在搞不懂反向传播算法,无所谓。照猫画虎写出代码就可以了。如果你搞懂了,恭喜你,你理解了整套ng的机器学习课程里最难的一个玩意。means 其他玩意你都能很轻松的搞懂了。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E编程注意事项:\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E注意,这里由于每次处理都是一层一层的,所以这时候你要么得用很多循环,要么就用向量。当然,在octave,matlab之类的玩意里,推荐用向量而不是一堆循环。\u003C\u002Fp\u003E\u003Cp\u003E用向量的话,一般而言,\u003Cequation\u003E\\theta\n\u003C\u002Fequation\u003E和\u003Cequation\u003E\\frac{d}{d\\Theta_{i,j}}J(\\Theta) \u003C\u002Fequation\u003E得到的值都是一个n+1阶的向量。而问题在于,\u003Cequation\u003E\\Theta\u003C\u002Fequation\u003E是一个矩阵,所以在应用时,要先把矩阵向量化。计算完之后,要矩阵化。\u003C\u002Fp\u003E\u003Cp\u003E向量化和反向量化的方法,依然是可以写循环……这里说一下octave里做。以\u003Cequation\u003E\\theta\n\u003C\u002Fequation\u003E举例:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Etheta_vec=[Theta1(:);Theta2(:);Theta3(:)...]\n\u003C\u002Fcode\u003E\u003Cp\u003E由你所见,向量化就是很单纯的把一个矩阵一列一列堆到一起……\u003C\u002Fp\u003E\u003Cp\u003E所以反向量化也就是很简单地拆分开然后排排坐……:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003ETheta1=reshape(theta_vec(1:100),10,11)\nTheta1=reshape(theta_vec(111:220),10,11)\nTheta1=reshape(theta_vec(221:330),10,11)\n\u003C\u002Fcode\u003E\u003Cp\u003E依此类推……就把向量里每110行,拆成一堆11x10的矩阵了。很好理解。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003E梯度检查\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E这玩意对数据分析并没有实际用处,目的是为了让你确认自己的算法无误,(因为反向传播算法你可能搞不懂就编出来了,因为搞不懂,无法确定对不对)\u003C\u002Fp\u003E\u003Cp\u003E理论上来说,\u003Cequation\u003E\\frac{d}{d\\theta_{i}}J(\\theta) \\approx \\frac{J(\\theta+\\xi )-J(\\theta-\\xi )}{2\\xi }\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E所以我们就计算一下对于每个\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E,都大约能符合上面那个公式就行了。\u003C\u002Fp\u003E\u003Cp\u003E所以这里就是,写个循环,对于\u003Cequation\u003E\\theta_1\u003C\u002Fequation\u003E到\u003Cequation\u003E\\theta_n\u003C\u002Fequation\u003E,检查一下是否都符合当\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E等于\u003Cequation\u003E\\theta_i\u003C\u002Fequation\u003E时:\u003Cequation\u003E\\frac{d}{d\\theta_{i}}J(\\theta) \\approx \\frac{J(\\theta+\\xi )-J(\\theta-\\xi )}{2\\xi }\u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cp\u003E(由于是大约,所以如果正在使用的编程语言没有大约符号,可以设定一个可容忍误差判断,小于可容忍误差,记录,弹出具体误差多少。)\u003C\u002Fp\u003E\u003Cbr\u003E当然……由于是挨个检查,又是写循环,所以梯度检查很占内存(土豪请无视)所以检查无误后须要关闭梯度检查。\u003Cp\u003E(注意:在神经网络算法中,初始的\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E选取不能选择0,因为会导致隐藏层相同,解决方案可以选个近似于0的随机值)\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E第五周笔记结束。\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003E总结一下神经网络算法应用:\n&&
先随机选取初始值
正向算出是什么
算出代价函数是什么\n→
反向传播算法算出是什么\n→
梯度检查确认,无误后关闭梯度检查\n→
用优选算法选出令J最小时的theta\u003C\u002Fcode\u003E&,&updated&:new Date(&T01:13:24.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:4,&likeCount&:14,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T09:13:24+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002Fb0a9f28d6b0a9d0b50e46b7ba0f4f82b_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:4,&likesCount&:14},&&:{&title&:&第六周笔记:评估假定函数&,&author&:&lov1&,&content&:&机器学习算法可能给出多个假定函数,例如多维线性回归时多组最优\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E,神经网络选取多少个隐藏层等,显然一直用人脑画图判断是不适合的。所以要了解如何评估假定函数,以选取一定情况下最适合的假定函数。\u003Cp\u003E评估假定函数第一点,数据要分组,一组是训练组(training set),一组是测试组(test set)。通过训练组训练假定函数,通过测试组测试误差。\u003C\u002Fp\u003E\u003Cp\u003E假设我们训练组得出的的假定函数为\u003Cequation\u003EJ(\\theta)\u003C\u002Fequation\u003E,我们把测试组的特征值装进这个假定函数中,得到测试组预测结果\u003Cequation\u003EJ_{test}(\\theta)\u003C\u002Fequation\u003E。那么,我们得到的误差就是测试组真实结果\u003Cequation\u003Ey_{test}\u003C\u002Fequation\u003E减去测试组预测结果(然后取绝对值。)因为取绝对值太麻烦,我们干脆给个平方就好,即:\u003Cequation\u003E(y_{test}-J_{test}(\\theta))^2\u003C\u002Fequation\u003E我们称这个玩意为测试误差\u003Cequation\u003Eerr(h(x),y)\u003C\u002Fequation\u003E,所以咱现在就有公式了:\u003Cequation\u003Eerr(h(x),y)=(y_{test}-J_{test}(\\theta))^2\u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cp\u003E有了这个公式,我们现在就可以知道我们训练出来的假定函数的误差是多少了,但是现在又存在了另一个问题,如果我们只把数据分为俩组,那么我们一个拿来评估,一个拿来训练,然而我们知道,既然是训练,存在一个问题叫做过拟合,那么当然是函数越复杂训得出的结论越优秀,而如果我们用评估结果来确认选哪个,如何知道我们的选择没有“过拟合”呢?所以这样做,并没有一个合适的标准来确定该选哪个假定函数。\u003C\u002Fp\u003E\u003Cp\u003E所以要把数组分为3组,一组用来训练出假定函数,一组用来选出最适合的假定函数(称之为交叉验证组),一组用来评估,知道我们没选错(一般3份按照0.6,0.2,0.2的方式分类,也有0.7,0.2,0.1的分组方式,不管怎么说,训练组占大头,具体看你数据多寡与实际预测情况)。\u003C\u002Fp\u003E\u003Cp\u003E函数具体画出来是这样:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cimg src=\&17ec84ff3f63f77f6b368f0eb6ef1890.png\& data-rawwidth=\&584\& data-rawheight=\&466\&\u003E\u003Cp\u003E图中可以看出,对于已有数据(training set),假定函数越复杂,计算误差(training error)越小。而对于新数据(交叉验证组或其他测试组或预测具体数据时)假定函数越复杂,计算误差(Prediction Error for New Data)就越大。这也解释了为什么过拟合时预测结果不准确。\u003C\u002Fp\u003E\u003Cp\u003E理论上来说,我们就是要用交叉验证组,找到测试误差(Model Prediction Error )最小时的那个假定函数。\u003C\u002Fp\u003E\u003Cp\u003E然后,有了测试误差这个评估指标,我们就可以讨论很多先前说道的高偏差或高方差问题了。例如,我们现在讨论\u003Cequation\u003E\\lambda \u003C\u002Fequation\u003E(正则化)为什么能一定程度上解决过拟合问题。就可以画个图:\u003C\u002Fp\u003E\u003Cimg src=\&aed75856cac80.png\& data-rawwidth=\&243\& data-rawheight=\&207\&\u003E\u003Cp\u003E这样就可以看出为什么选lambda过小过大都不适宜,而如何用交叉验证组选了。\u003C\u002Fp\u003E\u003Cp\u003E然后还有一个问题,是否数据越多越好?我们知道,数据越多,意味着得花更多钱买数据,或者得用更多的时间去爬各个网站,总之数据越多成本越高。那么,测试误差在数据量下,对于交叉验证集和训练集的作图就如下:\u003Cimg src=\&4eea81becaf2c.png\& data-rawwidth=\&405\& data-rawheight=\&219\&\u003E\u003C\u002Fp\u003E\u003Cp\u003E可以看出,随着数据量上升,交叉验证集的误差虽然越来越小,但是会趋于平缓,而且由我们的预测方法可知,其他集合的测试误差理论上不可能比训练误差更小,而且预测准确率不可能是100%,所以J_train和J_cv的测试误差之间是一定会有空隙的,这个空隙如果已经比预测的可接受误差范围小,那就没必要再增加训练样本了。(这种思维方式在生活中是很有用的)\u003C\u002Fp\u003E\u003Cp\u003E从另一个角度出发,如果获取一个新的数据能得到的对预测准确性的经济价值,已经低于获取一个新数据的成本,也是没必要再增加新的数据的。所以不管怎么说,数据量并不是越多越好。\u003C\u002Fp\u003E\u003Cp\u003E同理,其他预测的小技巧,也能用这种方式,验证其是提高的偏差,还是降低了拟合有效性。预测结果的误差无非就是两种,一种是过拟合,一种是欠拟合。所以这个程度上是可以很简单地判断的……\u003C\u002Fp\u003E\u003Cp\u003E简单分类,过拟合问题包含:训练集数据太多,训练集包含过度多项式,过于复杂。隐藏层过多,lambda太小等。而欠拟合问题就是相反……\u003C\u002Fp\u003E\u003Cp\u003E由于你没法提前知道自己的机器学习系统结果误差会有多大,所以正确的做法是先糊弄一下,随便搞一个出来,然后不断迭代……(找到误差率,判断是欠拟合还是过拟合,然后改进)。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E然后是精准率和召回率\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E这个词对于大多数做过数据处理的人并不陌生……用大白话说:\u003C\u002Fp\u003E\u003Cp\u003E精准率就是所有可能的事件中,我预测的要发生事件有多少件发生了。\u003C\u002Fp\u003E\u003Cp\u003E而召回率就是,所有发生了的事件中,我预测到了几个。\u003C\u002Fp\u003E\u003Cp\u003E显然,单纯地高精准率或者高召回率,得到的结果都是没有意义的。例如,假设有1万人,其中有1人得了高传染性的病,你预测说这1万人都没得病,预测精准率是99.99%,然而我觉得不用解释你也明白,这99.99%的精准率一点卵用也没有……\u003C\u002Fp\u003E\u003Cp\u003E数学语言表达,假设事件被分为2种,一种是发生了的(True),一种是没发生(Fake)的。而我们的预测也是两种,一种是预测到的(Predicted)一种是没预测到的(Unpredicted).\u003C\u002Fp\u003E\u003Cp\u003E精准率就是:\u003Cequation\u003EPre=\\frac{T.P}{(T+F).P} \u003C\u002Fequation\u003E(.p的表示是这玩意的概率,T.p+F.p+P.p+UN.p=1)\u003C\u002Fp\u003E\u003Cp\u003E召回率就是:\u003Cequation\u003ERecall=\\frac{T.P}{(P+UN).P} \u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E理论上来说,预测结果应当是精准率与召回率双高才可。自动选择的话,参考方式是选择\u003Cequation\u003EF=\\frac{1}{\\frac{1}{Pre} +\\frac{1}{Recall} } \u003C\u002Fequation\u003E最高的值。\u003C\u002Fp\u003E\u003Cp\u003E不过一般不这样写,一般写作\u003Cequation\u003EF=\\frac{2*Pre*Recall}{{Pre} +{Recall} } \u003C\u002Fequation\u003E(乘以一个2的意思是,理想最佳情况下,也就是两者均为1时,得到的F也为1.)\u003C\u002Fp\u003E&,&updated&:new Date(&T06:40:30.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:6,&likeCount&:3,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T14:40:30+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic3.zhimg.com\u002F118716ddfa124a64b0b8ebe57b68ec02_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:6,&likesCount&:3},&&:{&title&:&第七周笔记:支持向量机SVM&,&author&:&lov1&,&content&:&以逻辑回归为例:\u003Cequation\u003E\\theta^T*x_i\u003C\u002Fequation\u003E\u003Cp\u003E我们要找到(不断缩小)的代价函数(的导数)。代价函数长这样:\u003C\u002Fp\u003E\u003Cequation\u003EJ(\\theta_j)=1\u002F2m*(\\sum_{1}^{m}(-y*log(h(x))+(y-1)log(1-h(x)))+\\lambda \\sum_{j=1}^{n}{\\theta_j^2} )\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E他的导数就长这样:\u003Cequation\u003E1\u002F2*(\\sum_{i=1}^{m}(-y_i*log(h(x_i))+(y_i-1)log(1-h(x_i)))+\\lambda\u002F2m* \\sum_{j=1}^{n}{\\theta_j} )\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E把函数换一种写法:\u003C\u002Fp\u003E\u003Cequation\u003E1\u002F2*(\\sum_{i=1}^{m}-y_i*cost(\\theta^T*x_i)+(y_i-1)cost(\\theta^T*x))+\\lambda\u002F2m* \\sum_{j=1}^{n}{\\theta_j} )\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cimg src=\&66f7ed7af4fbb60a76f8e30193fdd4a2.jpg\& data-rawwidth=\&352\& data-rawheight=\&143\&\u003E\u003Cbr\u003E\u003Cp\u003E我们知道,我们预测有两个结果,\u003Cequation\u003Eh(x)\u003C\u002Fequation\u003E也就是样本的结果y为1或者为0所以很明显,分类时就是:y=1时\u003Cequation\u003E\\theta^T*x_i\\geq
1\u003C\u002Fequation\u003E,y=0时就是\u003Cequation\u003E\\theta^T*x_i \\leq -1\u003C\u002Fequation\u003E。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E这样很开心,因为我们的决策边界从一条线,变成了一个区域。所以这玩意又称为大间距分类器。\u003Cimg src=\&02c18abd0da8e9b065e27.png\& data-rawwidth=\&800\& data-rawheight=\&862\&\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E大间距分类器有个好处,可以自动忽视异常值(区域内值)。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E核函数:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E好多人搞不明白为毛要用核函数。其实很好理解。我举个例子你就理解了。\u003C\u002Fp\u003E\u003Cp\u003E假设现在我在地板上画了一条线,然后扔了两张纸在地上,让你判断纸在线的左边呢,还是在右边。\u003C\u002Fp\u003E\u003Cp\u003E由于纸张压线了,或者两张纸举例不一样,你估计会一脸蒙蔽。于是要找个方法对吧,那就把纸张折叠一些,用我优雅的折纸技术把这张纸折成了一个球。再扔到线上。\u003C\u002Fp\u003E\u003Cp\u003E这次由于纸折成了球,你相对于纸张整个压在线上,就更容易判断现在纸在左边还是右边了。核函数,就是类似于这个例子里折纸,当然,纸就是你的特征量咯……\u003C\u002Fp\u003E\u003Cp\u003E实际操作中和这个例子还是有很大区别的,比如几张纸之类的……(手动滑稽)。\u003C\u002Fp\u003E\u003Cp\u003E回到正题。\u003C\u002Fp\u003E\u003Cp\u003E现在我们定义一个新的特征量l。l和x都是特征量,为了让他们共同预测结果,我们要对其建立一个新的函数关系式以形成cost函数。\u003C\u002Fp\u003E\u003Cp\u003E当然……你(的折纸方法)写成 x-l 或者 x \u002F l 也没人拦得住你,不过一般情况下,我们选择高斯核函数:\u003C\u002Fp\u003E\u003Cequation\u003Ef_j=similarity(x,l^{(j)})=exp(\\frac{-(x-l^{(j)})^2}{2\\sigma ^2} )\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E这里,当x与l越接近,f越接近1.x与l差距越大,f越接近0.\u003C\u002Fp\u003E\u003Cp\u003E嗯,猜对了,实际处理SVM问题,核函数的意义就在于替换那个x为f。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E实际问题中,是否选择SVM可以如下考虑:\u003C\u002Fp\u003E\u003Cp\u003En多,甚至大于m时,用逻辑回归或者无核SVM。\u003C\u002Fp\u003E\u003Cp\u003En小时,用高斯核函数处理特征量后的SVM。\u003C\u002Fp\u003E\u003Cp\u003En非常小,而m非常大时,也许需要增加更多的特征量(n是特征量数,m是数据数量),而由于数据很多,出于计算速度考虑的话,可以用逻辑回归或者无核SVM。\u003C\u002Fp\u003E\u003Cp\u003E如果电脑够好,不需要考虑计算速度,在此之上可以使用神经网络。(神经网络很早以前就有了,近几年火主要是因为计算机计算能力提升)\u003C\u002Fp\u003E&,&updated&:new Date(&T02:40:32.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:1,&likeCount&:6,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T10:40:32+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:1,&likesCount&:6},&&:{&title&:&第八周笔记:聚类(clustering)&,&author&:&lov1&,&content&:&聚类很好理解。你左手在地上撒一把盐,右手在地上撒一把糖。假设你分不清盐和糖,但是你分别是用左右手撒的,所以两个东西位置不同,你就可以通过俩玩意的位置,判断出两个东西是两类(左手撒的,右手撒的)。然而能不能区别出是糖还是盐?不行。你只能分出这是两类而已。但是分成两类以后再去分析,就比撒地上一堆分析容易多了。\u003Cp\u003E聚类是典型的非监督学习。上面例子中,如果把盐和糖改成白色盐和染成黄色的糖,你可以通过颜色分析,颜色就是标签,有标签就是监督学习。没标签就是非监督学习。\u003C\u002Fp\u003E\u003Cp\u003E聚类算法常用K均值算法:\u003C\u002Fp\u003E\u003Cp\u003E随机选择包含K个中心的cluster(\u003Cequation\u003E\\mu_1,\\mu_2,\\mu_3,\\mu_4,...,\\mu_k\u003C\u002Fequation\u003E ,\u003Cequation\u003EK\\in R\u003C\u002Fequation\u003E)\u003C\u002Fp\u003E\u003Cp\u003E以K=3为例,假设特征量是啥我也不知道……反正有特征量,现在画3个圈圈:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E随机找3个点(图中①,②,③的蓝色点)当然,你找的点不一定就马上在中心了。有可能3个点都跑一个cluster里面去,无所谓……\u003C\u002Fp\u003E\u003Cimg src=\&7f7dbc4a792c474dc10b8b.png\& data-rawwidth=\&359\& data-rawheight=\&372\&\u003E\u003Cimg src=\&c98dca6b8c27c8c5d33e0be.png\& data-rawwidth=\&385\& data-rawheight=\&398\&\u003E\u003Cbr\u003E\u003Cp\u003E然后开始迭代,每次迭代方法如下:\u003C\u002Fp\u003E\u003Cp\u003E对于每个特征点\u003Cequation\u003Ex_i\u003C\u002Fequation\u003E,找到和特征点\u003Cequation\u003Ex_i\u003C\u002Fequation\u003E最近的那个\u003Cequation\u003E\\mu _i\u003C\u002Fequation\u003E(例如\u003Cequation\u003E\\mu _1\u003C\u002Fequation\u003E),把每个和\u003Cequation\u003E\\mu _1\u003C\u002Fequation\u003E最近的点放到一起。对于每个\u003Cequation\u003E\\mu _i\u003C\u002Fequation\u003E都这个操作,例如你选了3个点,就是3个\u003Cequation\u003E\\mu _i\u003C\u002Fequation\u003E(\u003Cequation\u003E\\mu _1\u003C\u002Fequation\u003E,\u003Cequation\u003E\\mu _2\u003C\u002Fequation\u003E,\u003Cequation\u003E\\mu _3\u003C\u002Fequation\u003E)\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E然后对于每个\u003Cequation\u003E\\mu _i\u003C\u002Fequation\u003E的最近点\u003Cequation\u003Ex_i\u003C\u002Fequation\u003E,取个平均值\u003Cequation\u003E\\bar{x_i} \u003C\u002Fequation\u003E,当作该\u003Cequation\u003E\\mu _i\u003C\u002Fequation\u003E的新值。然后你会神奇的发现,每个\u003Cequation\u003E\\mu _i\u003C\u002Fequation\u003E都朝着一个cluster的中心近了一步!(一点也不神奇好吗……)\u003C\u002Fp\u003E\u003Cp\u003E重复n多次,直到收敛为止……\u003C\u002Fp\u003E\u003Cp\u003E这是别人网站上可视化的具体收敛过程,做得很好这里推荐一下:\u003Ca href=\&https:\u002F\u002Fwww.naftaliharris.com\u002Fblog\u002Fvisualizing-k-means-clustering\u002F\& data-editable=\&true\& data-title=\&Visualizing K-Means Clustering\&\u003EVisualizing K-Means Clustering\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cimg src=\&d22da5acf1fb01.png\& data-rawwidth=\&354\& data-rawheight=\&382\&\u003E\u003Cimg src=\&788ce87a02bf4de0d52ce4.png\& data-rawwidth=\&377\& data-rawheight=\&387\&\u003E\u003Cp\u003E你就会神奇地发现这3个点把区域按照某种神奇的规则分出来了(这个规则就是K均值最小……)这3个不同的区域就是3个cluster。\u003C\u002Fp\u003E\u003Cp\u003E具体的算式如下:\u003C\u002Fp\u003E\u003Cequation\u003EJ=\\frac{1}{m} \\sum_{m}^{i=1}{(x_i-\\mu _c^{(i)})} \u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E由于这次咱不是监督算法了,所以没法去压导数去迭代。上文也说了怎么迭代,所以这次迭代方法是:\u003Cequation\u003EminJ(c^{(1)}......c^{(m)};\\mu ^{(1)}......\\mu ^{(k)})\u003C\u002Fequation\u003E不和导数扯上关系了,自己根据每个点算最小值不断迭代到收敛就是了……\u003C\u002Fp\u003E\u003Cp\u003E然后就是选每个初始K的点也有技巧,一旦选不好,有可能3个点选到一个簇,本来应该是分成3个圆形片区,结果把整张图片分成3个长方块的也不是不可能……\u003C\u002Fp\u003E\u003Cbr\u003E所以要随机选,为了保险,可以多随机几次。\u003Cp\u003E然后就是另一个问题了:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003EK元素选几个?\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E选少了,偏差很大。选多了,过拟合了。\u003Cbr\u003E如果愿意画图,有个方法叫肘子方法(我饿了……)\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&ddbcac507e6697fda29ac78.png\& data-rawwidth=\&395\& data-rawheight=\&287\&\u003E\u003Cbr\u003E诺,就是画这么一个图,那个大概是肘子的地方就是我们要选的K的个数……不过肘子方法缺点很明显,老画图人工去看,一点也不机器。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E维数缩减(Rimensionality Reduction ):\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E举个例子。你做房子的数据的爬虫。假设全是正方形房子,爬虫中有这3个特征量:面积,长度,宽度。那么因为面积和长度宽度相乘相等,就可以缩减了。再例如,你爬到了一个是摄氏度,一个是华氏度,由于数据本身是一样的,也可以缩减了。把实际内核为同一个特征的的缩减到同一个,就是维数缩减。估计你也看出来了。K的个数就是维度嘛……所以维数缩减一定程度上可以看作选择k的个数。\u003C\u002Fp\u003E\u003Cp\u003E当然……既然数据缩减了,储存需要的空间也就小了。(对于我们这种屌丝来说,省一张硬盘就是几百块钱,四舍五入就是一个亿啊……多缩减几次数据就省出一个王思聪了。)\u003C\u002Fp\u003E\u003Cp\u003E实际做法,将J维的数据投影到一个I维空间上。\u003C\u002Fp\u003E\u003Cp\u003E比如这样:\u003C\u002Fp\u003E\u003Cimg src=\&61b75d03e002a7a17b8b875ae1d39ea8.jpg\& data-rawwidth=\&224\& data-rawheight=\&225\&\u003E二向箔攻击!(容我中二一下……)三维空间里的数据就被压缩成了二维的了……~\u003Cp\u003E通常要可视化数据的话,由于我们人类很傻,只能看到3维,所以一般要把数据降到3维或者二维……举个例子……把一个国家杂七杂八的经济发展指标压缩成一个GDP,然后分别看人口和GDP关系,工人比率和GDP关系……这种。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E主成分分析算法(PCA):\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E上文说了一个可视化数据要压缩,那怎么知道压缩了以后不会产生极大偏差呢?要投影数据,那么投影到哪个屏幕啊不对平面上呢?\u003C\u002Fp\u003E\u003Cp\u003E实际做法:找能使投影误差最小的那个维度(平面)\u003C\u002Fp\u003E\u003Cp\u003E定义i个向量,将J个特征量投影到这i个向量组成的子空间上。\u003C\u002Fp\u003E\u003Cp\u003E如下:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003E\\mu _i = \\frac{1}{m} \\sum_{i=1}^{m}{x_j^{(i)}} \u003C\u002Fequation\u003E,\u003Cequation\u003E\\mu _i \u003C\u002Fequation\u003E这玩意就是我们说的向量。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E然后把原来的\u003Cequation\u003Ex_j^{(i)}\u003C\u002Fequation\u003E变成\u003Cequation\u003E\\frac{x_j{(i)}-\\mu _i}{s_j} \u003C\u002Fequation\u003E。\u003Cequation\u003Es_j\u003C\u002Fequation\u003E是数据归一化用的玩意(例如方差,最大值什么的。随便你选个你喜欢的)。\u003C\u002Fp\u003E\u003Cp\u003E然后问题来了,咱算数据肯定是一列一列算,谁闲着没事一个一个算。那么如何一列一列算呢?\u003C\u002Fp\u003E\u003Cp\u003E定义sigma,\u003Cequation\u003ESigma=\\frac{1}{m}\\sum_{a}^{b}{(x^{(i)}*x^{(i)T})}
\u003C\u002Fequation\u003E拿矩阵说的话就是\u003Cequation\u003ESigma=\\frac{1}{m}*X'*X \u003C\u002Fequation\u003E\u003C\u002Fp\u003E\u003Cp\u003E然后用一个Octave里面的算法svd,神奇的事情就发生了……\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E[U,S,V]=svd(Sigma)\u003C\u002Fcode\u003E\u003Cp\u003E然后我们就得到了包含n个(特征量个数)\u003Cequation\u003E\\mu _i \u003C\u002Fequation\u003E的一个矩阵U了。然后我们要缩减到k个纬度,就从这个矩阵U里面提取前k个就行了(误差好大的感觉……不过算了。压缩数据本来误差就大)。\u003C\u002Fp\u003E\u003Cp\u003E用Octave的话就是这么个玩意,假设我们压缩到k个纬度。:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003EU_reduce=U(:,1:k);\nZ=U_reduce'*X\n\u003C\u002Fcode\u003E\u003Cp\u003E然后就可以用这个U_reduce开开心心地投影出了我们要的z(压缩过的特征量)了。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E那假如我后悔了。我不该压缩我亲爱的数据的,我一个臭屌丝又没钱买硬盘所以并没有数据的备份,那我想要回最初的数据咋办呢?\u003C\u002Fp\u003E\u003Cp\u003E那就……那就算一算原数据吧……\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E由于:Z=U_reduce'*X\u003C\u002Fcode\u003E\u003Cp\u003E1所以我们可以反推X:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003EX=U_reduce*Z\u003C\u002Fcode\u003E\u003Cp\u003E这个X当然是有误差的。所以就别写作X了,写作X_approx好了……\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003EX_approx=U_reduce*Z\u003C\u002Fcode\u003E\u003Cp\u003E然后就是自动选K的问题。自动选K这事很有趣,如果X被压缩以后,解压缩回来误差很小,那大概可以认为此时选取的k是比较合适的。方法如下:\u003C\u002Fp\u003E\u003Cp\u003E计算误差\u003Cequation\u003Eerror=\\frac{\\sum_{i=1}^{m}{(x_i-x_{i,approx})}^2 }{\\sum_{i=1}^{m}{x_i} ^2} \u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E如果error&0.01的话,那这时候的k大概就在肘子那里了……当然,你也可以写个循环,找出error最小时的k。\u003C\u002Fp\u003E\u003Cp\u003E顺便说一句,PCA也可以用于监督学习中,以便我们这些穷B减少自己心爱的计算机的负荷(好心酸。我要买个显卡坞来增加运算能力,谁也别拦着我!)具体的做法就是把\u003Cequation\u003E(x_i,y_i)\u003C\u002Fequation\u003EPCA成\u003Cequation\u003E(z_i,y_i)\u003C\u002Fequation\u003E,然后代入假定函数中。当然,既然特征量已经从x变成z了。记得在用交叉函数J_cv和测试函数J_test的时候,也要把x变成z。因为特征量的数据并不同所以需要再变一次,这地方容易出错……\u003C\u002Fp\u003E\u003Cp\u003E由于PCA整个方案都没用到y,所以过拟合问题并不能用PCA来降维攻击,还是老老实实的用正则化吧……正则化简单粗暴还不\u003C\u002Fp\u003E&,&updated&:new Date(&T15:03:40.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:9,&likeCount&:19,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T23:03:40+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002F2e901f902fd5e27b9d8aa_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:9,&likesCount&:19},&&:{&title&:&第九周笔记:密度估计&,&author&:&lov1&,&content&:&考虑一个产品,每个工厂生产线都有一定的概率产生次品。假设在用户退货之前,我们没法知道一样东西是否是次品。那么我们只能通过产品的各项指标估计(重量,硬度,曲率,发热量等,不同产品指标不一样)将合格的某项指标画在图上,也许会得到这样一个图(左):\u003Cp\u003E\u003Cimg src=\&fbd2fbdcc26ea5e5aaf8356.png\& data-rawwidth=\&500\& data-rawheight=\&250\&\u003E把图按照浓度梯度描红,得到右边的这个区域。按照聚类的思考方式,大概就可以理解为,越接近高浓度区域,其正品概率越高。而越不太可能产生落点的区域,其次品的概率越高。\u003C\u002Fp\u003E\u003Cp\u003E用数学语言描述就是:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003Ep(x)&\\xi \u003C\u002Fequation\u003E时,产品判断为次品。\u003Cequation\u003E\\xi \u003C\u002Fequation\u003E为异常判断参数,\u003Cequation\u003Ep(x)\u003C\u002Fequation\u003E为当前特征的产品产生概率。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003Ep(x)=\\prod_{j=1}^{n} p(x_j,\\mu _j,\\sigma _j)\u003C\u002Fequation\u003E,其中\u003Cequation\u003E\\mu _i = \\frac{1}{m} \\sum_{i=1}^{m}{x_j^{(i)}} \u003C\u002Fequation\u003E,\u003Cequation\u003E\\sigma _j^2=\\frac{1}{m} \\sum_{1}^{m}{(x_j^{(i)}-\\mu _j)^2}\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E当然,你可以简单地把正常和异常记作y=1和y=0.\u003C\u002Fp\u003E\u003Cp\u003E选\u003Cequation\u003E\\xi \u003C\u002Fequation\u003E的方法,就是之前(第六周笔记)里计算F值,取F值最大时的\u003Cequation\u003E\\xi \u003C\u002Fequation\u003E。\u003C\u002Fp\u003E\u003Cp\u003E那么问题来了,既然可以用y=1和y=0来标记出正常和异常,为什么不用监督学习,而要用密度估计呢?\u003C\u002Fp\u003E\u003Cp\u003E因为大多数情况下,生产线上的异常值相对正常值来说,是极其少量的。在这种情况下,如果用监督学习,那么就没有足够的负样本用于训练集。此时,为了准确,我们就可以只把负样本用于交叉验证集与测验集,而训练集不用负样本。既然不用负样本,那么训练的时候也只要用非监督学习了……\u003C\u002Fp\u003E\u003Cp\u003E还有一种可能,负样本相对与数据来说,非常奇怪,每一个负样本都不一样,或者未来可能产生的负样本具有不确定性,那么这种情况下,负样本无法建模,没法判断,只能通过和正样本的差异来判断是否为负样本。这种情况下,显然训练时,只用正样本的非监督学习是优于监督学习的……\u003C\u002Fp\u003E\u003Cp\u003E反之,如果样本特征明显,可预测,未来样本可确定,且正负样本均足够多的情况下,用监督学习更优。\u003C\u002Fp\u003E&,&updated&:new Date(&T10:46:02.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:5,&likeCount&:3,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T18:46:02+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:5,&likesCount&:3},&&:{&title&:&第十周笔记:大量数据算法&,&author&:&lov1&,&content&:&(第九周笔记还有推荐系统没补充完,不过要补充好推荐系统还得查很多资料,所以暂时没有补充的欲望。)\u003Cp\u003E首先一个问题,是否需要用大数据?\u003C\u002Fp\u003E\u003Cp\u003E记得之前笔记(第六周笔记)中,我们分析过一种情况,就是当样本数量m达到一定的程度时,增加样本数量,对于交叉验证集和训练集之间得出的误差的差距,并没有太多减少的空间时,就不再需要增加样本量。\u003C\u002Fp\u003E\u003Cp\u003E一句话,当分别计算J_cv和J_train在当前样本数量下的误差时,差距极大时,应当使用更多数据,差距极小时,就不应当使用大量数据了。\u003C\u002Fp\u003E\u003Cp\u003E那么,大量数据时,用什么算法呢?\u003C\u002Fp\u003E\u003Cp\u003E数据太多,如果还按照批量梯度下降来玩,估计一个因子都得算个三五天,整个公式出出来,改一改,一个月就过去了……\u003C\u002Fp\u003E\u003Cp\u003E那就不用所有因子来玩嘛。一步一步局部下降(贪婪算法)也不错嘛!但是贪婪算法也有问题,那就是,如果你的数据凹凸不平的,有很多个局部最优,那就会发生如下情况:\u003C\u002Fp\u003E\u003Cimg src=\&d0b5aa7bdd8bcab2ff1bcaa1c31e5d7e.png\& data-rawwidth=\&471\& data-rawheight=\&324\&\u003E\u003Cp\u003E那咋办呢?是的,你可以多重复随机选初始点迭代几次,然后在交叉集上比较,但是万一这种坑坑洼洼的地方很多,那你得重复很多次,运气不好兴许一辈子就过去了~\u003C\u002Fp\u003E\u003Cp\u003E那我们就不用局部最优,还是得用全部数据,那不就慢了么,怎么办呢?那就每次就一个数据就拿去改变参数,凑合凑合得了。由于很随便,所以就叫它随便,啊不对随机梯度下降……\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E随机梯度下降:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E我们先看看以前的批量梯度下降的公式:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cequation\u003E\\theta_{j}=\\theta_{j}-\\alpha *\\frac{d}{d\\theta_{j} } J_{\\theta} \u003C\u002Fequation\u003E=\u003Cequation\u003E\\theta_{j}=\\theta_{j}-\\alpha \u002Fm*\\sum_{i}^{m}{} (h(x_i) -y_{i}
)*x_{i,j}\u003C\u002Fequation\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E那么,现在我们改成了每次随便挑一个数据,于是公式就成了:\u003C\u002Fp\u003E\u003Cequation\u003E\\theta_{j}=\\theta_{j}-\\alpha \u002Fm*{} (h(x_i) -y_{i}
)*x_{j}\u003C\u002Fequation\u003E\u003Cbr\u003E\u003Cp\u003E也就是说,other than 把所有的数据拿来加一遍再改变参数值,我们现在变成了急不可耐地看到一个数据就改变一次参数值……\u003C\u002Fp\u003E\u003Cp\u003E啥,你说这不就是贪婪算法,并不随机么……?\u003C\u002Fp\u003E\u003Cp\u003E那好,那就……执行之前,把数据打乱,python的话就randshaffle一下,于是就随机了呗~~~\u003C\u002Fp\u003E\u003Cp\u003E那么最后还有一个问题,我们以前的批量梯度下降,是一遍又一遍地迭代,直到收敛到某一个范围内。现在,你每个数据就下降一次,需要重复多少次呢?\u003C\u002Fp\u003E\u003Cp\u003E不重复啊。说了这是给大量数据准备的,我们就假吧意思大量数据来说下降一次就够了。于是我们就总共只下降一次……只是对于其中,每个数据迭代的时候,就直接改变参数值\u003Cequation\u003E\\theta\u003C\u002Fequation\u003E了。所以你也看到了……由于只下降一次,数据不够多时就别用了。误差会很大的。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E迷你批量梯度下降(略拗口):\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E我们也可以换个思路,还是用批量梯度下降,只是这时候不用所有数据,而是和刚才哪个随机梯度下降的思路结合一下。批量一度下降是所有数据一起算一次,改变一次参数值对吧?随机梯度下降时每个观测数据都拿来改变一次参数值对吧?咱中国人讲究中庸嘛。就既不拿所有的,也不光拿一个,而是一小批一小批地拿来下降,比如每次10个数据下降一次啦,每次20个数据下降一次啦。之类的。\u003C\u002Fp\u003E\u003Cp\u003E那么我们怎么选呢?\u003C\u002Fp\u003E\u003Cp\u003E把数据随机分成x份,每份里面有10~100个数据。以每份b个数据举例,我们要迭代的参数公式就成了这样:\u003C\u002Fp\u003E\u003Cp\u003Ei=1,b=10(假设b为10)\u003C\u002Fp\u003E\u003Cp\u003Ewhile i & m\u003C\u002Fp\u003E\u003Cequation\u003E\\theta_{j}=\\theta_{j}-\\alpha \u002Fm*\\sum_{i}^{i+b-1}{} (h(x_i) -y_{i}
)*x_{i,j}\u00}

我要回帖

更多关于 石头剪刀布官网 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信