From d2d9f6ced6d087b22d8c798462543d4ce8fdd5ad Mon Sep 17 00:00:00 2001 From: scruel Date: Thu, 11 Jan 2018 13:39:52 +0800 Subject: [PATCH] finish 6.4 & 6.5 --- image/20180111_080314.png | Bin 0 -> 9669 bytes image/20180111_080514.png | Bin 0 -> 8774 bytes image/20180111_080614.png | Bin 0 -> 52430 bytes week1.html | 2 +- week1.md | 14 ++--- week2.html | 4 +- week2.md | 24 ++++---- week3.html | 11 +++- week3.md | 123 ++++++++++++++++++++++++++++++++------ 9 files changed, 138 insertions(+), 40 deletions(-) create mode 100644 image/20180111_080314.png create mode 100644 image/20180111_080514.png create mode 100644 image/20180111_080614.png diff --git a/image/20180111_080314.png b/image/20180111_080314.png new file mode 100644 index 0000000000000000000000000000000000000000..dcdc945c6f6c7afc4cdd6779be246eb349bdb95f GIT binary patch literal 9669 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 L&{MBdwU7RP0Cz~D literal 0 HcmV?d00001 diff --git a/image/20180111_080514.png b/image/20180111_080514.png new file mode 100644 index 0000000000000000000000000000000000000000..0f08e50f9e07eb61e37ec4965fe856a6a0bb1616 GIT binary patch literal 8774 zcmZ`{VN>s#RN1qZ+AQRa;QI zHA3wo{2$*p|5v{^k>}o=d+s^+ob!A>=Ze-;SEL}jMFs+aD3q1twLu^f8{qo^^cwIP z{x*di_(S5Mttbns8oKibcz`&_sL6mpHSy$UR#$;%gpHE68VKZf7X%6p1A$I}q2S*j zkmr36Xx$P75`PB*(Z9%U(RvI5v0|0wWpsVaw{pn$_4IPSWi{|oDlz``(<#kYxOK^Np&DB|_czxxBXRqceir#o=6#gZLj$4k!u)hW{2M ziAKV}@L&++MCF$!u}#uD5(GhjLOSKNgs)GSd#H_-$p<1pB+wh``P$Y2bC1^EO;9mf z?VLoU(@JiSuS?#$-D6rh{HEL|Q_T8Gc*dFhyGZ z{BQmhQp4`rh%v=)1KCEe?VMgJ!m1diNDbc=n{WCMgFoj3# z)5c%MyXtP{oyc3XDZhbDlD;FZBGmnYdmH3JQ8Xdi-C{g1*_>$H@TcD>Xu(g_Jv!| zdvh^!rX5~1N|nV(|FGX!NOuWb_j;+WU$bE`(Z+!bNbYe^6=_QW^r^n8#6&dnEMi;# zFzI|aocgqC75MwLWRt~IAzu63z?V1l@Iz3Jv-@-@)kNjugMBkT8l|I!h4d|{J9yDx&geg>cOvS zls>MVX4xVDHwa7p*6v`&UFD|lS+lsV$Uo`ds$b4;LPaAwMH(Tvet6M7bNA_4`45TF z0(Hn!>ZQ^in76FJQ}k7xEYk2cjWC6a$V|GCB4|uefWDI1hS<~lW(%IPl=}Ar=_4BO zF6PdES{65x&@`SVEU7j@T&9&5Hr4lpxfReqq0h1z$h}hXMT^Wc8yp) z6=uoI-$_r=8~&|h+YrDEUmP?!dzu9KXy1qrvhb$SnK&u1n2;)(8$%4!BPl(Q9MLr| z)UqDfC4`$&ptmZ+>86Ut>_jYdIU+nIF|KbatSii`Ck)AF$Ud1=ZLCJoE?1MHHyqUc zKn>oy!@I7~6gHe&(CNGz{731^;4`ct#VdBceTk19klMHIDZwjNj4@$?>*JD(#?4k; zc@YJ4UNfuQqKcWdJy%HbQ1`6)=Bv-z-D5;X-qzeoD0$q{atExxnRHn8yW1gqT94%c5#SS|IYF_cQSjZLAmtmd`r7;PGVVB9R`-l&s_IsQs#%k49a^_XJ2Wrx7I+&40DckBwfP6U4y=_)5k zkH?jYSxQ=(EgaDMW2h{hdt3Cj^wC6E%l)9nhRnhMTouF2Za`C5tdM=U*_SI7oZaj= z{y)D9vi=DEjxr8e`&3k?1+yw2ZK1Pi7&C5ne{JS`wKeql#+LfSC*dv4ygOZ{_Y{Oa zoY_;O&{<=7_1D1g(t9LWObL@>11l)xe+&me9~1X~+8ZCrh2?z)Vz`VZJ>6=dB8xRwQ1zj_U!SzjG6KZjnB`l`RDt7gyuCi zH$E%1y5cTj0}B@srpAxWySuz1DW1Lb?eG-A7`%r6c5~zpVIx}W>{Nz-s&*7D zg3jH!FUQ|LfjU!DMJOv;L?XB-s&8!P-S_uGq`03JS75dp5#QqtKE?67uho2FCYGGJ zwk(#XU%i;X=H)F%rUmB(t{UBQI&I>Ma=&Z3)yv1bwK4B^zkwWeGncP}O`fMrH9FnR zN`Gs+;_%o&wf!2vIV_osZov#B?gNoQW$3KIjq@k@p<0P*4IcUUZ93JN#kHtKY@`C2^+9+itRBM&V>^e412amieLHMtRJTv@~3K{@cd*&y$p7Jk)LK zWeiI5>qt@H5sa{xDj0ZgKQO$hJKA$nA~eb?9z4r&_0iQ9GI0Pya~b&q$ko2IAaN zCM(m1n2Rj>XA&C=AoUDvtjv{|;*Ss*e7qPXk9@sXl6C7J`fHN@JZCfat64(pR;CY2 zQven-@-?PU1_XWv3$UCp1ONRA<7g`GUED}AVvn@Bb7g~?^283$H>VMpDr}d%v@sU)O zSvT(P){U>5($~9OOCNYKHF-GMM!7rb+J*suO3m_&&`MfR-o}Er)nL(>j+dR_7BRHL z^7k-woRWsl&f__#4KP`U#Y)M`t?HS}9{n=tpPHOhfM;M}S}9B`W819PleB8Jm!dt| z%#U6c{TmYu$}s$%C%vnL!0o9&Mn2g7$d&iJ{xmbob|qpM886q zOnA++x|1s()MDw}IuNk7uIZ6+`w|!^ z(=f=5tP15vM!mkA{|X!Oc8N!G>CH-5F`)+n0EW$!{k36nnyD4`#9aCHbC(CBYO?6o z_c&o79&DhF$^RbX>E24G>17{mN|4haT?Y~hSb?b~$SYU#$%TSv{r)>4q@g=4uHlA9 zz)_6c1%eb50)`=QSG$TGF9Gv2;QKS>L@MCTb3H_7$T)Gm)71aD;Yf3g)*3R+_b#io zX~u$r0wDDe!tC?AS64QB?b(X>{c+|JXANGBQymAn^{}0yFa|E_#X!IuZHR5~I*`J=uz%ZpD}JOvHwr+aF*^p*B7>PH$+qugm& z=K!Q`tbz*tq%&d{-LJu~HF%QrZet-K1-`@~`2{4m~*7z&70^tA zva>*p1#xd#>Sbo1>G$pzCS$k&d>;Ugs$s{`*j2J~0a*&?&O&W;8@iGi0jNH$SoM+u zXo`f4$J7M3Zj3wR`lw6=b`md1#fyLvJ7r;PCAV7Q|I3HG?5{UHA3kBHI#XpJ2J z5ST{JStAX<*-^+50BaGrA%@{vM{hR4LBiQ}*8fa{qtKFXT?cCT?EYKX9QK>9y(qy5 zJ6Tw1zo~NDOzPQSD1vL9_vgy}~#4SjIO8ahd1rhZcuwexffQOZ3kJm> zB4#IGZZk_g+qD`B>Tgo55yQIR*ARv2=pd|^mAq;7?_3fSCuZ@ryO8FOd2G{HL+(H^ zCii;u61@tMSTT}zl)9MpUyw|iP3~o+c5?kjjr+#w1iJcdSc3SWV$UD(+#HqE~ zo)yO^A>l;J>KP%9ve2766=T<}mCMILZ0TATp3k-jQZJ$3bRLm6YkYkZ-+}ZIr#VTZ z=9yyE)B(4{H}>YYGBTpvaWcP7BhHAtoAb{MW^F%9P63sYjCx1(X0l$kS0X8`&!bmG zER#%}J%&AxI!mBX-IU;tkA{M>0}yknoIAo9Yh)g2#R-zS;VOV&608T|u@+xnW7u@F zrc&JXt$+k_z~JEz6A^x^)y>ZWBp!?qo~NDki=Qd^o}m3VUj%v1X>sv0!51G`oh;_& zy_3{W><8A#hKBKjlCLc%!k3uum1GP{xSVfE&V^r2@xWimP1;hgJ<^J2SR4LowcvU> za5e`bZ#D?hrW`AR{#Sm^*B)!I>Nfz=;@{eInO4O2siX)IB-Yv9-&S;8-iCl6+VGtw zx!+z^iug+S(ha6Wk(dq+?Qaj8f6!G7sHh|bz)LAZs$mjD!R;`HHPun+Q>X7kT58XE zQiN>ZzCkHNy23D}ZI19Iu=p6gEfxdnxd96ag{9oX9;38*{8U35U~O{zn$0ktL?)JHQ%Q!Q&)hIi6En zUhif{sgQ(-Ob<1EWSWu%5ZcV!eJem*nnSt{Gk&bqmzGAC`my6A4@)Iy<&r)8{+(u( z>3j&*ZdyITMh7j`vwFV zp-EsZt`sy&FF=2E9r~o={~Z$$<<5K~=fS>w>@IyI@dEpu&%vN6`!skFksyy4U=wgI zpcGZm-d;X_jmPa-k!Gs@;mflB_$rPGr3H^-)l^^wcsiQ=R%2!c1?}95bigQ|p-&Uz z{M6cHQ_7k}H4Sfb{&~J3kT81T3`l`z0eznDIY)LCrzoBf{$OuM=3KAc)|yZ-?yb#T zNhYLglyjKkuYtqi3Gh>?#n-KO@e$UH^dnn;$Wrfb3)}o^|3>&TLO@rwVsE8C5pQ1( z4d&Feioa9h>IXouVDEID&q@c~FZH?T( zzRD|*+Xf2V;tA`zaj4O<7M|w2FLZQWCqEm%$8cYdu9NulVbU({WtpR*c4a#)v@T*# zs!m}0$zn-QmSg-1C#=>PX>r^gpkBOH(`QN<(g%;KjaVV@dgMjB1|x8@n!LxEe4%H( z>M7R*VnQXt7M*1feYXf}Wi5Qa;7fe6TVf`p2`<;sFCaSb-`)$VHsISF0_Y}+7oMJR$+z3d|=f)@3wM{sm}RzxWUKp z#ZK$>#fxvdFvp3n)pS)S7G~b^ST(J4vGw&htDC|8yY&@IR~%-C^`=ZAAuaHP;S+*H zY+!V?{)h2LT~K6IKlkRSPTd!)@!;E5S_h0vw-!pu=-Bed%Ct;=tY_KeC`?*ELGwQR zHKMEF8dc;-Zc6t|Dd__xgrnBVKdc{=7>+NhB!Mr9qk9s>aYkg*jOtem-_WTvmoVXX zolK}HPw$qxn;CSxFl}PP2{Y{9@;Nl*y7=JbyO*x6vD3IFpWr;)tBXXyxw>wx-MUay zi*l#%6XA<^(Ep6BZzf)-%_%sIM?Vae1f4+Y^79&F#dvF^mcPrPvz}}1zgNN7sY8Q{WFUfOtjhTh1aF9LN79JON!pry=2o#e;L zRWXv{{T~fH)frf2^7A13{QNxfI@c7F**I!nJVDnDm-)<<7Qe4ja(=lz!b>RkQ7JX2 zg>iI~HFYylk2OWPzj@Nu5ttvk+|h7sRkuCxMNvXc!b{niKjE6EFMlQt{q6a?c`vjb zSaHf>PRH$haHC!?y`T^GL{`&N15RAeUiTSs zNK?#hNcR*@KJyEB_j3JR1YL6d)0Cdv9ZE&??L!$Qr#LBSa(uIt_GOMe(6XJC1ef{c z8q$!?ea}N>LuXejP(s!M;7S&XOT+Ynq@zGL&KFjMn4vlscr&_oBzC~8t zoHbYC{2BFvR%G`cBv*&q+VtT9S-PMV#Z25Vy@@DZiKVO>E*{;q_?~)&%-d&3Pvxbe z<6}hEpZDyzKSshLALRe-|7%ig5itFmdY=pCqtp2C`SZx5$?At`_o-Gk6R4Lq2X6T* zjE2N1$0&ErrCT&temPaUgP<{}+(%EhH^8!5k6P#9ORtYmSGPZ@g(n@Vs`C!3;n%A} z&GeO0m#v56f|TdOUMMcVVL=W>+OVr6CPYLNeB5G&#H`Y~<;&P%uTyB$gKsYnzy*Lj9e)zpUk@G~QGSFG9 z&v>qteLTRYT$E!pkH(@qhxZ|Ji0=K-6jkf7lsr1d0beTd`^sY*0{=%gLDMhxV|o{n zAr(gdybCE0_m>9791J^G4sKhUGH>AU_tt}Z#OB=vt)CxF|2i%uL?i@UJfq@9@Dxbk zd`-g{)?{iH>?S|eKfCK$0P*#6@Hlm4=QUMPPh+~58|*1vL~U84*Rd|6$ZZ{@c+(nh zao&Jwl`48BH8q{fO2b+jIai2pRfi}mipi9AZ9PTuo%luHEt;l zD`diRkETn3Cx1Cz+R-ev8FP<;;(>O zCsM6TADeImo1-EQ5d=TkTKp3b@lGG`)-9C_7%sMI+ z=y;691gyq>2Kw)>V;gB-x0B228)tf)bT#gdHt@Lpqhb+`9BO`+kh-ZsIsG%zET|6q zX@KHy;KG)^F(^_(zjM)r6j$I z+1`r#^fH;<@Y%Va9Ye;A?UViCA@NPF>|%K*Y`A|fic;=Cd%&M}V#;GFl?PS!%QWLQ zv^)C-t@0n%L$R3mOeRP6Mg~vxSv<@ac`ZEN9b~Ttji<-#j0fIGGYP_COy}^GD&QCa z;>QfH%_KaZeYDFvX~T1CYxmYo4uOqmkTsrGNjU*)=0Rdn2sKAtV0(XW3vq7f!Qe=e6e1p3_Ru!v@O)y;P93=~(W2^9&e= z+F@_z-RFEl`U2d55>pySSDnWpV&q0KGEuJF?Nk`KBY=SrrrhnW!X^{MM76=xRhEic z#WE1M&9$qS43G?LsCyLfQaR!KkYM+oJmoDFaY5Fl~SRQlJzB7zWNk(OqI`1P*;U1*Ss;GZ^I4mVyDD zB-nSzOM!eaus5<-V7*J7!3;vzE(LUfU6_Wb=aXIPgxlbNDNqO$yq4n;m*IhTxBnhZ zI|y6?@u$#Qn{u0z0lau!)p9!J-s*u|#B-lm{|m!C>~ur;Ll{y3!W#~BcGM7v@<}=y zV*704Oy*1)e}9{AlsiG`9vonkWF*b^0+8eLUqx=)SGBEXnr1~ati4U{0#uezN72|u z*Ut6xvf_Lbi|zp1t${43B?#ZK=j{KKttgA$%U5CqT(AVg12&_DN~zGUn>XM5kXnt^r}@o>svSn~X2 zq9apH#5XxZ#KqX^=z}FxHynt-)Lh4Bk^=3=)^-0@-H_$%cxoH(>E7q{e{rkf^y66v z$MGiOPp5x8$6}a>roH-AhBaO28N2KZWT2ldu|#!l{yJkzqLJU;;OePLx_&K_E*aPt zNTth|$$<6rNiKh75s?#}?s*LKTN5W(sxLV9aIA8JYf`61Lco3EgZW5ugeEyQp#5`lvW@>t%@L}J!x&PKRI}>9RhGLeotj#warX`TW}a^zbJLDi1Vy z7;hI-Cv?V5Sq+qr6Nca0f0=T~YSpiLcr@!hpFfc_r2Tv0t0Kg=Y4W8?q4NQoO#Vlp zx|AF~zdCa;s-pokbkVnj%jzJ0+dUKhb3_6~vNv!`qIlIrE)|g=2(-#9a#L=~S$4ZL zWhA;W0sEI0Y~e^7`?n@A`Kv%_m;VYAP)Rfyk*;9XX}HF(v#aFbpc?G)dr}tkU;w_t z=1l5Z}9kDau{0H?md;yY=4zKP60*iIYz1!BT#3GqP>mn8ag zQ@8h+wC>8}^8+=_1*yTYB8FKnmP) za(%VD|5f6H*K_MMQ*Sfw>uT$PuZFVYEPQS1&QAM5*FyAxb1@m4CAw_VU7QGhVa6F) zcSg+Gjl=P zZT2zzjrVzjUMU7!&bCNrW(e88i)O*++;428B%5Zsd~-pIX*IFf!$QR@;I^Z0^S(X0 z`S;!$BU6ohC@Kp`1Q$Z!G$ruTi2!z(QI*dI6tw?2d?w9WoC$X%-Ejl{(F3Hcpe|n} HYZ>}~W8QGs literal 0 HcmV?d00001 diff --git a/image/20180111_080614.png b/image/20180111_080614.png new file mode 100644 index 0000000000000000000000000000000000000000..00bb12362a0b42792cce5f94a98e5405b571339e GIT binary patch literal 52430 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

l;g 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

1. 引言(Introduction)

1.1 Welcome

随着互联网数据不断累积,硬件不断升级迭代,在这个信息爆炸的时代,机器学习已被应用在各行各业中,可谓无处不在。

一些常见的机器学习的应用,例如:

  • 手写识别
  • 垃圾邮件分类
  • 搜索引擎
  • 图像处理

使用到机器学习的一些案例:

  • 数据挖掘

    • 网页点击流数据分析
  • 人工无法处理的工作(量大)

    • 手写识别
    • 计算机视觉
  • 个人定制

    • 推荐系统
  • 研究大脑

  • ……

1.2 什么是机器学习(What is Machine Learning)

  1. 机器学习定义 这里主要有两种定义:

    • Arthur Samuel (1959). Machine Learning: Field of study that gives computers the ability to learn without being explicitly programmed.

      这个定义有点不正式但提出的时间最早,来自于一个懂得计算机编程的下棋菜鸟。他编写了一个程序,但没有显式地编程每一步该怎么走,而是让计算机自己和自己对弈,并不断地计算布局的好坏,来判断什么情况下获胜的概率高,从而积累经验,好似学习,最后,这个计算机程序成为了一个比他自己还厉害的棋手。

    • Tom Mitchell (1998) Well-posed Learning Problem: A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.

      Tom Mitchell 的定义更为现代和正式。在过滤垃圾邮件这个例子中,电子邮件系统会根据用户对电子邮件的标记(是/不是垃圾邮件)不断学习,从而提升过滤垃圾邮件的准确率,定义中的三个字母分别代表:

      • T(Task): 过滤垃圾邮件任务。
      • P(Performance): 电子邮件系统过滤垃圾邮件的准确率。
      • E(Experience): 用户对电子邮件的标记。
  2. 机器学习算法

    主要有两种机器学习的算法分类

    1. 监督学习
    2. 无监督学习

    两者的区别为是否需要人工参与数据结果的标注。这两部分的内容占比很大,并且很重要,掌握好了可以在以后的应用中节省大把大把的时间~

    还有一些算法也属于机器学习领域,诸如:

    • 半监督学习: 介于监督学习于无监督学习之间
    • 推荐算法: 没错,就是那些个买完某商品后还推荐同款的某购物网站所用的算法。
    • 强化学习: 通过观察来学习如何做出动作,每个动作都会对环境有所影响,而环境的反馈又可以引导该学习算法。
    • 迁移学习

1.3 监督学习(Supervised Learning)

监督学习,即为教计算机如何去完成预测任务(有反馈),预先给一定数据量的输入和对应的结果即训练集,建模拟合,最后让计算机预测未知数据的结果。

监督学习一般有两种:

  1. 回归问题(Regression)

    回归问题即为预测一系列的连续值

    在房屋价格预测的例子中,给出了一系列的房屋面基数据,根据这些数据来预测任意面积的房屋价格。给出照片-年龄数据集,预测给定照片的年龄。

  2. 分类问题(Classification)

    分类问题即为预测一系列的离散值

    即根据数据预测被预测对象属于哪个分类。

    视频中举了癌症肿瘤这个例子,针对诊断结果,分别分类为良性或恶性。还例如垃圾邮件分类问题,也同样属于监督学习中的分类问题。

视频中提到支持向量机这个算法,旨在解决当特征量很大的时候(特征即如癌症例子中的肿块大小,颜色,气味等各种特征),计算机内存一定会不够用的情况。支持向量机能让计算机处理无限多个特征。

1.4 无监督学习(Unsupervised Learning)

相对于监督学习,训练集不会有人为标注的结果(无反馈),我们不会给出结果或无法得知训练集的结果是什么样,而是单纯由计算机通过无监督学习算法自行分析,从而“得出结果”。计算机可能会把特定的数据集归为几个不同的簇,故叫做聚类算法。

无监督学习一般分为两种:

  1. 聚类(Clustering)

    • 新闻聚合
    • DNA 个体聚类
    • 天文数据分析
    • 市场细分
    • 社交网络分析
  2. 非聚类(Non-clustering)

    • 鸡尾酒问题

新闻聚合

在例如谷歌新闻这样的网站中,每天后台都会收集成千上万的新闻,然后将这些新闻分组成一个个的新闻专题,这样一个又一个聚类,就是应用了无监督学习的结果。

鸡尾酒问题

在鸡尾酒会上,大家说话声音彼此重叠,几乎很难分辨出面前的人说了什么。我们很难对于这个问题进行数据标注,而这里的通过机器学习的无监督学习算法,就可以将说话者的声音同背景音乐分离出来,看视频,效果还不错呢~~。

嗯,这块是打打鸡血的,只需要一行代码就解决了问题,就是这么简单!当然,我没复现过 ^_^……

神奇的一行代码: [W,s,v] = svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');

编程语言建议

在机器学习刚开始时,推荐使用 Octave 类的工程计算编程软件,因为在 C++ 或 Java 等编程语言中,编写对应的代码需要用到复杂的库以及要写大量的冗余代码,比较耗费时间,建议可以在学习过后再考虑使用其他语言来构建系统。 -另外,在做原型搭建的时候也应该先考虑使用类似于 Octave 这种便于计算的编程软件,当其已经可以工作后,才将模型移植到其他的高级编程语言中。

注:Octave 与 MATLAB 语法相近,由于 MATLAB 为商业软件,课程中使用开源且免费的 Octave。

机器学习领域发展迅速,现在也可使用 Tensorflow 等开源机器学习框架编写机器学习代码,这些框架十分友好,易于编写及应用。

2 单变量线性回归(Linear Regression with One Variable)

2.1 模型表示(Model Representation)

  1. 房价预测训练集

    Size in ()Price ($) in 1000's()
    2104460
    1416232
    1534315
    852178
    ......

房价预测训练集中,同时给出了输入 和输出结果 ,即给出了人为标注的”正确结果“,且预测的量是连续的,属于监督学习中的回归问题。

  1. 问题解决模型

其中 代表结果函数,也称为假设(hypothesis) 。这个函数 根据输入(房屋的面积),给出预测结果输出(房屋的价格),即是一个 的映射。

,为其中一种可行的表达式。

: 特征/输入变量。

上式中, 为参数, 的变化才决定了输出结果,不同以往,这里的 被我们视作已知(不论是数据集还是预测时的输入),所以怎样解得 以更好地拟合数据,成了求解该问题的最终问题。

单变量,即只有一个特征(如例子中房屋的面积这个特征)。

2.2 损失函数(Cost Function)

我们的目的在于求解预测结果 最接近于实际结果 的取值,则问题可表达为求解 的最小值

: 训练集中的样本总数

: 目标变量/输出变量

: 训练集中的实例

: 训练集中的第 个样本实例

上图展示了当 取不同值时, 对数据集的拟合情况,蓝色虚线部分代表建模误差(预测结果与实际结果之间的误差),我们的目标就是最小化所有误差之和。

为了求解最小值,引入损失函数(Cost Function)概念,用于度量建模误差。考虑到要计算最小值,应用二次函数对求和式建模,即应用统计学中的平方损失函数(最小二乘法):

系数 存在与否都不会影响结果,这里是为了在应用梯度下降时便于求解,平方的导数会抵消掉

讨论到这里,我们的问题就转化成了求解 的最小值

 

2.3 损失函数 - 直观理解1(Cost Function - Intuition I)

根据上节视频,列出如下定义:

  • 假设函数(Hypothesis):
  • 参数(Parameters):
  • 损失函数(Cost Function):
  • 目标(Goal):

为了直观理解损失函数到底是在做什么,先假设 ,并假设训练集有三个数据,分别为,这样在平面坐标系中绘制出 ,并分析 的变化。

右图 随着 的变化而变化,可见 时,,取得最小值,对应于左图青色直线,即函数 拟合程度最好的情况。

2.4 损失函数 - 直观理解2(Cost Function - Intuition II)

注:该部分由于涉及到了多变量成像,可能较难理解,要求只需要理解上节内容即可,该节如果不能较好理解可跳过。

给定数据集:

参数在 不恒为 时损失函数 关于 的3-D图像,图像中的高度为损失函数的值。

由于3-D图形不便于标注,所以将3-D图形转换为轮廓图(contour plot),下面用轮廓图(下图中的右图)来作直观理解,其中相同颜色的一个圈代表着同一高度(同一 值)。

时:

大概在 时:

上图中最中心的点(红点),近乎为图像中的最低点,也即损失函数的最小值,此时对应 对数据的拟合情况如左图所示,嗯,一看就拟合的很不错,预测应该比较精准啦。

2.5 梯度下降(Gradient Descent)

在特征量很大的情况下,即便是借用计算机来生成图像,人工的方法也很难读出 的最小值,并且大多数情况无法进行可视化,故引入梯度下降(Gradient Descent)方法,让计算机自动找出最小化损失函数时对应的 值。

梯度下降背后的思想是:开始时,我们随机选择一个参数组合即起始点,计算损失函数,然后寻找下一个能使得损失函数下降最多的参数组合。不断迭代,直到找到一个局部最小值(local minimum),由于下降的情况只考虑当前参数组合周围的情况,所以无法确定当前的局部最小值是否就是全局最小值(global minimum),不同的初始参数组合,可能会产生不同的局部最小值。

下图根据不同的起始点,产生了两个不同的局部最小值。

视频中举了下山的例子,即我们在山顶上的某个位置,为了下山,就不断地看一下周围下一步往哪走下山比较快,然后就迈出那一步,一直重复,直到我们到达山下的某一处陆地

梯度下降公式:

: 第 个特征参数

”:=“: 赋值操作符

: 学习速率(learning rate),

: 的偏导

公式中,学习速率决定了参数值变化的速率即”走多少距离“,而偏导这部分决定了下降的方向即”下一步往哪里“走(当然实际上的走多少距离是由偏导值给出的,学习速率起到调整后决定的作用),收敛处的局部最小值又叫做极小值,即”陆地“。

注意,在计算时要批量更新 ,即如上图中的左图所示,否则结果上会有所出入,原因不做细究。

2.6 梯度下降直观理解(Gradient Descent Intuition)

该节探讨 的梯度下降更新过程,即 ,此处为了数学定义上的精确性,用的是 ,如果不熟悉微积分学,就把它视作之前的 即可。

把红点定为初始点,切于初始点的红色直线的斜率,表示了函数 在初始点处有正斜率,也就是说它有正导数,则根据梯度下降公式 , 右边的结果是一个正值,即 向左边移动。这样不断重复,直到收敛(达到局部最小值,即斜率为0)。

初始 值(初始点)是任意的,若初始点恰好就在极小值点处,梯度下降算法将什么也不做()。

不熟悉斜率的话,就当斜率的值等于图中三角形的高度除以水平长度好啦,精确地求斜率的方法是求导。

 

对于学习速率 ,需要选取一个合适的值才能使得梯度下降算法运行良好。

  • 学习速率过小图示:

    收敛的太慢,需要更多次的迭代。

  • 学习速率过大图示:

    可能越过最低点,甚至导致无法收敛。

学习速率只需选定即可,不需要在运行梯度下降算法的时候进行动态改变,随着斜率越来越接近于0,损失函数的变化幅度会越来越小,直到收敛到局部极小值。

如图,品红色点为初始点,损失函数随着迭代的进行,变化的幅度越来越小。

最后,梯度下降不止可以用于线性回归中的损失函数,还通用于最小化其他的损失函数。

2.7 线性回归中的梯度下降(Gradient Descent For Linear Regression)

线性回归模型

梯度下降算法

直接将线性回归模型公式带入梯度下降公式可得出公式

对于 时,给出偏导计算公式的推导过程如下:

所以当 时:

所以当 时:

 

上文中所提到的梯度下降,都为批量梯度下降(Batch Gradient Descent),即每次计算都使用所有的数据集 更新。

由于线性回归函数呈现碗状,且只有一个全局的最优值,所以函数一定总会收敛到全局最小值(学习速率不可过大)。同时,函数 被称为凸二次函数,而线性回归函数求解最小值问题属于凸函数优化问题

另外,使用循环求解,代码较为冗余,后面会讲到如何使用向量化(Vectorization)来简化代码并优化计算,使梯度下降运行的更快更好。

3 Linear Algebra Review

这部分,学过线性代数的可以复习一下,比较基础。笔记整理暂留。

3.1 Matrices and Vectors

Octave/Matlab 代码:

 

执行结果:

 

3.2 Addition and Scalar Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.3 Matrix Vector Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.4 Matrix Matrix Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.5 Matrix Multiplication Properties

Octave/Matlab 代码:

 

执行结果:

 

3.6 Inverse and Transpose

Octave/Matlab 代码:

 

执行结果:

 
+另外,在做原型搭建的时候也应该先考虑使用类似于 Octave 这种便于计算的编程软件,当其已经可以工作后,才将模型移植到其他的高级编程语言中。

注:Octave 与 MATLAB 语法相近,由于 MATLAB 为商业软件,课程中使用开源且免费的 Octave。

机器学习领域发展迅速,现在也可使用 Tensorflow 等开源机器学习框架编写机器学习代码,这些框架十分友好,易于编写及应用。

2 单变量线性回归(Linear Regression with One Variable)

2.1 模型表示(Model Representation)

  1. 房价预测训练集

    Size in ()Price ($) in 1000's()
    2104460
    1416232
    1534315
    852178
    ......

房价预测训练集中,同时给出了输入 和输出结果 ,即给出了人为标注的”正确结果“,且预测的量是连续的,属于监督学习中的回归问题。

  1. 问题解决模型

其中 代表结果函数,也称为假设(hypothesis) 。假设函数根据输入(房屋的面积),给出预测结果输出(房屋的价格),即是一个 的映射。

,为解决房价问题的一种可行表达式。

: 特征/输入变量。

上式中, 为参数, 的变化才决定了输出结果,不同以往,这里的 被我们视作已知(不论是数据集还是预测时的输入),所以怎样解得 以更好地拟合数据,成了求解该问题的最终问题。

单变量,即只有一个特征(如例子中房屋的面积这个特征)。

2.2 损失函数(Cost Function)

我们的目的在于求解预测结果 最接近于实际结果 的取值,则问题可表达为求解 的最小值

: 训练集中的样本总数

: 目标变量/输出变量

: 训练集中的实例

: 训练集中的第 个样本实例

上图展示了当 取不同值时, 对数据集的拟合情况,蓝色虚线部分代表建模误差(预测结果与实际结果之间的误差),我们的目标就是最小化所有误差之和。

为了求解最小值,引入损失函数(Cost Function)概念,用于度量建模误差。考虑到要计算最小值,应用二次函数对求和式建模,即应用统计学中的平方损失函数(最小二乘法):

: 的预测值

系数 存在与否都不会影响结果,这里是为了在应用梯度下降时便于求解,平方的导数会抵消掉

讨论到这里,我们的问题就转化成了求解 的最小值

2.3 损失函数 - 直观理解1(Cost Function - Intuition I)

根据上节视频,列出如下定义:

  • 假设函数(Hypothesis):
  • 参数(Parameters):
  • 损失函数(Cost Function):
  • 目标(Goal):

为了直观理解损失函数到底是在做什么,先假设 ,并假设训练集有三个数据,分别为,这样在平面坐标系中绘制出 ,并分析 的变化。

右图 随着 的变化而变化,可见 时,,取得最小值,对应于左图青色直线,即函数 拟合程度最好的情况。

2.4 损失函数 - 直观理解2(Cost Function - Intuition II)

注:该部分由于涉及到了多变量成像,可能较难理解,要求只需要理解上节内容即可,该节如果不能较好理解可跳过。

给定数据集:

参数在 不恒为 时损失函数 关于 的3-D图像,图像中的高度为损失函数的值。

由于3-D图形不便于标注,所以将3-D图形转换为轮廓图(contour plot),下面用轮廓图(下图中的右图)来作直观理解,其中相同颜色的一个圈代表着同一高度(同一 值)。

时:

大概在 时:

上图中最中心的点(红点),近乎为图像中的最低点,也即损失函数的最小值,此时对应 对数据的拟合情况如左图所示,嗯,一看就拟合的很不错,预测应该比较精准啦。

2.5 梯度下降(Gradient Descent)

在特征量很大的情况下,即便是借用计算机来生成图像,人工的方法也很难读出 的最小值,并且大多数情况无法进行可视化,故引入梯度下降(Gradient Descent)方法,让计算机自动找出最小化损失函数时对应的 值。

梯度下降背后的思想是:开始时,我们随机选择一个参数组合即起始点,计算损失函数,然后寻找下一个能使得损失函数下降最多的参数组合。不断迭代,直到找到一个局部最小值(local minimum),由于下降的情况只考虑当前参数组合周围的情况,所以无法确定当前的局部最小值是否就是全局最小值(global minimum),不同的初始参数组合,可能会产生不同的局部最小值。

下图根据不同的起始点,产生了两个不同的局部最小值。

视频中举了下山的例子,即我们在山顶上的某个位置,为了下山,就不断地看一下周围下一步往哪走下山比较快,然后就迈出那一步,一直重复,直到我们到达山下的某一处陆地

梯度下降公式:

: 第 个特征参数

”:=“: 赋值操作符

: 学习速率(learning rate),

: 的偏导

公式中,学习速率决定了参数值变化的速率即”走多少距离“,而偏导这部分决定了下降的方向即”下一步往哪里“走(当然实际上的走多少距离是由偏导值给出的,学习速率起到调整后决定的作用),收敛处的局部最小值又叫做极小值,即”陆地“。

注意,在计算时要批量更新 ,即如上图中的左图所示,否则结果上会有所出入,原因不做细究。

2.6 梯度下降直观理解(Gradient Descent Intuition)

该节探讨 的梯度下降更新过程,即 ,此处为了数学定义上的精确性,用的是 ,如果不熟悉微积分学,就把它视作之前的 即可。

把红点定为初始点,切于初始点的红色直线的斜率,表示了函数 在初始点处有正斜率,也就是说它有正导数,则根据梯度下降公式 , 右边的结果是一个正值,即 向左边移动。这样不断重复,直到收敛(达到局部最小值,即斜率为0)。

初始 值(初始点)是任意的,若初始点恰好就在极小值点处,梯度下降算法将什么也不做()。

不熟悉斜率的话,就当斜率的值等于图中三角形的高度除以水平长度好啦,精确地求斜率的方法是求导。

 

对于学习速率 ,需要选取一个合适的值才能使得梯度下降算法运行良好。

  • 学习速率过小图示:

    收敛的太慢,需要更多次的迭代。

  • 学习速率过大图示:

    可能越过最低点,甚至导致无法收敛。

学习速率只需选定即可,不需要在运行梯度下降算法的时候进行动态改变,随着斜率越来越接近于0,损失函数的变化幅度会越来越小,直到收敛到局部极小值。

如图,品红色点为初始点,损失函数随着迭代的进行,变化的幅度越来越小。

最后,梯度下降不止可以用于线性回归中的损失函数,还通用于最小化其他的损失函数。

2.7 线性回归中的梯度下降(Gradient Descent For Linear Regression)

线性回归模型

梯度下降算法

直接将线性回归模型公式带入梯度下降公式可得出公式

时,平方损失函数求导的推导过程:

所以当 时:

所以当 时:

 

上文中所提到的梯度下降,都为批量梯度下降(Batch Gradient Descent),即每次计算都使用所有的数据集 更新。

由于线性回归函数呈现碗状,且只有一个全局的最优值,所以函数一定总会收敛到全局最小值(学习速率不可过大)。同时,函数 被称为凸二次函数,而线性回归函数求解最小值问题属于凸函数优化问题

另外,使用循环求解,代码较为冗余,后面会讲到如何使用向量化(Vectorization)来简化代码并优化计算,使梯度下降运行的更快更好。

3 Linear Algebra Review

这部分,学过线性代数的可以复习一下,比较基础。笔记整理暂留。

3.1 Matrices and Vectors

Octave/Matlab 代码:

 

执行结果:

 

3.2 Addition and Scalar Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.3 Matrix Vector Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.4 Matrix Matrix Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.5 Matrix Multiplication Properties

Octave/Matlab 代码:

 

执行结果:

 

3.6 Inverse and Transpose

Octave/Matlab 代码:

 

执行结果:

 
\ No newline at end of file diff --git a/week1.md b/week1.md index 3c25be8..0bed38f 100644 --- a/week1.md +++ b/week1.md @@ -144,9 +144,9 @@ ![](image/20180105_212048.png) -其中 $h$ 代表结果函数,也称为**假设(hypothesis)** 。这个函数 $h$ 根据输入(房屋的面积),给出预测结果输出(房屋的价格),即是一个 $X\to Y$ 的映射。 +其中 $h$ 代表结果函数,也称为**假设(hypothesis)** 。假设函数根据输入(房屋的面积),给出预测结果输出(房屋的价格),即是一个 $X\to Y$ 的映射。 -$h_\theta(x)=\theta_0+\theta_1x$,为其中一种可行的表达式。 +$h_\theta(x)=\theta_0+\theta_1x$,为解决房价问题的一种可行表达式。 > $x$: 特征/输入变量。 @@ -156,7 +156,7 @@ $h_\theta(x)=\theta_0+\theta_1x$,为其中一种可行的表达式。 ## 2.2 损失函数(Cost Function) -我们的目的在于求解预测结果 $h_\theta(x)$ 最接近于实际结果 $y$ 时 $\theta$ 的取值,则问题可表达为**求解 $\sum\limits_{i=0}^{m}(h_\theta(x^{(i)})-y^{(i)})$ 的最小值**。 +我们的目的在于求解预测结果 $h$ 最接近于实际结果 $y$ 时 $\theta$ 的取值,则问题可表达为**求解 $\sum\limits_{i=0}^{m}(h_\theta(x^{(i)})-y^{(i)})$ 的最小值**。 > $m$: 训练集中的样本总数 > @@ -174,12 +174,12 @@ $h_\theta(x)=\theta_0+\theta_1x$,为其中一种可行的表达式。 $$J(\theta_0,\theta_1)=\dfrac{1}{2m}\displaystyle\sum_{i=1}^m\left(\hat{y}_{i}-y_{i} \right)^2=\dfrac{1}{2m}\displaystyle\sum_{i=1}^m\left(h_\theta(x_{i})-y_{i}\right)^2$$ +> $\hat{y}$: $y$ 的预测值 +> > 系数 $\frac{1}{2}$ 存在与否都不会影响结果,这里是为了在应用梯度下降时便于求解,平方的导数会抵消掉 $\frac{1}{2}$ 。 讨论到这里,我们的问题就转化成了**求解 $J\left( \theta_0, \theta_1 \right)$ 的最小值**。 - - ## 2.3 损失函数 - 直观理解1(Cost Function - Intuition I) 根据上节视频,列出如下定义: @@ -299,7 +299,7 @@ $\begin{align*} & \text{repeat until convergence:} \; \lbrace \newline \; &{{\th ![](image/20180106_203726.png) -对于 $j = 0, j = 1$ 时,给出偏导计算公式的推导过程如下: +当 $j = 0, j = 1$ 时,**平方损失函数求导的推导过程:** $\frac{\partial}{\partial\theta_j} J(\theta_1, \theta_2)=\frac{\partial}{\partial\theta_j} \left(\frac{1}{2m}\sum\limits_{i=1}^{m}{{\left( {{h}_{\theta }}\left( {{x}^{(i)}} \right)-{{y}^{(i)}} \right)}^{2}} \right)=$ @@ -319,7 +319,7 @@ $\frac{\partial}{\partial\theta_1} J(\theta)=\frac{1}{m}\sum\limits_{i=1}^{m}{{\ 上文中所提到的梯度下降,都为批量梯度下降(Batch Gradient Descent),即每次计算都使用**所有**的数据集 $\left(\sum\limits_{i=1}^{m}\right)$ 更新。 -由于线性回归函数呈现**碗状**,且**只有一个**全局的最优值,所以函数**一定总会**收敛到全局最小值(学习速率不可过大)。同时,函数 $J​$ 被称为凸二次函数,而线性回归函数求解最小值问题属于**凸函数优化问题**。 +由于线性回归函数呈现**碗状**,且**只有一个**全局的最优值,所以函数**一定总会**收敛到全局最小值(学习速率不可过大)。同时,函数 $J$ 被称为**凸二次函数**,而线性回归函数求解最小值问题属于**凸函数优化问题**。 ![](image/24e9420f16fdd758ccb7097788f879e7.png) diff --git a/week2.html b/week2.html index d23b07f..31f91ff 100644 --- a/week2.html +++ b/week2.html @@ -220,8 +220,8 @@ header, .context-menu, .megamenu-content, footer { font-family: "Segoe UI", Aria -

4 多变量线性回归(Linear Regression with Multiple Variables)

4.1 多特征(Multiple Features)

对于一个要度量的对象,一般来说会有不同维度的多个特征。比如之前的房屋价格预测例子中,除了房屋的面积大小,可能还有房屋的年限、房屋的层数等等其他特征:

这里由于特征不再只有一个,引入一些新的记号

: 特征的总数

: 代表特征矩阵中第 行,也就是第 个训练实例。

: 代表特征矩阵中第 行的第 个特征,也就是第 个训练实例的第 个特征。

参照上图,则有

多变量假设函数 表示为:

对于 ,和单特征中一样,我们将其看作基础数值。例如,房价的基础价格。

参数向量的维度为 ,在特征向量中添加 后,其维度也变为 , 则运用线性代数,可对 简化。

: 矩阵的转置

: 为了计算方便我们会假设

4.2 多变量梯度下降(Gradient Descent for Multiple Variables)

多变量损失函数类似于单变量损失函数,

,其中

前文提到梯度下降对于最小化损失函数的通用性,则多变量梯度下降公式即

对其求导:

可展开为:

当然,同单变量梯度下降一样,计算时需要同时更新所有参数。

,则得到同时更新参数的向量化(Vectorization)实现:

4.3 梯度下降实践1-特征值缩放(Gradient Descent in Practice I - Feature Scaling)

在应用梯度下降算法实践时,由于各特征值的范围不一,可能会影响损失函数收敛速度。

以房价预测问题为例,这里选取房屋面积大小和房间数量这两个特征。

下图中,左图是以原始数据绘制的损失函数轮廓图,右图为采用特征缩放(都除以最大值)后图像。左图中呈现的图像较扁,相对于使用特征缩放方法的右图,梯度下降算法需要更多次的迭代。

 

为了优化梯度下降的收敛速度,采用特征缩放的技巧,使各特征值的范围尽量一致

除了以上图人工选择并除以一个参数的方式,均值归一化(Mean normalization)方法更为便捷,可采用它来对所有特征值统一缩放:

使

对于特征的范围,并不一定需要使得 ,类似于 等也是可取的,而诸如 ,就显得过大/过小了。

另外注意,一旦采用特征缩放,我们就需对所有的输入采用特征缩放,包括训练集、测试集、预测输入等。

4.4 梯度下降实践2-学习速率(Gradient Descent in Practice II - Learning Rate)

通常,有两种方法来确定函数是否收敛

  • 多次迭代收敛法

    • 无法确定需要多少次迭代
    • 较易绘制关于迭代次数的图像
    • 根据图像易预测所需的迭代次数
  • 自动化测试收敛法(比较阈值)

    • 不易选取阈值
    • 损失函数近乎直线时无法确定收敛情况

对于梯度下降,一般采用多次迭代收敛法来得出最小化损失函数的参数值,自动化测试收敛法(如设定 为阈值)则几乎不会被使用。

我们可以通过绘制损失函数关于迭代次数的图像,可视化梯度下降的执行过程,借助直观的图形来发现损失函数趋向于多少时能趋于收敛,依据图像变化情况,确定诸如学习速率的取值,迭代次数的大小等问题。

对于学习速率 ,一般上图展现的为适中情况,下图中,左图可能表明 过大,损失函数无法收敛,右图可能表明 过小,损失函数收敛的太慢。当然, 足够小时,损失函数在每轮迭代后一定会减少。

通过不断改变 值,绘制并观察图像,并以此来确定合适的学习速率。 尝试时可取

4.5 特征和多项式回归(Features and Polynomial Regression)

在特征选取时,我们也可以自己归纳总结,定义一个新的特征,用来取代或拆分旧的一个或多个特征。比如,对于房屋面积特征来说,我们可以将其拆分为长度和宽度两个特征,反之,我们也可以合并长度和宽度这两个特征为面积这一个特征。

线性回归只能以直线来对数据进行拟合,有时候需要使用曲线来对数据进行拟合,即多项式回归(Polynomial Regression)

比如一个二次方模型:

或者三次方模型:

或者平方根模型:

在使用多项式回归时,要记住非常有必要进行特征缩放,比如 的范围为 1-1000,那么 的范围则为 1- 1000000。

4.6 正规方程(Normal Equation)

对于一些线性回归问题来说,正规方程法给出了一个更好的解决问题的方式。

正规方程法,即令 ,通过解析函数的方式直接计算得出参数向量的值 ,Octave 中为 theta = inv(X'*X)*X'*y

: 矩阵 的逆,在 Octave 中,inv 函数用于计算矩阵的逆,类似的还有 pinv 函数。

下表列出了正规方程法与梯度下降算法的对比

条件梯度下降正规方程
是否需要选取 需要不需要
是否需要迭代运算需要不需要
特征量大1适用,不适用, 复杂度
适用范围2各类模型只适用线性模型,且矩阵需可逆

正规方程法的推导过程

展开上式可得

注意到 都为标量,实际上是等价的,则

 

接下来对 求偏导,根据矩阵的求导法则:

 

所以有:

, 则有

4.7 不可逆性正规方程(Normal Equation Noninvertibility)

(本部分内容为选讲)

正规方程无法应用于不可逆的矩阵,发生这种问题的概率很小,通常由于

  • 特征之间线性相关

    比如同时包含英寸的尺寸和米为单位的尺寸两个特征,它们是线性相关的

  • 特征数量大于训练集的数量

如果发现 的结果不可逆,可尝试:

  • 减少多余/重复特征
  • 增加训练集数量
  • 使用正则化(后文)

对于这类不可逆的矩阵,我们称之为奇异矩阵退化矩阵

这种情况下,如果还想使用正规方程法,在Octave中,可以选用 pinv 函数,pinv 区别于 invpinv 函数被称为伪逆函数,在矩阵不可逆的时候,使用这个函数仍可正确地计算出 的值。

5 Octave/Matlab Tutorial

复习时可直接倍速回顾视频,笔记整理暂留。

5.1 Basic Operations

5.2 Moving Data Around

5.3 Computing on Data

5.4 Plotting Data

5.5 Control Statements_ for, while, if statement

5.6 Vectorization

5.x 常用函数整理


-
1 一般来说,当 超过 10000 时,对于正规方程而言,特征量较大。
+

4 多变量线性回归(Linear Regression with Multiple Variables)

4.1 多特征(Multiple Features)

对于一个要度量的对象,一般来说会有不同维度的多个特征。比如之前的房屋价格预测例子中,除了房屋的面积大小,可能还有房屋的年限、房屋的层数等等其他特征:

这里由于特征不再只有一个,引入一些新的记号

: 特征的总数

: 代表样本矩阵中第 行,也就是第 个训练实例。

: 代表样本矩阵中第 行的第 列,也就是第 个训练实例的第 个特征。

参照上图,则有

多变量假设函数 表示为:

对于 ,和单特征中一样,我们将其看作基础数值。例如,房价的基础价格。

参数向量的维度为 ,在特征向量中添加 后,其维度也变为 , 则运用线性代数,可简化

: 矩阵的转置

: 某个样本的特征向量, 维特征量向量

: 为了计算方便我们会假设

注:该部分记号较多,记不住可随时回顾!

 

4.2 多变量梯度下降(Gradient Descent for Multiple Variables)

多变量损失函数类似于单变量损失函数,

,其中

前文提到梯度下降对于最小化损失函数的通用性,则多变量梯度下降公式即

解出偏导得:

可展开为:

当然,同单变量梯度下降一样,计算时需要同时更新所有参数。

,则得到同时更新参数的向量化(Vectorization)实现:

: 训练集数据, 维矩阵(包含额外特征

4.3 梯度下降实践1-特征值缩放(Gradient Descent in Practice I - Feature Scaling)

在应用梯度下降算法实践时,由于各特征值的范围不一,可能会影响损失函数收敛速度。

以房价预测问题为例,这里选取房屋面积大小和房间数量这两个特征。

下图中,左图是以原始数据绘制的损失函数轮廓图,右图为采用特征缩放(都除以最大值)后图像。左图中呈现的图像较扁,相对于使用特征缩放方法的右图,梯度下降算法需要更多次的迭代。

 

为了优化梯度下降的收敛速度,采用特征缩放的技巧,使各特征值的范围尽量一致

除了以上图人工选择并除以一个参数的方式,均值归一化(Mean normalization)方法更为便捷,可采用它来对所有特征值统一缩放:

使

对于特征的范围,并不一定需要使得 ,类似于 等也是可取的,而诸如 ,就显得过大/过小了。

另外注意,一旦采用特征缩放,我们就需对所有的输入采用特征缩放,包括训练集、测试集、预测输入等。

4.4 梯度下降实践2-学习速率(Gradient Descent in Practice II - Learning Rate)

通常,有两种方法来确定函数是否收敛

  • 多次迭代收敛法

    • 无法确定需要多少次迭代
    • 较易绘制关于迭代次数的图像
    • 根据图像易预测所需的迭代次数
  • 自动化测试收敛法(比较阈值)

    • 不易选取阈值
    • 损失函数近乎直线时无法确定收敛情况

对于梯度下降,一般采用多次迭代收敛法来得出最小化损失函数的参数值,自动化测试收敛法(如设定 时判定收敛)则几乎不会被使用。

我们可以通过绘制损失函数关于迭代次数的图像,可视化梯度下降的执行过程,借助直观的图形来发现损失函数趋向于多少时能趋于收敛,依据图像变化情况,确定诸如学习速率的取值,迭代次数的大小等问题。

对于学习速率 ,一般上图展现的为适中情况,下图中,左图可能表明 过大,损失函数无法收敛,右图可能表明 过小,损失函数收敛的太慢。当然, 足够小时,损失函数在每轮迭代后一定会减少。

通过不断改变 值,绘制并观察图像,并以此来确定合适的学习速率。 尝试时可取

4.5 特征和多项式回归(Features and Polynomial Regression)

在特征选取时,我们也可以自己归纳总结,定义一个新的特征,用来取代或拆分旧的一个或多个特征。比如,对于房屋面积特征来说,我们可以将其拆分为长度和宽度两个特征,反之,我们也可以合并长度和宽度这两个特征为面积这一个特征。

线性回归只能以直线来对数据进行拟合,有时候需要使用曲线来对数据进行拟合,即多项式回归(Polynomial Regression)

比如一个二次方模型:

或者三次方模型:

或者平方根模型:

在使用多项式回归时,要记住非常有必要进行特征缩放,比如 的范围为 1-1000,那么 的范围则为 1- 1000000,不适用特征缩放的话,范围更有不一致,也更易影响效率。

4.6 正规方程(Normal Equation)

对于一些线性回归问题来说,正规方程法给出了一个更好的解决问题的方式。

正规方程法,即令 ,通过解析函数的方式直接计算得出参数向量的值 ,Octave 中代码为 theta = inv(X'*X)*X'*y

: 矩阵 的逆,在 Octave 中,inv 函数用于计算矩阵的逆,类似的还有 pinv 函数。

下表列出了正规方程法与梯度下降算法的对比

条件梯度下降正规方程
是否需要选取 需要不需要
是否需要迭代运算需要不需要
特征量大1适用,不适用, 复杂度
适用范围2各类模型只适用线性模型,且矩阵需可逆

正规方程法的推导过程

展开上式可得

注意到 都为标量,实际上是等价的,则

接下来对 求偏导,根据矩阵的求导法则:

所以有:

, 则有

4.7 不可逆性正规方程(Normal Equation Noninvertibility)

(本部分内容为选讲)

正规方程无法应用于不可逆的矩阵,发生这种问题的概率很小,通常由于

  • 特征之间线性相关

    比如同时包含英寸的尺寸和米为单位的尺寸两个特征,它们是线性相关的

  • 特征数量大于训练集的数量

如果发现 的结果不可逆,可尝试:

  • 减少多余/重复特征
  • 增加训练集数量
  • 使用正则化(后文)

对于这类不可逆的矩阵,我们称之为奇异矩阵退化矩阵

这种情况下,如果还想使用正规方程法,在Octave中,可以选用 pinv 函数,pinv 区别于 invpinv 函数被称为伪逆函数,在矩阵不可逆的时候,使用这个函数仍可正确地计算出 的值。

5 Octave/Matlab Tutorial

复习时可直接倍速回顾视频,笔记整理暂留。

5.1 Basic Operations

5.2 Moving Data Around

5.3 Computing on Data

5.4 Plotting Data

5.5 Control Statements_ for, while, if statement

5.6 Vectorization

5.x 常用函数整理


+
1 一般来说,当 超过 10000 时,对于正规方程而言,特征量较大。
2 梯度下降算法的普适性好,而对于特定的线性回归模型,正规方程是很好的替代品。
\ No newline at end of file diff --git a/week2.md b/week2.md index f62c81b..a0a575b 100644 --- a/week2.md +++ b/week2.md @@ -12,9 +12,9 @@ > $n$: 特征的总数 > -> ${x}^{\left( i \right)}$: 代表特征矩阵中第 $i$ 行,也就是第 $i$ 个训练实例。 +> ${x}^{\left( i \right)}$: 代表样本矩阵中第 $i$ 行,也就是第 $i$ 个训练实例。 > -> ${x}_{j}^{\left( i \right)}$: 代表特征矩阵中第 $i$ 行的第 $j$ 个特征,也就是第 $i$ 个训练实例的第 $j$ 个特征。 +> ${x}_{j}^{\left( i \right)}$: 代表样本矩阵中第 $i$ 行的第 $j$ 列,也就是第 $i$ 个训练实例的第 $j$ 个特征。 参照上图,则有 ${x}^{(2)}\text{=}\begin{bmatrix} 1416\\\ 3\\\ 2\\\ 40 \end{bmatrix}, {x}^{(2)}_{1} = 1416$ @@ -22,14 +22,20 @@ 对于 $\theta_0$,和单特征中一样,我们将其看作基础数值。例如,房价的基础价格。 -参数向量的维度为 $n+1$,在特征向量中添加 $x_{0}$ 后,其维度也变为 $n+1$, 则运用线性代数,可对 $h$ 简化。 +参数向量的维度为 $n+1$,在特征向量中添加 $x_{0}$ 后,其维度也变为 $n+1$, 则运用线性代数,可简化 $h$: $h_\theta\left(x\right)=\begin{bmatrix}\theta_0\; \theta_1\; ... \;\theta_n \end{bmatrix}\begin{bmatrix}x_0 \newline x_1 \newline \vdots \newline x_n\end{bmatrix}= \theta^T x$ > $\theta^T$: $\theta$ 矩阵的转置 > +> $x$: 某个样本的特征向量,$n+1$ 维特征量向量 +> > $x_0$: 为了计算方便我们会假设 $x_0^{(i)} = 1$ +**注:该部分记号较多,记不住可随时回顾!** + + + ## 4.2 多变量梯度下降(Gradient Descent for Multiple Variables) 多变量损失函数类似于单变量损失函数, @@ -38,11 +44,11 @@ $h_\theta\left(x\right)=\begin{bmatrix}\theta_0\; \theta_1\; ... \;\theta_n \end 前文提到梯度下降对于最小化损失函数的通用性,则多变量梯度下降公式即 -$\begin{align*} & \text{repeat until convergence:} \; \lbrace \newline \; &{{\theta }_{j}}:={{\theta }_{j}}-\alpha \frac{\partial }{\partial {{\theta }_{j}}}J\left( {\theta_{0}},{\theta_{1}}...{\theta_{n}} \right) \newline \rbrace \end{align*}​$ +$\begin{align*} & \text{repeat until convergence:} \; \lbrace \newline \; &{{\theta }_{j}}:={{\theta }_{j}}-\alpha \frac{\partial }{\partial {{\theta }_{j}}}J\left( {\theta_{0}},{\theta_{1}}...{\theta_{n}} \right) \newline \rbrace \end{align*}$ -对其求导: +解出偏导得: -$\begin{align*}& \text{repeat until convergence:} \; \lbrace \newline \; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; & \text{for j := 0,1...n}\newline \rbrace\end{align*}$ +$\begin{align*}& \text{repeat until convergence:} \; \lbrace \newline \; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; & \text{for j := 0,1...n}\newline \rbrace\end{align*}​$ 可展开为: @@ -55,6 +61,8 @@ $$ \theta = \theta - \alpha \frac{1}{m}(X^T(X\theta-y)) $$ +> $X$: 训练集数据,$m\times(n+1)$ 维矩阵(包含额外特征 $x_0=1$) + ## 4.3 梯度下降实践1-特征值缩放(Gradient Descent in Practice I - Feature Scaling) 在应用梯度下降算法实践时,由于各特征值的范围不一,可能会影响损失函数收敛速度。 @@ -150,16 +158,12 @@ $$ ​ $J(\theta) = \frac{1}{2m}[X^TX\theta-2\theta^TX^Ty+y^Ty]$ - - 接下来对$J(\theta )$ 求偏导,根据矩阵的求导法则: ​ $\frac{dX^TAX}{dX}=(A+A^\mathrm{T})X$ ​ $\frac{dX^TA}{dX}={A}$ - - 所以有: ​ $\frac{\partial J\left( \theta \right)}{\partial \theta }=\frac{1}{2m}\left(2{{X}^{T}}X\theta -2{{X}^{T}}y \right)$ diff --git a/week3.html b/week3.html index bb99415..152c67d 100644 --- a/week3.html +++ b/week3.html @@ -220,6 +220,15 @@ header, .context-menu, .megamenu-content, footer { font-family: "Segoe UI", Aria -

6 逻辑回归(Logistic Regression)

6.1 分类(Classification)

在分类问题中,预测的结果是离散值(结果是否属于某一类),逻辑回归算法(Logistic Regression)被用于解决这类分类问题。

  • 垃圾邮件判断
  • 金融欺诈判断
  • 肿瘤诊断

肿瘤诊断问题:

肿瘤诊断问题是一个二元分类问题(binary class problems),则定义 ,其中 0 表示负向类(negative class),代表恶性肿瘤("-"),1 为正向类(positive class),代表良性肿瘤("+")。如图,定义最右边的样本为偏差项

在未加入偏差项时,线性回归算法给出了品红色的拟合直线,若规定

,预测为 ,即正向类;

,预测为 ,即负向类。

即以 0.5 为阈值(threshold),则我们就可以根据线性回归结果,得到相对正确的分类结果

 

接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果。

不仅如此,线性回归算法的值域为 ,则当线性回归函数给出诸如 等很大/很小(负数)的数值时,结果 ,这显得非常怪异。

 

区别于线性回归算法,逻辑回归算法是一个分类算法,其输出值永远在 0 到 1 之间,即

6.2 假设函数表示(Hypothesis Representation)

为了使 ,引入逻辑回归模型,定义假设函数

对比线性回归函数 表示逻辑函数(logistic function),复合起来,则称为逻辑回归函数。

逻辑函数是 S 形函数,会将所有实数映射到 范围。

sigmoid 函数(如下图)是逻辑函数的特殊情况,其公式为

sigmoid function

应用 sigmoid 函数,则逻辑回归模型:

逻辑回归模型中, 的作用是,根据输入 以及参数 ,计算得出”输出 “的可能性(estimated probability),概率学中表示为:

 

以肿瘤诊断为例, 表示病人有 的概率得了恶性肿瘤。

6.3 决策边界(Decision Boundary)

决策边界的概念可以帮助我们更好地理解逻辑回归模型。

在逻辑回归中,有假设函数

为了得出分类的结果,这里和前面一样,规定以 为阈值:

回忆一下逻辑函数的图像:

sigmoid function

观察可得当 时,有 ,即

同线性回归模型的不同点在于:

直观一点来个例子, 是下图模型的假设函数。

根据上面的讨论,要进行分类,那么只要 时,就预测 ,即预测为正向类。

如果取 ,则有 ,当 时,易绘制图中的品红色直线即决策边界,为正向类(以红叉标注的数据)给出 的分类预测结果。

 

上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中讨论的其实没有多大区别。

为了拟合下图数据,建模多项式假设函数:

这里取 ,决策边界对应了一个在原点处的单位圆,如此便可给出分类结果了,如图中品红色曲线:

 

当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界像碗状、爱心状等等。

 

简单来说,决策边界就是分类的分界线,分类现在实际就由 (中的 )决定啦。

6.4 代价函数(Cost Function)

 

6.5 Simplified Cost Function and Gradient Descent

6.6 Advanced Optimization

6.7 Multiclass Classification_ One-vs-all

7 Regularization

7.1 The Problem of Overfitting

7.2 Cost Function

7.3 Regularized Linear Regression

7.4 Regularized Logistic Regression

+

6 逻辑回归(Logistic Regression)

6.1 分类(Classification)

在分类问题中,预测的结果是离散值(结果是否属于某一类),逻辑回归算法(Logistic Regression)被用于解决这类分类问题。

  • 垃圾邮件判断
  • 金融欺诈判断
  • 肿瘤诊断

讨论肿瘤诊断问题:

肿瘤诊断问题的目的是告诉病人是否为恶性肿瘤,是一个二元分类问题(binary class problems),则定义 ,其中 0 表示负向类(negative class),代表恶性肿瘤("-"),1 为正向类(positive class),代表良性肿瘤("+")。如图,定义最右边的样本为偏差项

在未加入偏差项时,线性回归算法给出了品红色的拟合直线,若规定

,预测为 ,即正向类;

,预测为 ,即负向类。

即以 0.5 为阈值(threshold),则我们就可以根据线性回归结果,得到相对正确的分类结果

 

接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果,对于癌症、肿瘤诊断这类要求预测极其精确的问题,这种情况是无法容忍的。

不仅如此,线性回归算法的值域为 ,则当线性回归函数给出诸如 等很大/很小(负数)的数值时,结果 ,这显得非常怪异。

 

区别于线性回归算法,逻辑回归算法是一个分类算法,其输出值永远在 0 到 1 之间,即

6.2 假设函数表示(Hypothesis Representation)

为了使 ,引入逻辑回归模型,定义假设函数

对比线性回归函数 表示逻辑函数(logistic function),复合起来,则称为逻辑回归函数。

逻辑函数是 S 形函数,会将所有实数映射到 范围。

sigmoid 函数(如下图)是逻辑函数的特殊情况,其公式为

sigmoid function

应用 sigmoid 函数,则逻辑回归模型:

逻辑回归模型中, 的作用是,根据输入 以及参数 ,计算得出”输出 “的可能性(estimated probability),概率学中表示为:

 

以肿瘤诊断为例, 表示病人有 的概率得了恶性肿瘤。

6.3 决策边界(Decision Boundary)

决策边界的概念,可帮助我们更好地理解逻辑回归模型的拟合原理。

在逻辑回归中,有假设函数

为了得出分类的结果,这里和前面一样,规定以 为阈值:

回忆一下逻辑函数的图像:

sigmoid function

观察可得当 时,有 ,即

同线性回归模型的不同点在于:

直观一点来个例子, 是下图模型的假设函数:

根据上面的讨论,要进行分类,那么只要 时,就预测 ,即预测为正向类。

如果取 ,则有 ,当 时,易绘制图中的品红色直线即决策边界,为正向类(以红叉标注的数据)给出 的分类预测结果。

 

上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中的情况也是类似的。

为了拟合下图数据,建模多项式假设函数:

这里取 ,决策边界对应了一个在原点处的单位圆(),如此便可给出分类结果,如图中品红色曲线:

 

当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界形似碗状、爱心状等等。

 

简单来说,决策边界就是分类的分界线,分类现在实际就由 (中的 )决定啦。

6.4 损失函数(Cost Function)

上节又留下了个问题,我们怎么知道决策边界是啥样? 多少时能很好的拟合数据?当然,见招拆招,总要来个

如果直接套用线性回归的损失函数:

其中 ,可绘制关于 的图像,如下图

回忆线性回归中的损失函数,其是一个二次凸函数(碗状),二次凸函数的重要性质是只有一个局部最小点即全局最小点。上图中有许多局部最小点,这样梯度下降算法将无法确定收敛点是全局最优。

如果是一个凸函数,可以对其进行最优化分析,这类最优化问题,称为凸优化问题。还好,损失函数不止平方损失函数一种。

对于逻辑回归,更换平方损失函数为对数损失函数:

则可绘制关于 的图像如下:

如左图,当训练集的结果为 (正样本)时,随着假设函数趋向于 ,损失函数的值会趋于 ,即意味着拟合程度很好。如果假设函数此时趋于 ,则会给出一个很高的损失,拟合程度,算法会根据其迅速纠正 值,右图 同理。

区别于平方损失函数,对数损失函数也是一个凸函数,但没有局部最优值。

6.5 简化的成本函数和梯度下降(Simplified Cost Function and Gradient Descent)

由于懒得分类讨论,对于二元分类问题,我们把损失函数简化为一个函数: +

,左边式子整体为 ,当 ,则 ,右边式子整体为0,也就和上面的分段函数一样了,而一个式子计算起来更方便。

向量化实现:

 

为了最优化 ,仍使用梯度下降法,算法同线性回归中一致:

解出偏导得:

注意,虽然形式上梯度下降算法同线性回归一样,但其中的假设函不同,即,不过求导后的结果也相同。

向量化实现:

 

对数损失函数求导的推导过程:

带入得

+

根据求偏导的性质,没有 的项都消去,则得:

所以有:

+ + + + + + +

则可得对数损失函数的导数:

 

6.6 进阶优化(Advanced Optimization)

 

6.7 多类别分类: 一对多(Multiclass Classification: One-vs-all)

7 Regularization

7.1 The Problem of Overfitting

7.2 Cost Function

7.3 Regularized Linear Regression

7.4 Regularized Logistic Regression

\ No newline at end of file diff --git a/week3.md b/week3.md index 797a4c9..c4621d3 100644 --- a/week3.md +++ b/week3.md @@ -10,11 +10,11 @@ - 金融欺诈判断 - 肿瘤诊断 -肿瘤诊断问题: +讨论肿瘤诊断问题: ![](image/20180109_144040.png) -肿瘤诊断问题是一个**二元分类问题(binary class problems)**,则定义 $ y \in\lbrace 0, 1\rbrace$,其中 0 表示**负向类(negative class)**,代表恶性肿瘤("-"),1 为**正向类(positive class)**,代表良性肿瘤("+")。如图,定义最右边的样本为**偏差项**。 +肿瘤诊断问题的目的是告诉病人**是否**为恶性肿瘤,是一个**二元分类问题(binary class problems)**,则定义 $ y \in\lbrace 0, 1\rbrace$,其中 0 表示**负向类(negative class)**,代表恶性肿瘤("-"),1 为**正向类(positive class)**,代表良性肿瘤("+")。如图,定义最右边的样本为**偏差项**。 在未加入偏差项时,线性回归算法给出了品红色的拟合直线,若规定 @@ -26,21 +26,21 @@ $h_\theta(x) \lt 0.5$ ,预测为 $y = 0$,即负向类。 -接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果。 +接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果,对于癌症、肿瘤诊断这类要求预测极其精确的问题,这种情况是无法容忍的。 -不仅如此,线性回归算法的值域为 $R$,则当线性回归函数给出诸如 $h = 10000, h = -10000$ 等很大/很小(负数)的数值时,结果 $y \in \lbrace 0, 1\rbrace$,这显得非常怪异。 +不仅如此,线性回归算法的值域为 $R$,则当线性回归函数给出诸如 $h_\theta(x) = 10000, h_\theta(x) = -10000$ 等很大/很小(负数)的数值时,结果 $y \in \lbrace 0, 1\rbrace$,这显得非常怪异。 -区别于线性回归算法,逻辑回归算法是一个分类算法,**其输出值永远在 0 到 1 之间**,即 $h \in (0,1)$。 +区别于线性回归算法,逻辑回归算法是一个分类算法,**其输出值永远在 0 到 1 之间**,即 $h_\theta(x) \in (0,1)$。 ## 6.2 假设函数表示(Hypothesis Representation) -为了使 $h \in \left(0, 1\right)$,引入逻辑回归模型,定义假设函数 +为了使 $h_\theta(x) \in \left(0, 1\right)$,引入逻辑回归模型,定义假设函数 $$ -h_\theta \left( x \right)=g(z)=g\left(\theta^{T}X \right) +h_\theta \left( x \right)=g(z)=g\left(\theta^{T}x \right) $$ -对比线性回归函数 $h_\theta \left( x \right)=\theta^{T}X$,$g$ 表示逻辑函数([logistic function][1]),复合起来,则称为逻辑回归函数。 +对比线性回归函数 $h_\theta \left( x \right)=\theta^{T}x$,$g$ 表示逻辑函数([logistic function][1]),复合起来,则称为逻辑回归函数。 逻辑函数是 S 形函数,会将所有实数映射到 $(0, 1)$ 范围。 @@ -63,9 +63,9 @@ $\begin{align*}& h_\theta(x) = P(y=1 | x ; \theta) = 1 - P(y=0 | x ; \theta) \ne ## 6.3 决策边界(Decision Boundary) -决策边界的概念可以帮助我们更好地理解逻辑回归模型。 +决策边界的概念,可帮助我们更好地理解逻辑回归模型的拟合原理。 -在逻辑回归中,有假设函数 $h_\theta \left( x \right)=g(z)=g\left(\theta^{T}X \right)$。 +在逻辑回归中,有假设函数 $h_\theta \left( x \right)=g(z)=g\left(\theta^{T}x \right)$。 为了得出分类的结果,这里和前面一样,规定以 $0.5$ 为阈值: @@ -76,11 +76,11 @@ $\begin{align*}& h_\theta(x) \geq 0.5 \rightarrow y = 1 \newline& h_\theta(x) < ![sigmoid function](image/2413fbec8ff9fa1f19aaf78265b8a33b_Logistic_function.png) -观察可得当 $g(z) \geq 0.5$ 时,有 $z \geq 0$,即 $\theta^TX \geq 0$。 +观察可得当 $g(z) \geq 0.5$ 时,有 $z \geq 0$,即 $\theta^Tx \geq 0$。 同线性回归模型的不同点在于: $\begin{align*}z \to +\infty, e^{-\infty} \to 0 \Rightarrow g(z)=1 \newline z \to -\infty, e^{\infty}\to \infty \Rightarrow g(z)=0 \end{align*}$ -直观一点来个例子,${h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}\right)$ 是下图模型的假设函数。 +直观一点来个例子,${h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}\right)​$ 是下图模型的假设函数: ![](image/20180111_000814.png) @@ -90,35 +90,120 @@ $\begin{align*}& h_\theta(x) \geq 0.5 \rightarrow y = 1 \newline& h_\theta(x) < -上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中讨论的其实没有多大区别。 +上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中的情况也是类似的。 为了拟合下图数据,建模多项式假设函数: ${h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}+{\theta_{3}}x_{1}^{2}+{\theta_{4}}x_{2}^{2} \right)$ -这里取 $\theta = \begin{bmatrix} -1\\0\\0\\1\\1\end{bmatrix}$,决策边界对应了一个在原点处的单位圆,如此便可给出分类结果了,如图中品红色曲线: +这里取 $\theta = \begin{bmatrix} -1\\0\\0\\1\\1\end{bmatrix}$,决策边界对应了一个在原点处的单位圆(${x_1}^2+{x_2}^2 = 1$),如此便可给出分类结果,如图中品红色曲线: ![](image/20180111_000653.png) -当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界像碗状、爱心状等等。 +当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界形似碗状、爱心状等等。 简单来说,决策边界就是**分类的分界线**,分类现在实际就由 $z$ (中的 $\theta$)决定啦。 -## 6.4 代价函数(Cost Function) +## 6.4 损失函数(Cost Function) 上节又留下了个问题,我们怎么知道决策边界是啥样?$\theta$ 多少时能很好的拟合数据?当然,见招拆招,总要来个 $J(\theta)$。 +如果直接套用线性回归的损失函数: $J\left( {\theta} \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( h_{\theta} \left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}}$ +其中 $h_\theta(x) = g\left(\theta^{T}x \right)$,可绘制关于 $J(\theta)$ 的图像,如下图 -## 6.5 Simplified Cost Function and Gradient Descent +![](image/20180111_080314.png) -## 6.6 Advanced Optimization +回忆线性回归中的损失函数,其是一个二次凸函数(碗状),二次凸函数的重要性质是只有一个局部最小点即全局最小点。上图中有许多局部最小点,这样梯度下降算法将无法确定收敛点是全局最优。 -## 6.7 Multiclass Classification_ One-vs-all +![](image/20180111_080514.png) + +如果是一个凸函数,可以对其进行最优化分析,这类最优化问题,称为**凸优化问题**。还好,损失函数不止平方损失函数一种。 + +对于逻辑回归,更换平方损失函数为**对数损失函数:** + +$\begin{align*}& J(\theta) = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \newline & \mathrm{Cost}(h_\theta(x),y) = -\log(h_\theta(x)) \; & \text{if y = 1} \newline & \mathrm{Cost}(h_\theta(x),y) = -\log(1-h_\theta(x)) \; & \text{if y = 0}\end{align*}$ + +则可绘制关于 $J(\theta)$ 的图像如下: + +![](image/20180111_080614.png) + +如左图,当训练集的结果为 $y=1$(正样本)时,随着假设函数趋向于 $1$,损失函数的值会趋于 $0$,即意味着拟合程度很好。如果假设函数此时趋于 $0$,则会给出一个**很高的损失**,拟合程度**差**,算法会根据其迅速纠正 $\theta$ 值,右图 $y=0$ 同理。 + +区别于平方损失函数,对数损失函数也是一个凸函数,但没有局部最优值。 + +## 6.5 简化的成本函数和梯度下降(Simplified Cost Function and Gradient Descent) + +由于懒得分类讨论,对于二元分类问题,我们把损失函数**简化**为一个函数: +$Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right)$ + +当 $y = 0$,左边式子整体为 $0$,当 $y = 1$,则 $1-y=0$,右边式子整体为0,也就和上面的分段函数一样了,而一个式子计算起来更方便。 + +$J(\theta) = - \frac{1}{m} \displaystyle \sum_{i=1}^m [y^{(i)}\log (h_\theta (x^{(i)})) + (1 - y^{(i)})\log (1 - h_\theta(x^{(i)}))]$ + +向量化实现: + +$h = g(X\theta)$,$J(\theta) = \frac{1}{m} \cdot \left(-y^{T}\log(h)-(1-y)^{T}\log(1-h)\right)$ + + + +为了最优化 $\theta$,仍使用梯度下降法,算法同线性回归中一致: + +$\begin{align*} & \text{repeat until convergence:} \; \lbrace \newline \; &{{\theta }_{j}}:={{\theta }_{j}}-\alpha \frac{\partial }{\partial {{\theta }_{j}}}J\left( {\theta} \right) \newline \rbrace \end{align*}$ + +解出偏导得: + +$\begin{align*}& \text{repeat until convergence:} \; \lbrace \newline \; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; & \text{for j := 0,1...n}\newline \rbrace\end{align*}$ + +注意,虽然形式上梯度下降算法同线性回归一样,但其中的假设函不同,即$h_\theta(x) = g\left(\theta^{T}x \right)$,不过求导后的结果也相同。 + +向量化实现:$\theta := \theta - \frac{\alpha}{m} X^{T} (g(X \theta ) - y)$ + + + +**对数损失函数求导的推导过程:** + +$J(\theta) = - \frac{1}{m} \displaystyle \sum_{i=1}^m [y^{(i)}\log (h_\theta (x^{(i)})) + (1 - y^{(i)})\log (1 - h_\theta(x^{(i)}))]$ + +令 $f(\theta) = {{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)$ + +将 $h_\theta(x^{(i)}) = g\left(\theta^{T}x^{(i)} \right)=\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} $ 带入得 + +$f(\theta)={{y}^{(i)}}\log \left( \frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} \right)$ +$=-{{y}^{(i)}}\log \left( 1+{{e}^{-{\theta^T}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{{\theta^T}{{x}^{(i)}}}} \right)$ + +根据求偏导的性质,没有 $\theta_j$ 的项都消去,则得: + +$\frac{\partial }{\partial {\theta_{j}}}\left( \theta^Tx^{(i)} \right)=x^{(i)}_j$ + +所以有: + +$\frac{\partial }{\partial {\theta_{j}}}f\left( \theta \right)=\frac{\partial }{\partial {\theta_{j}}}[-{{y}^{(i)}}\log \left( 1+{{e}^{-{\theta^{T}}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{{\theta^{T}}{{x}^{(i)}}}} \right)]$ + +$=-{{y}^{(i)}}\frac{-x_{j}^{(i)}{{e}^{-{\theta^{T}}{{x}^{(i)}}}}}{1+{{e}^{-{\theta^{T}}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}$ +$={{y}^{(i)}}\frac{x_j^{(i)}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}$ +$={\frac{{{y}^{(i)}}x_j^{(i)}-x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}+{{y}^{(i)}}x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}}$ +$={\frac{{{y}^{(i)}}\left( 1\text{+}{{e}^{{\theta^T}{{x}^{(i)}}}} \right)-{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}x_j^{(i)}}$ +$={({{y}^{(i)}}-\frac{{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}})x_j^{(i)}}$ +$={({{y}^{(i)}}-\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}})x_j^{(i)}}$ +$={\left({{y}^{(i)}}-{h_\theta}\left( {{x}^{(i)}} \right)\right)x_j^{(i)}}$ +$={\left({h_\theta}\left( {{x}^{(i)}} \right)-{{y}^{(i)}}\right)x_j^{(i)}}$ + +则可得对数损失函数的导数: + +$\frac{\partial }{\partial {\theta_{j}}}J(\theta) = -\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{\partial }{\partial {\theta_{j}}}f(\theta)}=\frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} $ + + + +## 6.6 进阶优化(Advanced Optimization) + + + +## 6.7 多类别分类: 一对多(Multiclass Classification: One-vs-all) # 7 Regularization ## 7.1 The Problem of Overfitting