




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2025AI第1算法入數(shù)據(jù)的例子是公元前18000拉底河與底格里斯河河畔(兩河流域),人花了900算法。輾轉(zhuǎn)相除法的意思是兩個(gè)正整數(shù)a和b(ab)的最大公約數(shù),輸入兩個(gè)正整數(shù)a和計(jì)算a除以b的余數(shù)如果r等于0,則最大公約數(shù)為當(dāng)前的b如果r不等于0,則a=b,b=r,跳轉(zhuǎn)至步驟(2)LikelihoodEstimate,MLE)在神經(jīng)網(wǎng)絡(luò)模型中應(yīng)用廣泛;貝葉斯學(xué)元胞自動(dòng)機(jī)(CellularAutomata,CA)。元胞自動(dòng)機(jī)中單個(gè)個(gè)體的顧名思義,數(shù)據(jù)分析(DataAnalysis)就是對(duì)數(shù)據(jù)進(jìn)行分析,顧名思義,機(jī)器學(xué)習(xí)(MachineLearning)就是讓機(jī)器自己去學(xué)提高面向大學(xué)生手機(jī)市場(chǎng)的投資收益率(ReturnonInvestment,算法是一個(gè)很大的概念,AI第3第2算法之可以稱為算法;往小了說(shuō),在信息技術(shù)(InformationTechnology,對(duì)于數(shù)學(xué)關(guān)系f(x+y)=f(x)+f(y),線性代數(shù)不關(guān)心其中x和y的具體含義是什么,其研究的是擁有這種線性映射關(guān)系的函數(shù)f質(zhì)。標(biāo)量:表示一個(gè)簡(jiǎn)單的數(shù),如29、31的“50”次是[50,51,52,53,52,48,45],則“[50,51,52,53,48,45]”是一個(gè)向量;加上這周每天賣出的豆沙包、咸菜包的數(shù)量,(batch)可見(jiàn),掌握向量和矩陣的相關(guān)知識(shí),對(duì)于算法“內(nèi)力”的修煉至關(guān)重要。既然涉及運(yùn)算,自然會(huì)有相應(yīng)的運(yùn)算法則,那么向量和矩陣的運(yùn)算法則是怎么樣的呢?某公司有n名員工,月工資用向量[a1,a2,…,an-1,an]表示,其表2-1員工漲薪情況(一情形二:公司業(yè)績(jī)不錯(cuò),根據(jù)員工完成業(yè)績(jī)的不同,老板決定對(duì)不同的員工給出相應(yīng)的工資漲幅。以絕對(duì)值漲幅為例(也可以是不同的比例漲幅),給第i位員工每月增加bi元工資,可以用行(列)向與行(列)向量之間的加法來(lái)計(jì)算漲薪后的工資,如表2-2所示。表2-2員工漲薪情況(二根據(jù)行向量與列向量相乘的例子可知,使運(yùn)算成立的一個(gè)隱含條件是,行向量的列數(shù)必須與列向量的行數(shù)相等,如例子中的向量長(zhǎng)度均為n,這有助于理解后面的矩陣運(yùn)算(向量是一種特殊的矩陣)向量的列數(shù)與行向量的行數(shù)都等于1即可得到一個(gè)矩陣,具體計(jì)算方法如下。在機(jī)器學(xué)習(xí)中,向量通常用于表示特定維度空間中不同維度的特征值,因此又稱為特征向量。例如,一個(gè)二維特征向量[1,2]表示兩個(gè)特征,第一個(gè)特征維度的值為1,第二個(gè)特征維度的值為2。既然是空間,那就存在距離的概念,即同一個(gè)特征空間中不同特征向量之間存在著某種關(guān)系,如相似的特征表現(xiàn)。假設(shè)有另一個(gè)二維特征向量4],其在兩個(gè)特征維度上的值分別為2和4,可以發(fā)現(xiàn),這個(gè)二維特征向量和前面的二維特征向量,在各個(gè)維度上的特征值大小恰好相差一倍,這說(shuō)明二者的特征表現(xiàn)相似,只是程度不同。當(dāng)然,在實(shí)際算法工程中,特征向量之間的關(guān)系會(huì)有更復(fù)雜的度量方式,如相似度、相關(guān)系數(shù)等。假設(shè)A、B、C在線性代數(shù)中,關(guān)于向量和矩陣的知識(shí)點(diǎn)還有很多,包括單位矩陣、對(duì)角矩陣、對(duì)稱矩陣等,這些知識(shí)點(diǎn)在PCA分解等算法中都有所運(yùn)用,下文只對(duì)這些概念進(jìn)行簡(jiǎn)單介紹,感興趣的讀者可以自行深入拓展學(xué)習(xí)。①?gòu)脑撔〗M中選出3②從該小組中選出3可以用形式化的語(yǔ)言描述排列問(wèn)題,即n個(gè)人中計(jì)算m法;最后從剩下的3個(gè)人中選出1個(gè)人站在位置3上,一共有3種選法;因此共有60(5×4×3)母A表示排列,具體計(jì)算公式如下。法總數(shù)就是10(60/3!)種。使用字母C表示組合,具體計(jì)算公式如看到這節(jié),你可能會(huì)問(wèn):搞AI算法還需要學(xué)習(xí)高等數(shù)學(xué)?大家知道,高等數(shù)學(xué)涵蓋的知識(shí)點(diǎn)比較多,并且比較難以理解。別擔(dān)心,本書(shū)只講解高等數(shù)學(xué)中與AI算法最相關(guān)的兩個(gè)知識(shí)點(diǎn)——導(dǎo)數(shù)和梯度這兩個(gè)知識(shí)點(diǎn)在AI算法的公式推導(dǎo)中至關(guān)重要,有助于幫助我們理解算法模型在實(shí)際應(yīng)用中起作用的原因。三角函數(shù)處處連續(xù),同時(shí)處處可導(dǎo)。以正弦函數(shù)y=sinx數(shù)圖像上的每個(gè)點(diǎn)都是光滑的,可以計(jì)算函數(shù)圖像在該點(diǎn)處的切線斜率,如圖2-1所示。圖2- 正弦函數(shù)y=sinx的圖數(shù)圖像同樣處處連續(xù)。但是,在坐標(biāo)為(0,0)的點(diǎn)的位置雖然連續(xù),圖2- 線性絕對(duì)值函數(shù)y=|x|的圖此外,在使用神經(jīng)網(wǎng)絡(luò)的AI表2-3事件之間的基本關(guān)系和集合運(yùn)算一樣,事件之間的運(yùn)算也具備以下3交換律:A∪B=B∪A,A∩B=B∩A結(jié)合律:A∪B∪C=A∪(B∪C),A∩B∩C=A∩(B∩C)分配律:A∩(B∪C)=(A∩B)∪(A∩C),A∪(B∩C)=(A∪B)∩(拋硬幣正面朝上的次數(shù)和地鐵站的上車人數(shù)都是可數(shù)的,最小單位是1,壽命、人的身高體重的取值是連續(xù)的,沒(méi)有最小單位,在數(shù)學(xué)中稱為連續(xù),這類隨機(jī)變量稱為連續(xù)型隨機(jī)變量。拋擲一枚質(zhì)地均勻的硬幣,正反兩面出現(xiàn)的概率各占一半,在進(jìn)行足夠數(shù)量的拋擲實(shí)驗(yàn)后,正反兩面實(shí)際出現(xiàn)的次數(shù)會(huì)各自接近這個(gè)50%方法是用實(shí)驗(yàn)中事件的發(fā)生概率乘重復(fù)實(shí)驗(yàn)的總次數(shù),一般用字母μ或E表示。顧名思義,條件概率是指事件滿足一定條件所發(fā)生的概率。在通常情況下,兩個(gè)事件A和B,P(A|B)表示在事件BA發(fā)生的概率。圖2- 均勻分布的連續(xù)型隨機(jī)變量的概率密度函數(shù)圖顧名思義,二項(xiàng)分布就是取值只有正、負(fù)兩種結(jié)果的概率分布,因此其隨機(jī)變量只能是離散型隨機(jī)變量。用數(shù)學(xué)語(yǔ)言描述就是,關(guān)于個(gè)獨(dú)立的二值實(shí)驗(yàn)中有多少次為正的離散型概率分布。當(dāng)p=0.5、n=12時(shí),二項(xiàng)分布的概率質(zhì)量函數(shù)圖像如圖2-4圖2- 二項(xiàng)分布的概率質(zhì)量函數(shù)圖像量。與二項(xiàng)分布不同,幾何分布關(guān)心的是事件(或?qū)嶒?yàn))發(fā)生n第x次取得成功的概率。典型的例子是打靶,在n次打靶過(guò)程中第一次命中靶心的概率。幾何分布的數(shù)學(xué)期望如下。當(dāng)p=0.5時(shí),幾何分布的概率質(zhì)量函數(shù)圖像如圖2-5圖2- 幾何分布的概率質(zhì)量函數(shù)圖像當(dāng)μ=0.9時(shí),泊松分布的概率質(zhì)量函數(shù)圖像如圖2-6圖2- 泊松分布的概率質(zhì)量函數(shù)圖像當(dāng)λ=0.8時(shí),指數(shù)分布的概率質(zhì)量函數(shù)圖像如圖2-7圖2- 指數(shù)分布的概率質(zhì)量函數(shù)圖像高斯分布的概率密度函數(shù)圖像如圖2-8圖2- 高斯分布的概率密度函數(shù)圖最優(yōu)化問(wèn)題分為有約束的最優(yōu)化問(wèn)題和無(wú)約束的最優(yōu)化問(wèn)題。有約束的最優(yōu)化問(wèn)題分為等式約束優(yōu)化問(wèn)題和不等式約束優(yōu)化問(wèn)題,這類問(wèn)題通常使用拉格朗日乘數(shù)法和KKT分為全局最優(yōu)化問(wèn)題和局部最優(yōu)化問(wèn)題,這類問(wèn)題可以使用牛頓法和最小二乘法解決。石頭平時(shí)比較喜歡自己在家里榨果汁,主要使用5種原材料:杧果、草莓、香蕉、牛奶和木瓜。石頭在榨果汁時(shí)常用的42-4所示,5種原材料在不同超市的售賣價(jià)格如表2-5的形式計(jì)算這4種果汁配方的成本分別是多少。表2-4石頭在榨果汁時(shí)常用的4種配方(單位:份表2-55種原材料在不同超市的售賣價(jià)格(單位:元/份5第3算法之招數(shù)組(Array)連續(xù)分配的方式存儲(chǔ)的。由于是連續(xù)存儲(chǔ),因此只要知道某個(gè)元素在數(shù)組中的編號(hào)(下標(biāo))及數(shù)組的起始位置,相加計(jì)算偏移就能訪問(wèn)這個(gè)元素的值。數(shù)組按空間維度劃分,可以分為一維數(shù)組、二維數(shù)組、多維數(shù)組,一維數(shù)組的存儲(chǔ)圖例如圖3-1所示。圖3- 一維數(shù)組的存儲(chǔ)圖明。小王、小李和小張一起去電影院看電影,在買票選座位時(shí)希望選擇同一排的連號(hào)座位,這種座位分配方式就是一維數(shù)組的存儲(chǔ)方式。假設(shè)小王、小李、小張按從左至右的順序依次入座,編號(hào)分別為0、1、2。由于3編號(hào)進(jìn)行相加,就能知道另外兩個(gè)人的座位號(hào)了。其實(shí),一個(gè)影廳的座位可以理解成由一維數(shù)組(每一排)組成的二維數(shù)組,所謂的“幾排幾號(hào)”其實(shí)就是二維數(shù)組的索引方式。如果影廳有多層,就可以理解為三維數(shù)組,座位索引就是“幾層幾排幾號(hào)”。圖3- 單鏈表的存儲(chǔ)結(jié)構(gòu)圖隊(duì)列(Queue)的數(shù)據(jù)插入特點(diǎn)是先進(jìn)先出(FirstInFirstOut,F(xiàn)IFO)。FIFO替換策略、網(wǎng)絡(luò)路由器的流量分配策略等。直觀地理解,隊(duì)列的例子就是生活中的各種排隊(duì)。例如,在火車站出站后打出租車需要排隊(duì),按先來(lái)后到的順序依次上車;在食堂窗口前排隊(duì),講究的也是先來(lái)后到。因此,我們可以將隊(duì)列理解為提供FIFO理解了隊(duì)列,棧(Stack)就比較好理解了。棧的數(shù)據(jù)插入特點(diǎn)是后進(jìn)先出(LastInFirstOut,LIFO)泛的應(yīng)用,可以說(shuō)程序員無(wú)時(shí)無(wú)刻不在和LIFO打交道。一個(gè)最典型的例子就是程序中的函數(shù)調(diào)用。除此之外,在滿足遞歸定義的問(wèn)題中,棧的運(yùn)用也比較多。一個(gè)深入敵后潛伏的情報(bào)組織,每級(jí)情報(bào)員都分配了若干名下級(jí)情報(bào)員,相鄰兩級(jí)情報(bào)員分別叫作彼此的上線和下線。為了防止下線在暴露之后對(duì)整個(gè)組織造成威脅,上線和下線之間是單向通信的,上線能聯(lián)系下線,下線無(wú)法聯(lián)系上線,并且信息通路不形成環(huán)路(如我下線的下線不會(huì)是我的上線)。如果每級(jí)情報(bào)員的下線固定最多有2情報(bào)員,那么這種情報(bào)結(jié)構(gòu)就是二叉樹(shù)結(jié)構(gòu);如果固定最多有3員,那么這種情報(bào)結(jié)構(gòu)就是三叉樹(shù)結(jié)構(gòu);以此類推。不僅結(jié)構(gòu)相似,(根部)圖3- 二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)圖既然是樹(shù),就會(huì)有高度。從根節(jié)點(diǎn)開(kāi)始向下累積的層數(shù)就是樹(shù)的高度,如圖3-3中的二叉樹(shù)的高度為3。二叉樹(shù)之所以被廣泛應(yīng)用,是因?yàn)樗詈?jiǎn)單,又最具有代表性。二叉樹(shù)的種類有很多,如完全二叉樹(shù)、滿二叉樹(shù)、平衡二叉樹(shù)、霍夫曼樹(shù)、B有不同的性質(zhì)、不同的應(yīng)用場(chǎng)景,感興趣的讀者可以自行深入了解。二叉樹(shù)不像鏈表的順序遍歷那么簡(jiǎn)單,因?yàn)槊總€(gè)節(jié)點(diǎn)最多有兩個(gè)孩子節(jié)點(diǎn),所以遍歷方法有4圖3- 二叉樹(shù)的遍層序遍歷:1→2→3→4→5→6→7圖(Graph)結(jié)構(gòu)。前面講到的鏈表和樹(shù),其實(shí)都是圖的特殊情況,鏈表只能向一個(gè)方向進(jìn)行鏈接,樹(shù)的節(jié)點(diǎn)之間不允許形成環(huán)。圖結(jié)構(gòu)沒(méi)有這些限圖3- 有向圖和無(wú)向圖是一種非常實(shí)用的數(shù)據(jù)結(jié)構(gòu),在工作、生活的方方面面都能用到它。例如,如果將每個(gè)人作為節(jié)點(diǎn),將人與人之間的關(guān)系作為邊,可以構(gòu)成一個(gè)大小為70多億節(jié)點(diǎn)的社交網(wǎng)絡(luò)圖。著名的小世界現(xiàn)象,你和任何陌生人之間所間隔的人數(shù)不會(huì)超過(guò)6得出的猜想。在計(jì)算機(jī)世界中,圖經(jīng)常用于描述任務(wù)的狀態(tài)轉(zhuǎn)換和調(diào)度關(guān)系。例如,節(jié)點(diǎn)代表待執(zhí)行的任務(wù),邊代表任務(wù)相關(guān)性或依賴順序。圖的存儲(chǔ)方式有兩種,一種是以鏈表形式存儲(chǔ),每個(gè)節(jié)點(diǎn)及其相鄰節(jié)點(diǎn)都用一個(gè)鏈表表示,這種存儲(chǔ)方式稱為鄰接鏈表;另一種是以數(shù)組形式存儲(chǔ),用一維數(shù)組記錄所有節(jié)點(diǎn),用一個(gè)二維數(shù)組記錄所有邊,這種存儲(chǔ)方式稱為鄰接矩陣。鄰接鏈表和鄰接矩陣的優(yōu)劣對(duì)比與鏈表和數(shù)組之間的對(duì)比類似,鄰接鏈表使用的是鏈表,鄰接矩陣使用的是二維數(shù)組。以圖3-5存儲(chǔ)形式如圖3-6所示。圖3- 鄰接鏈表和鄰接矩陣的具體存儲(chǔ)形散列表(HashTable)又稱為哈希表。在講解散列表之前,我們這里補(bǔ)充說(shuō)明一下什么是時(shí)間復(fù)雜度。O(N)和O(logN)法復(fù)雜度的符號(hào),算法復(fù)雜度主要包含兩個(gè)方面:空間復(fù)雜度和時(shí)間復(fù)雜度。其中,空間復(fù)雜度定性地描述了一個(gè)算法運(yùn)行所需內(nèi)存空間的數(shù)量級(jí),時(shí)間復(fù)雜度定性地描述了一個(gè)算法運(yùn)行所需時(shí)間的數(shù)量級(jí)。在通常情況下,我們優(yōu)先考慮算法的時(shí)間復(fù)雜度。在時(shí)間復(fù)雜度中,O(N)表示當(dāng)數(shù)據(jù)量為N級(jí)為線性級(jí)別;O(logN)表示當(dāng)數(shù)據(jù)量為N時(shí),計(jì)算機(jī)需要執(zhí)行的基本運(yùn)算次數(shù)數(shù)量級(jí)為對(duì)數(shù)級(jí)別。除了O(N)和O(logN),還有O(NlogN)、O(N2)、O(N3)等,含義以此類推。O(logN)的時(shí)間復(fù)雜度比O(N)復(fù)雜度低,表示O(logN)的算法比O(N)的算法更合適。例如,當(dāng)N為1024時(shí),logN只有10。O(logN)更低。散列表可以將查詢身份證號(hào)碼的時(shí)間復(fù)雜度降到O(1),即常數(shù)級(jí)別。散列表用到的關(guān)鍵技術(shù)是函數(shù)值映射,利用散列函數(shù),將key(姓名字符串)映射到一個(gè)有限的數(shù)值空間內(nèi)。例如,一個(gè)長(zhǎng)度為10億的數(shù)組,如果使用恰當(dāng)?shù)纳⒘泻瘮?shù),那么映射后的值會(huì)均勻分布到這個(gè)數(shù)組中。在查詢時(shí),計(jì)算被查詢姓名的散列值,即可直接取出數(shù)組中對(duì)應(yīng)下標(biāo)的身份證號(hào)碼。這里你可能會(huì)問(wèn),姓名有重復(fù)怎么辦?沒(méi)關(guān)系,這個(gè)問(wèn)題在散列表中經(jīng)常出現(xiàn),這種現(xiàn)象稱為鍵值沖突。鍵值沖突問(wèn)題的解決方法比較簡(jiǎn)單,在遇到重復(fù)key散列值后面增加一個(gè)鏈表,用于存儲(chǔ)重復(fù)key值。散列表的沖突存儲(chǔ)方式與鄰接鏈表的存儲(chǔ)方式類似,重復(fù)的key會(huì)被存儲(chǔ)于同一個(gè)散列值生成的鏈表中。當(dāng)然,散列函數(shù)直接影響到了鍵值沖突問(wèn)題的大小,一個(gè)映射不均勻的散列函數(shù)有可能導(dǎo)致嚴(yán)重的鏈表傾斜,即大量數(shù)據(jù)被映射到同一個(gè)鍵值,導(dǎo)致對(duì)這些鍵值的訪問(wèn)退化成順序遍歷,降低檢索效率。針對(duì)這個(gè)問(wèn)題,一方面可以選取合適的散列函數(shù);另一方面,在發(fā)生鍵值沖突后,可以采取二次散列法和設(shè)計(jì)公共溢出區(qū)等措施。選擇排序(SelectionSort)的基本思路是每次選出剩余序列中時(shí),會(huì)從剩下的N-1個(gè)元素中選出最值,需要執(zhí)行N-2以升序排序?yàn)槔x擇排序的執(zhí)行過(guò)程如圖3-7圖3- 選擇排序的執(zhí)行過(guò)插入排序(InsertionSort)的基本思路是依次取出序列中的每算;算法在執(zhí)行第2輪排序時(shí),會(huì)取一個(gè)元素插入長(zhǎng)度為1以升序排序?yàn)槔?,插入排序的?zhí)行過(guò)程如圖3-8圖3- 插入排序的執(zhí)行過(guò)顧名思義,冒泡排序(BubbleSort)的元素值,將最值像水里的氣泡冒上水面一樣選出來(lái)。與選擇排序和插入排序相比,冒泡排序不需要額外的序列存儲(chǔ)空間,在算法執(zhí)行完成后,原序列即可變成有序序列。對(duì)于一個(gè)長(zhǎng)度為N從原序列的最后一個(gè)元素開(kāi)始。算法在執(zhí)行第1依次比較相鄰兩個(gè)元素值,如果前面的元素值大于后面的元素值,就交換兩個(gè)元素的位置,直到第一個(gè)元素,需要執(zhí)行N-1法在執(zhí)行第2二個(gè)元素,需要執(zhí)行N-2兩個(gè)元素值,需要執(zhí)行1次比較運(yùn)算。這樣,總的比較次數(shù)也是因此冒泡排序的時(shí)間復(fù)雜度也是O(N2)以升序排序?yàn)槔?,冒泡排序的?zhí)行過(guò)程如圖3-9圖3- 冒泡排序的執(zhí)行過(guò)快速排序(QuickSort)簡(jiǎn)稱快排,是程序員面試時(shí)考官最??贾?,右序列中的元素值都不小于所選元素值);算法在執(zhí)行第2時(shí),當(dāng)前序列為原序列的左序列,具體操作同前一步;算法在執(zhí)行第輪排序時(shí),當(dāng)前序列為原序列的右序列,具體操作同前一步;以此遞推,直到找到所有元素的最終位置,快速排序結(jié)束??焖倥判蛴捎诓捎谜郯氩僮?,因此時(shí)間復(fù)雜度為O(NlogN)。以升序排序?yàn)槔?,快速排序?輪排序的執(zhí)行過(guò)程如圖3-10圖3- 快速排序??1輪排序的執(zhí)行過(guò)作會(huì)退化成線性操作,時(shí)間復(fù)雜度也會(huì)變?yōu)镺(N2)??焖倥判蛑宰屗x元素在數(shù)學(xué)期望下靠近中間位置。因此,在每一輪排序開(kāi)始堆排序(HeapSort)堆或最小二叉堆。二叉堆是二叉樹(shù)的一種。最大二叉堆是指每個(gè)節(jié)點(diǎn)的元素值都比其左、右孩子節(jié)點(diǎn)的元素值要大的二叉堆,最小二叉堆是指每個(gè)節(jié)點(diǎn)的元素值都比其左、右孩子節(jié)點(diǎn)的元素值要小的二叉圖3- 堆排序??1輪排序的執(zhí)行過(guò)歸并排序(MergeSort)采用遞歸與分治的思想(在3.2.2細(xì)詳解),先保證局部有序,再保證整體有序,從局部到整體可以看作一個(gè)歸納合并的過(guò)程,這也是該排序算法名字的由來(lái)。對(duì)于一個(gè)長(zhǎng)度為N的待排序列,以升序排序?yàn)槔?,算法在?zhí)行第1輪排序時(shí),原序列中的每個(gè)元素都可以看作一個(gè)局部有序序列,將相鄰的兩個(gè)局部有序序列合并成一個(gè)長(zhǎng)度為2比較次數(shù)為1;算法在執(zhí)行第2輪排序時(shí),合并相鄰的兩個(gè)長(zhǎng)度為2部有序序列,得到長(zhǎng)度為4的局部有序序列,局部最大比較次數(shù)為3;以此類推,直到原序列有序。由此可見(jiàn),歸并排序總的執(zhí)行輪次是logN,因此其時(shí)間復(fù)雜度為O(NlogN)。以升序排序?yàn)槔?,歸并排序的執(zhí)行過(guò)程如圖3-12圖3- 歸并排序的執(zhí)行過(guò)計(jì)數(shù)排序(CountSort)是一種用更多存儲(chǔ)空間交換更高時(shí)間效對(duì)于一個(gè)長(zhǎng)度為N的待排序列,值域?yàn)閇0,K-1],初始化一個(gè)長(zhǎng)度以升序排序?yàn)槔?,?jì)數(shù)排序的執(zhí)行過(guò)程如圖3-13圖3- 計(jì)數(shù)排序的執(zhí)行過(guò)計(jì)數(shù)排序的最大問(wèn)題是隨著待排序列值域的擴(kuò)大,空間復(fù)雜度也隨之增加。桶排序(BucketSort)對(duì)一的下標(biāo)映射,而是通過(guò)一個(gè)映射函數(shù),一對(duì)多地將大小接近的數(shù)存儲(chǔ)于一個(gè)桶中,然后對(duì)每個(gè)桶中的序列進(jìn)行排序。如果每個(gè)桶中排序的時(shí)間復(fù)雜度為O(NlogN),那么桶排序的時(shí)間復(fù)雜度為∑O(NilogNi間的排序?;鶖?shù)排序(RadixSort)是桶排序的升級(jí)版,其基本思路表3-19(Recursion)如果在其定義或說(shuō)明內(nèi)部直接或間接地出現(xiàn)其本身的引用,則它們是遞歸的或遞歸定義的。當(dāng)然,有遞歸就有非遞歸。所謂非遞歸,就是不用層級(jí)關(guān)系來(lái)表達(dá)任務(wù),而是將任務(wù)拉平成線性關(guān)系表達(dá)任務(wù)。因此,支持遞歸實(shí)現(xiàn)的基礎(chǔ)算法會(huì)比非遞歸實(shí)現(xiàn)理解起來(lái)較為簡(jiǎn)單直觀。舉個(gè)例子,求長(zhǎng)度為n別如下。分治(DivideConquerAlgorithm)就是“分而治之”的意思,實(shí)質(zhì)是將原問(wèn)題分成N個(gè)規(guī)模較小、結(jié)構(gòu)與原問(wèn)題相似的子問(wèn)題,然后遞歸地求解這些子問(wèn)題,最后得到原問(wèn)題的解。與遞歸算法相比,分治算法強(qiáng)調(diào)的是同層級(jí)問(wèn)題分別治理的過(guò)程,而遞歸算法強(qiáng)調(diào)的是不同層級(jí)問(wèn)題之間的逐層遞進(jìn)與回歸的過(guò)程。貪婪算法(GreedyAlgorithm)是指每一步都采取當(dāng)前最好或最優(yōu)(最有利)否適合使用貪婪算法解決,可以根據(jù)無(wú)后效性判斷。無(wú)后效性是指某個(gè)狀態(tài)之后的收益,只與當(dāng)前狀態(tài)有關(guān),不受之前狀態(tài)的影響。通俗地講,就是眼前的最大收益可以帶來(lái)最終的最大收益?,F(xiàn)實(shí)生活中有不少問(wèn)題滿足無(wú)后效性,下面以經(jīng)典的貪婪問(wèn)題──超級(jí)書(shū)架為例進(jìn)行講解。問(wèn)題描述:有N個(gè)物品,第i個(gè)物品的高度為Hi,還有一個(gè)高度為B的書(shū)架,保證這些物品的高度之和大于或等于書(shū)架的高度BN于書(shū)架的高度B。動(dòng)態(tài)規(guī)劃(DynamicProgramming,DP)的一種算法。這個(gè)定義聽(tīng)起來(lái)有些令人費(fèi)解,我們不妨對(duì)比貪婪算法來(lái)理解。貪婪算法認(rèn)為選擇當(dāng)前步驟的最大收益可以帶來(lái)最終的最大收益。試想,有沒(méi)有這樣一類問(wèn)題,在當(dāng)前步驟不選擇最大收益,最終的收益卻比貪婪算法的收益高?答案是肯定的。下面給大家介紹一個(gè)和超級(jí)書(shū)架問(wèn)題類似的經(jīng)典動(dòng)態(tài)規(guī)劃問(wèn)題──背包問(wèn)題。包,此時(shí)背包的利用率為100%那么,動(dòng)態(tài)規(guī)劃是如何得到上面這個(gè)解的呢?還是上面的背包問(wèn)題。如果一開(kāi)始只有4個(gè)容量分別為2、3、5、6包方式就是往4個(gè)背包中分別放入2、3、5和6。緊接著,加入3個(gè)容量分別為7、8、9的背包,最優(yōu)的裝包方式分別為,容量為7的背包在裝入容量為5的背包的基礎(chǔ)上再放入2;容量為8的背包在裝入容量為6的背包的基礎(chǔ)上再放入2,或者在裝入容量為5的背包的基礎(chǔ)之上再放入3;容量為9的背包在裝入容量為6的背包的基礎(chǔ)上再放入3。最后,一個(gè)容量為10的背包如何裝包,顯然最優(yōu)方案是在裝入容量為7基礎(chǔ)上再裝入3,或者在裝入容量為8的背包的基礎(chǔ)上再裝入2,包的容量利用率就達(dá)到了100%。這便是“多階段最優(yōu)決策”的一個(gè)完整展現(xiàn)。背包問(wèn)題的動(dòng)態(tài)規(guī)劃過(guò)程如圖3-14所示。圖3- 背包問(wèn)題的動(dòng)態(tài)規(guī)劃過(guò)述。例如,背包問(wèn)題的遞推公式是f(n)=f(n–c[i]),f(n)單獨(dú)介紹。與枚舉相比(如著名的暴力枚舉法),深度優(yōu)先搜索(DepthFirstSearch,DFS)又稱為深度優(yōu)先遍歷。深度優(yōu)先,顧名思義,就是每輪搜索都會(huì)從當(dāng)前節(jié)點(diǎn)沿一條路找下去,直到每條路都走到盡頭,即遍歷完所有節(jié)點(diǎn)或滿足某個(gè)條件,算法結(jié)束。圖3-15所示為深度優(yōu)先搜索示例,起點(diǎn)為A,的遍歷序列為ABDECFG。圖3- 深度優(yōu)先搜索示寬度優(yōu)先搜索(BreadthFirstSearch,BFS)遍歷”或“廣度優(yōu)先遍歷”。寬度優(yōu)先搜索的每一輪會(huì)將距離當(dāng)前節(jié)點(diǎn)最近的節(jié)點(diǎn)全部找出來(lái),按這種方法依次找下去,直到遍歷完所有節(jié)點(diǎn)或滿足某一條件,算法結(jié)束。圖3-16所示為寬度優(yōu)先搜索示例,BFS的遍歷序列為ABCDEFG。圖3- 寬度優(yōu)先搜索示最短路徑(ShortestPath)規(guī)劃、出行線路規(guī)劃等。按照算法規(guī)模,最短路徑算法可以分為全局最短路徑算法和單源最短路徑算法。全局最短路徑算法有弗洛伊德算法(Floyd'sAlgorithm),單源最短路徑算法有迪杰斯特拉算法(Dijkstra'sAlgorithm)、貝爾曼-福特算法(Bellman-Ford's弗洛伊德算法是斯坦福大學(xué)計(jì)算機(jī)科學(xué)系教授羅伯特·弗洛伊德以當(dāng)前公認(rèn)的形式提出的。弗洛伊德算法運(yùn)用了動(dòng)態(tài)規(guī)劃,可以求出一個(gè)圖中任意兩點(diǎn)之間的最短路徑?;舅悸肥敲枯嗊x取兩個(gè)節(jié)點(diǎn),然后枚舉其他節(jié)點(diǎn),如果經(jīng)過(guò)某個(gè)節(jié)點(diǎn)能讓選取的兩個(gè)節(jié)點(diǎn)之間的距離縮短,就更新這兩個(gè)節(jié)點(diǎn)之間的距離。代碼實(shí)現(xiàn)如下,其中f意兩點(diǎn)之間的距離,可知弗洛伊德算法的時(shí)間復(fù)雜度為O(V3)。圖3- 迪杰斯特拉算法示例流圖3-17以a為起始節(jié)點(diǎn),初始化起始節(jié)點(diǎn)的距離為0更新與最優(yōu)解節(jié)點(diǎn)a相鄰的節(jié)點(diǎn)b和c更新與最優(yōu)解節(jié)點(diǎn)c相鄰的節(jié)點(diǎn)b、d、e更新與最優(yōu)節(jié)點(diǎn)e相鄰的節(jié)點(diǎn)d更新與最優(yōu)節(jié)點(diǎn)b相鄰的節(jié)點(diǎn)d與最優(yōu)節(jié)點(diǎn)d圖3- 貝爾曼-福特算法示例流圖3-18以a為起始節(jié)點(diǎn),初始化起始節(jié)點(diǎn)的距離為0使用與節(jié)點(diǎn)a相連的邊更新節(jié)點(diǎn)b和c使用與節(jié)點(diǎn)b和c相連的邊更新節(jié)點(diǎn)b、d、e使用與節(jié)點(diǎn)b相連的邊更新節(jié)點(diǎn)d最小生成樹(shù)(MinimalSpanningTree,MST)首先是一棵樹(shù),Algorithm)和克魯斯卡爾算法(Kruskal'sAlgorithm)。到添加所有節(jié)點(diǎn)為止。對(duì)于上面的光纜鋪設(shè)例子,以A原點(diǎn),首先添加與之相連且不成環(huán)的最短邊AC,然后按算法法則依次添加BC邊、BD邊,直到所有節(jié)點(diǎn)均已添加,算法結(jié)束,最小花費(fèi)為6(1+3+2)。普里姆算法的時(shí)間復(fù)雜度為O(V2),圖3-19所示。圖3- 普里姆算法的推進(jìn)步驟示意姆算法的基本思路是以點(diǎn)擴(kuò)展邊,那么克魯斯卡爾算法的基本思路是以邊擴(kuò)展點(diǎn),具體如下:每次從待選邊集中選出與當(dāng)前森林不成環(huán)且最短的邊加入森林,直到所有節(jié)點(diǎn)形成一棵樹(shù)為止。該思路決定了克魯斯卡爾算法只能從最短邊開(kāi)始構(gòu)建最小生成樹(shù)。對(duì)于光纜鋪設(shè)例圖3- 克魯斯卡爾算法的推進(jìn)步驟示意樹(shù)狀數(shù)組(BinaryIndexedTree)利用二進(jìn)制的計(jì)算特性,可以在時(shí)間復(fù)雜度為O(logN)的情況下動(dòng)態(tài)維護(hù)一個(gè)序列,并且計(jì)算其任意子序列中的所有元素之和,算法思路十分簡(jiǎn)潔、巧妙。下面從二進(jìn)制的特性開(kāi)始,逐步講解樹(shù)狀數(shù)組的實(shí)現(xiàn)思路。0110→1000→10000、0111→1000→10000。觀察這4發(fā)現(xiàn)什么規(guī)律?沒(méi)錯(cuò),這種運(yùn)算總能將原數(shù)變?yōu)楸人蟮?、最接近的次冪。假設(shè)有8個(gè)位置,編號(hào)分別為1~8,圖3-21所示,灰色代表原數(shù)組,黑色代表樹(shù)狀數(shù)組。圖3- 樹(shù)狀數(shù)組結(jié)構(gòu)示黑色單元從左至右的相連關(guān)系就是上面描述的“加1(B1→B2→B4→B8,B3→B4→B8,B5→B6→B8,B7→B8)。有“加1換”自然就有“減1變換”?!皽p1變換”能以O(shè)(logN)到任意元素的核心子元素,這樣維護(hù)和計(jì)算任意子序列中所有元素的和就很方便了。例如,對(duì)于圖3-21中的B7,通過(guò)“減1變換”得到序列(B7→B6→B4),正好可以計(jì)算A1~A7圖3- 樹(shù)狀數(shù)組求在樹(shù)狀數(shù)組構(gòu)建完成后,嘗試計(jì)算前7個(gè)數(shù)之和。我們通過(guò)“減1變換”在樹(shù)狀數(shù)組中依次遍歷到0111、0110、0100這3標(biāo)的元素值為8、6、18。因此前7個(gè)數(shù)之和為8+6+18=32。如果使用原數(shù)組,則需要進(jìn)行6次加法運(yùn)算;如果使用樹(shù)狀數(shù)組,則只需進(jìn)行2次加法運(yùn)算。隨著數(shù)列長(zhǎng)度的增加,樹(shù)狀數(shù)組的時(shí)間優(yōu)勢(shì)會(huì)更加明顯。此外,當(dāng)原數(shù)組中某個(gè)元素的值增加或減少d時(shí),同樣可以通過(guò)“加1變換”來(lái)更新樹(shù)狀數(shù)組中相應(yīng)的元素值。lowbit(x)=xand(xxor(x-lowbit(x)=xand-x簡(jiǎn)化后的最低位計(jì)算公式是常數(shù)級(jí)的計(jì)算。樹(shù)狀數(shù)組查詢和更新的時(shí)間復(fù)雜度為O(logN)此時(shí)間復(fù)雜度為O(NlogN)。線段樹(shù)(SegmentTree)的概念和它的名字一樣,是以線段(通問(wèn)題的時(shí)間復(fù)雜度降至O(logN)。例如,有一個(gè)長(zhǎng)度為6的序列[3,6,5,1,9],將其構(gòu)造成線段樹(shù),如圖3-23圖3- 線段樹(shù)結(jié)構(gòu)示上面只說(shuō)了線段樹(shù)的基本特性,而延遲標(biāo)記是線段樹(shù)的精華所一段區(qū)間內(nèi)的值同時(shí)增加d十分復(fù)雜,時(shí)間復(fù)雜度為O(N);而使用線段樹(shù)對(duì)其進(jìn)行更新的時(shí)間復(fù)雜度為O(logN),初始值均為0。例如,將[0,2]區(qū)間內(nèi)的數(shù)均增加4,從根節(jié)點(diǎn)開(kāi)始匹配,發(fā)現(xiàn)根節(jié)點(diǎn)區(qū)間[0,5]包含區(qū)間[0,2],向子節(jié)點(diǎn)繼續(xù)查詢,發(fā)現(xiàn)左節(jié)點(diǎn)區(qū)間為[0,2],將其延遲標(biāo)記值增加4,并且將左節(jié)點(diǎn)的值加4,變?yōu)?0。由于左節(jié)點(diǎn)區(qū)間為[0,2],因此不再向下查詢,開(kāi)始回溯,將根圖3- 線段樹(shù)的更在圖3-24中,三角形內(nèi)的數(shù)字代表每個(gè)節(jié)點(diǎn)的延遲標(biāo)記值。之后的每次最大值查詢,如果當(dāng)前節(jié)點(diǎn)的延遲標(biāo)記值大于0,詢時(shí)會(huì)帶走延遲標(biāo)記,重復(fù)上述延遲操作,直到完全匹配。這種延遲查詢的方式大大提高了序列更新與查詢的效率。接前文,可知當(dāng)前延遲標(biāo)記在[0,2]區(qū)間內(nèi)的節(jié)點(diǎn)上,在查詢[0,1]區(qū)間內(nèi)的最大值時(shí),帶上延遲標(biāo)記從[0,2]區(qū)間內(nèi)的節(jié)點(diǎn)向左子樹(shù)走,更新的是[0,1]區(qū)間內(nèi)節(jié)點(diǎn)的值,即得到查詢結(jié)果。更新后的線段樹(shù)如圖3-25所示。圖3- 更新后的線段在更新后,[0,1]區(qū)間內(nèi)的最大值為7要帶走延遲標(biāo)記,那么為了保持左、右孩子節(jié)點(diǎn)的正確性,至少需要往每個(gè)孩子節(jié)點(diǎn)上帶一次延遲標(biāo)記,在圖3-25中,[0,1]區(qū)間雖然在左子樹(shù)上,但延遲標(biāo)記同樣需要往右子樹(shù)帶過(guò)去。平衡二叉樹(shù)(BalancedBinaryTree)是由G.M.Adelson-Velsky索樹(shù)(BinarySearchTree),所以在講解平衡二叉樹(shù)之前,不妨先二叉搜索樹(shù)是能夠表達(dá)一定元素順序的二叉樹(shù)。由于從樹(shù)根往下能進(jìn)行二分查找,因此二叉搜索樹(shù)通常能在O(logN)找某些節(jié)點(diǎn)的元素值。但是,不加條件的二叉搜索樹(shù)往往容易退化成鏈表,使時(shí)間復(fù)雜度變成O(N)。平衡二叉樹(shù)的全稱為平衡二叉搜索樹(shù),主要用于解決左、右子樹(shù)高度平衡問(wèn)題。為了解決二叉搜索樹(shù)退化成鏈的問(wèn)題,平衡二叉樹(shù)可以保證任意節(jié)點(diǎn)的左、右子樹(shù)高度差不大于1系的情況下,普通的二叉搜索樹(shù)與平衡二叉樹(shù)之間的區(qū)別如圖3-26所示。圖3- 二叉搜索樹(shù)與平衡二叉樹(shù)之間的區(qū)呢?我們可以先想想左、右子樹(shù)高度差大于1圖3- 左、右子樹(shù)高度差大于1的4種情根據(jù)圖3-27可知,通過(guò)鏡面變換,圖3-27(a)和圖3-27(d)可以歸為一類,圖3-27(b)和圖3-27(c)可以歸為一類。為了將左、右子樹(shù)高度差大于1種旋轉(zhuǎn)操作實(shí)現(xiàn)。單旋。對(duì)于圖3-27(a),將B提到樹(shù)根,A變成B點(diǎn),E變成A的左孩子節(jié)點(diǎn),即可將該二叉搜索樹(shù)轉(zhuǎn)換為平衡二叉樹(shù),具體變換操作如圖3-28所示。同理可單旋圖3-27(d)。圖3-27(a)和圖3-27(d)和右旋。圖3- 單圖3- 雙任意一棵二叉搜索樹(shù),從葉子節(jié)點(diǎn)開(kāi)始,通過(guò)單旋或雙旋一直變換到根節(jié)點(diǎn),可以保證任意節(jié)點(diǎn)的左、右子樹(shù)高度差不大于1叉樹(shù)的建樹(shù)變換時(shí)間復(fù)雜度為O(NlogN)。此外,平衡二叉樹(shù)還有紅黑樹(shù)、SBT、Treap、伸展樹(shù)等幾個(gè)變種,感興趣的讀者可以深入學(xué)習(xí)。并查集(DisjointSet)并非常用的基礎(chǔ)算法,卻也是一種很有問(wèn)題描述:有N個(gè)人,約定存在血緣關(guān)系的為親人,并且如果X和是親人、Y和Z是親人,則X和Z也是親人?,F(xiàn)給出M證這N個(gè)人都已涵蓋在內(nèi)。計(jì)算這N個(gè)人中一共有多少個(gè)家族,以及需要詢問(wèn)多少次任意兩人是否屬于同一個(gè)家族(詢問(wèn)次數(shù)用T表示)。根據(jù)題目描述,不難想到暴力枚舉法,即每次將有血緣關(guān)系的兩個(gè)人所屬的家族集合編號(hào)賦值為同一個(gè)值??上攵?,當(dāng)N、M、T時(shí),算法時(shí)間復(fù)雜度不可估量。此時(shí),并查集橫空出世。如,有5組血緣關(guān)系,分別為(a,b)(b,c)(d,e)(d,f)(d,b),在圖3-30中,字母后面的數(shù)字代表家族編號(hào)。首先,(a,b)表示和b有血緣關(guān)系,將b所在的樹(shù)根指向a樹(shù);然后依次按照此規(guī)則更新(b,c)(d,e)(d,f)(d,b)這4組血緣關(guān)系。值得注意的是,在處理血緣關(guān)系(d,b)時(shí),由于b族樹(shù)的根節(jié)點(diǎn),因此需要先找到根節(jié)點(diǎn)a,再將a指向d止樹(shù)退化成鏈表,通常將深度較小的樹(shù)的指針指向深度較大的樹(shù)的根節(jié)點(diǎn),因此需要將圖3-30(f)衡結(jié)構(gòu),如圖3-31所示。圖3- 并查集的構(gòu)建步圖3- 并查集的平衡結(jié)不難發(fā)現(xiàn),即使按照上面所講的平衡結(jié)構(gòu)構(gòu)建并查集,也會(huì)面臨兩個(gè)問(wèn)題:其一,要合并的兩棵樹(shù),如果當(dāng)前節(jié)點(diǎn)距離各自根節(jié)點(diǎn)的距離并非最長(zhǎng)距離,則會(huì)直接導(dǎo)致平衡結(jié)構(gòu)構(gòu)建失??;其二,即使構(gòu)建了平衡結(jié)構(gòu),本身過(guò)長(zhǎng)的分支也仍然存在。平衡結(jié)構(gòu)只是并查集的一種簡(jiǎn)單優(yōu)化,并查集最有效的優(yōu)化方法為路徑壓縮化思想如下:在每次找樹(shù)根時(shí),將經(jīng)過(guò)的所有節(jié)點(diǎn)都指向根節(jié)點(diǎn),將較長(zhǎng)的路徑變成多子樹(shù)。使用路徑壓縮方法優(yōu)化并查集的時(shí)間復(fù)雜度為O(MlogN),而每次查詢的時(shí)間復(fù)雜度為O(C),是常數(shù)級(jí)別。使用路徑壓縮方法進(jìn)行優(yōu)化的并查集構(gòu)建步驟如圖3-32所示,其中路徑壓縮在第(c)步體現(xiàn)。圖3- 并查集的路徑壓縮構(gòu)建步匈牙利算法主要用于求解二分圖的最大匹配問(wèn)題。二分圖又稱為二部圖,是一種特殊的圖。假設(shè)G=(V,E)是一個(gè)無(wú)向圖,如果頂點(diǎn)集可以分割為兩個(gè)互不相交的子集(A,B),并且圖中的每條邊(i,j)所關(guān)聯(lián)的兩個(gè)頂點(diǎn)i和j分別屬于這兩個(gè)不同的頂點(diǎn)集(iinA,jinB),則稱圖G相連但不相交的邊數(shù)最多。問(wèn)題描述:現(xiàn)在有一個(gè)8人的小型化裝舞會(huì),一共有4男4生分別標(biāo)記為A、B、C、D,將女生分別標(biāo)記為a、b、c、d?,F(xiàn)在化裝舞會(huì)需要男女配對(duì)組成4知A與a、b、c相識(shí),B與a、d相識(shí),C與c、d相識(shí),D只與b相識(shí),熟人關(guān)系如圖3-33所示。為了讓大家都能與一個(gè)熟人作舞伴,要如何給這個(gè)人配對(duì)?圖3- 二分圖中的熟人關(guān)針對(duì)上述例子,匈牙利算法的執(zhí)行步驟如圖3-34圖3- 匈牙利算法的執(zhí)行步按ABCD的順序進(jìn)行匹配,先匹配A和B。加粗虛線表示當(dāng)前找到的增廣路,加粗實(shí)線表示當(dāng)前的配對(duì)。首先,圖3-34(a)找到增廣路A→a,圖3-34(b)將增廣路中的A和a配對(duì);然后,圖3-34(c)找到增廣路B→a→A→b,圖3-34(d)將增廣路中的A和aB和a、A和b分別配對(duì)。這里可以看出,由于二分圖的性質(zhì),增廣路中每隔一條邊匹配一條邊,總能保證配對(duì)最大。接著配C和D。圖3-34(e)找到增廣路C→c,圖3-34(f)將增廣路中的C和c配對(duì),圖3-34(g)找到增廣路D→b→A→a→B→d,圖3-34(h)將增廣路中的Ba、A和b解除配對(duì),然后將D和b、A和a、B和d無(wú)增廣路,匈牙利算法結(jié)束??芍诿看尾檎以鰪V路時(shí),在最差情況下會(huì)遍歷所有邊。因此匈牙利算法的時(shí)間復(fù)雜度為O(NM),其中N表示二分圖半邊的點(diǎn)數(shù),M表示二分圖的總邊數(shù)。在線評(píng)測(cè)系統(tǒng)(OnlineJudge,OJ)是一種在編程競(jìng)賽中評(píng)測(cè)參表3-2OJ根據(jù)題目類型,可以將題目分為6類,分別為SystemDesign、OODesign、OperatingSystem、Algorithms、Database和Shell;目難易程度,可以分為3類,分別為Easy、Medium和Hard個(gè)總的提交通過(guò)率,并且提供解題思路留言討論區(qū)。題庫(kù)還會(huì)提供若干個(gè)專題標(biāo)簽,用于給刷題者提供有針對(duì)性的索引。例如,算法類別專題標(biāo)簽有數(shù)組相關(guān)、圖相關(guān)、動(dòng)態(tài)規(guī)劃相關(guān);公司面試劃分專題標(biāo)簽有谷歌公司面試最熱100題、Facebook公司面試最熱100題等。POJ與POJ(PekingUniversityOnlineJudge,系統(tǒng))是一個(gè)提供編程題目的網(wǎng)站,它包含3000多道程序設(shè)計(jì)題,題目大部分來(lái)自ACM多題目可以反映工作和生活中的實(shí)際問(wèn)題。ZOJ(ZhejiangUniversityOnlineJudge,測(cè)系統(tǒng))是一個(gè)提供信息學(xué)(算法競(jìng)賽)題庫(kù)及進(jìn)行在線程序評(píng)測(cè)的網(wǎng)站,它也包含3000多道程序設(shè)計(jì)題,題目大部分來(lái)自ACM程序設(shè)計(jì)競(jìng)賽、全球各大賽區(qū)及著名大學(xué)的競(jìng)賽。很多人或許沒(méi)有聽(tīng)說(shuō)過(guò)Tsinsen其背后的開(kāi)發(fā)者有所耳聞,那就是兩屆IOI科學(xué)實(shí)驗(yàn)班畢業(yè)的胡偉棟。清橙網(wǎng)絡(luò)自動(dòng)評(píng)測(cè)系統(tǒng)和胡偉棟,對(duì)筆者而言并不陌生,因?yàn)楣P者和胡偉棟曾就讀于同一所高中,而且筆者也算是清橙的首批用戶。筆者記得在剛上高一時(shí),參加了學(xué)校的信息學(xué)競(jìng)賽興趣小組。那時(shí)我們不像現(xiàn)在有五花八門(mén)的OJ用于學(xué)習(xí)編程,尤其對(duì)于DIY動(dòng)評(píng)測(cè)甚是麻煩。清橙網(wǎng)絡(luò)自動(dòng)評(píng)測(cè)系統(tǒng)就是那時(shí)由胡偉棟開(kāi)發(fā)的一個(gè)自動(dòng)評(píng)測(cè)系統(tǒng),專門(mén)用于模擬競(jìng)賽評(píng)測(cè)。該系統(tǒng)后來(lái)升級(jí),搬到了網(wǎng)上,也就是現(xiàn)在的清橙網(wǎng)絡(luò)自動(dòng)評(píng)測(cè)系統(tǒng)。比較遺憾的是,清橙網(wǎng)絡(luò)自動(dòng)評(píng)測(cè)系統(tǒng)于2019年9月1日不再對(duì)外提供服務(wù)。背包問(wèn)題有很多變種與升級(jí)版本,本書(shū)講解的是01也是最基礎(chǔ)的背包問(wèn)題。如果同一種物品可以無(wú)限裝包,這樣的背包問(wèn)題稱為完全背包問(wèn)題。那么,動(dòng)態(tài)規(guī)劃如何解決完全背包問(wèn)題?導(dǎo)彈攔截問(wèn)題,每次的導(dǎo)彈攔截高度都不能高于前一次,現(xiàn)在連續(xù)有N枚導(dǎo)彈襲擊,高度分別為Hi(i為1~N的整數(shù)),少枚導(dǎo)彈?寫(xiě)出動(dòng)態(tài)轉(zhuǎn)移方程即可。POJ與第4算法之武功所有機(jī)器學(xué)習(xí)算法都是基于樣本學(xué)習(xí)的。有標(biāo)簽的樣本,相當(dāng)于一個(gè)有經(jīng)驗(yàn)的師父提前告訴你學(xué)習(xí)的目標(biāo)是什么,以此監(jiān)督你的學(xué)習(xí)過(guò)程,這個(gè)標(biāo)簽稱為監(jiān)督信號(hào)。帶監(jiān)督信號(hào)的機(jī)器學(xué)習(xí)稱為監(jiān)督學(xué)習(xí)(SupervisedLearning),反之稱為無(wú)監(jiān)督學(xué)習(xí)(Unsupervised習(xí)(Semi-SupervisedLearning)。顧名思義,半監(jiān)督學(xué)習(xí)就是所用常見(jiàn)的監(jiān)督學(xué)習(xí)算法有線性回歸(LinearRegression)、邏輯回歸(LogisticRegression)、K-近鄰(K-NearestNeighbor,KNN算法)、決策樹(shù)(DecisionTree)、樸素貝葉斯(NaiveBayes)、神經(jīng)網(wǎng)絡(luò)(NeuralNetwork),還有用于降維的算法——線性判別分析(LinearDiscriminantAnalysis,LDA)法,其共同點(diǎn)都是教什么就學(xué)什么。即通過(guò)學(xué)習(xí),使模型輸出結(jié)果與指定樣本標(biāo)簽值盡可能地接近。與監(jiān)督學(xué)習(xí)相比,無(wú)監(jiān)督學(xué)習(xí)沒(méi)有監(jiān)督信號(hào),它利用未知標(biāo)簽的樣本調(diào)整模型參數(shù),學(xué)習(xí)某種特征、規(guī)律、趨勢(shì)或既定模式,從而達(dá)到所需性能要求的過(guò)程。放眼望,人類從原始社會(huì)一路走來(lái),文明的進(jìn)步何嘗不是處處伴隨著無(wú)監(jiān)督學(xué)習(xí)?還以動(dòng)物卡片為例,人類最開(kāi)始并不知道猴子叫猴子、獅子叫獅子,只知道某類動(dòng)物具有相同或類似的外貌特征。例如,某類動(dòng)物經(jīng)常用手撓頭、活潑好動(dòng),喜歡在樹(shù)上竄來(lái)竄去;某類動(dòng)物體格健壯,頸部覆蓋著厚厚的鬃毛,食肉。久而久之,同類型具有相同行為規(guī)律與外貌特征的動(dòng)物,隨著時(shí)間的推移逐漸被稱為猴子和獅子。這便是無(wú)監(jiān)督學(xué)習(xí)的過(guò)程,這種將動(dòng)物歸類的方法,其實(shí)就是無(wú)監(jiān)督學(xué)習(xí)中的典型算法——聚類。圖4-1為一個(gè)無(wú)監(jiān)督學(xué)習(xí)示例。圖4- 無(wú)監(jiān)督學(xué)習(xí)示常見(jiàn)的無(wú)監(jiān)督學(xué)習(xí)算法除了聚類(Clustering),──主成分分析(PrincipalComponentAnalysis,PCA)。聚類可以如果以上3學(xué)習(xí)性能起改善作用,反而會(huì)損壞學(xué)習(xí)性能,導(dǎo)致半監(jiān)督學(xué)習(xí)失效。但是,還有一些實(shí)驗(yàn)表明,在一些特殊情況下,即使前提假設(shè)成立,無(wú)標(biāo)簽樣本也有可能損壞模型的學(xué)習(xí)性能。因此,要開(kāi)展半監(jiān)督學(xué)Clustering)、生成對(duì)抗網(wǎng)絡(luò)(GenerativeAdversarialNets,GAN)、半監(jiān)督分類(Semi-supervisedClassification)及一些基于類別,用于答“是”或“不是”類問(wèn)題;銷量預(yù)測(cè)、股票預(yù)測(cè)的算法模型,目的是預(yù)估某類數(shù)值的大小,用于答“多少”類問(wèn)題。這樣,按照學(xué)習(xí)目標(biāo)劃分,可以將機(jī)器學(xué)習(xí)算法模型分成四大類。答(Classification),答“多少”類問(wèn)題的算法模型統(tǒng)稱為回(Regression)。除了分類和歸,另外兩類算法分別是聚(Clustering)和降維(DimensionalityReduction)分類和歸的直觀區(qū)分方法如下:模型的最終預(yù)測(cè)值如果是離散歸。有讀者或許已經(jīng)發(fā)現(xiàn),無(wú)論是分類還是歸,模型訓(xùn)練用的都是事實(shí)上,分類和歸已經(jīng)涵蓋了機(jī)器學(xué)習(xí)中的大部分熱門(mén)模型,如最近幾年特別流行的神經(jīng)網(wǎng)絡(luò)及其一系列變種(卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)等)。常規(guī)的聚類屬于無(wú)監(jiān)督學(xué)習(xí),當(dāng)然也存在半監(jiān)督聚類算法。降維主要有無(wú)監(jiān)督學(xué)習(xí)的主成分分析(PCA)的線性判別分析(LDA)算法等。線性歸模型與邏輯歸模在監(jiān)督學(xué)習(xí)模型中,線性歸模型和邏輯歸模型是最經(jīng)典的兩個(gè)模型,其中邏輯歸模型適用于大部分監(jiān)督學(xué)習(xí)問(wèn)題。不僅如此,學(xué)好線性歸模型和邏輯歸模型,對(duì)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)也大有幫助。線性歸模線性回歸模型是最簡(jiǎn)單、直觀的機(jī)器學(xué)習(xí)算法模型之一。線性是指特征值與輸出值之間是一次函數(shù)關(guān)系。例如,對(duì)于f(x)=ωx+b,其中x是特征值,f(x)表示輸出值。歸是指通過(guò)調(diào)整一次函數(shù)的參數(shù),使其盡可能準(zhǔn)確地?cái)M合數(shù)據(jù)的過(guò)程。我們不妨從最簡(jiǎn)單的單特征線性歸模型講起。所謂單特征,就是一個(gè)特征,假設(shè)預(yù)測(cè)目標(biāo)只與一個(gè)因素相關(guān)。例如,要預(yù)測(cè)北京市房?jī)r(jià),單特征是每套房子的建筑面積,我們的假設(shè)就是北京房?jī)r(jià)只與建筑面積有關(guān)。假設(shè)北京房?jī)r(jià)和建筑面積的關(guān)系如圖4-2橫坐標(biāo)和縱坐標(biāo)分別是建筑面積和每平方米價(jià)格。圖4- 建筑面積與房?jī)r(jià)關(guān)系線性歸模型的目標(biāo)是盡可能準(zhǔn)確地?cái)M合數(shù)據(jù),即在圖4-2中找到一條直線,使圖中各點(diǎn)盡可能地接近這條直線。單特征線性歸模型公式為f(x)=ax+b,x為建筑面積,f(x)為每平方米的價(jià)格,a和b是權(quán)重參數(shù),其中b稱為偏置(Bias),單特征下的a是一個(gè)標(biāo)量,多特征下的a是一個(gè)向量。那么,圖4-2中有這么多不同建筑面積的房?jī)r(jià),如何找到一條合適的直線來(lái)表示它們的關(guān)系變化?這就說(shuō)到機(jī)器學(xué)習(xí)中的模型訓(xùn)練方法了,目前最常用的模型訓(xùn)練方法為梯度下降法(GradientDescent)。下面講解梯度下降法具體是如何訓(xùn)練,從而歸模型擬合的直線經(jīng)過(guò)原點(diǎn),并且只考慮一個(gè)樣本數(shù)據(jù)點(diǎn)(1,4),那threshold=0.01(2.2,-0.18),(2.38,-0.162),(2.542,-0.1458),……直到loss0),因此訓(xùn)練得到的歸函數(shù)為f(x)=4x,訓(xùn)練迭代次數(shù)與loss之間圖4- 訓(xùn)練迭代次數(shù)與loss值之間的變化關(guān)當(dāng)然,房?jī)r(jià)不可能只與建筑面積這一個(gè)因素有關(guān)系,機(jī)器學(xué)習(xí)算法模型的特征空間通常也不會(huì)只有一個(gè)維度。因此,一般使用向量x示多特征值,使用向量ω表示多特征權(quán)重,使用標(biāo)量b歸模型的公式就可以表示為f(x)=ωx+b。偏置的作用是無(wú)論在幾維空間,歸函數(shù)都可以表示不經(jīng)過(guò)原點(diǎn)的圖像。通常將偏置也放到ωx中,具體做法是令特征向量x的每一維從下標(biāo)1開(kāi)始編號(hào),將偏置作為權(quán)重ω0與構(gòu)造的特征值x0=1一起合入ωx的乘積之中。這樣,線性歸模型公式就簡(jiǎn)化成了f(x)=ω0~nx0~n。邏輯歸模對(duì)于線性歸模型公式f(x)=ωx,其值域(取值范圍)是未知的,f(x)相當(dāng)于在計(jì)算ωx之后,直接用線性函數(shù)y=x活”輸出。線性歸模型之名由此得來(lái),y=x則被稱為線性激活函數(shù)。既然有線性激活函數(shù),自然就有非線性激活函數(shù),非線性激活函數(shù)可以將未知值域映射到一個(gè)已知的值域范圍內(nèi)。其中最有名的非線性激活函數(shù)之一為Sigmoid函數(shù)。將Sigmoid函數(shù)作為激活函數(shù)的歸模型稱為邏輯歸模型。Sigmoid函數(shù)的公式為Sigmoid函數(shù)的圖像如圖4-4圖4- Sigmoid函數(shù)的圖1)。將輸出值映射到(0,1)區(qū)間,目的是方便設(shè)定閾值完成二分類。無(wú)論特征維度的值是多少,邏輯歸模型都會(huì)利用閾值設(shè)定,在這個(gè)除了Sigmoid函數(shù),下面介紹另外3種常見(jiàn)的激活函數(shù),它們分別為Sgn函數(shù)、Tanh函數(shù)和ReLU函數(shù)。其中ReLU泛。圖4- Sgn函數(shù)的圖雙曲正切函數(shù)Tanh可以解決Sigmoid函數(shù)的輸出值恒大于0題。其值域?yàn)?-1,1),相當(dāng)于將Sigmoid函數(shù)沿著縱軸拉伸了一倍,Tanh函數(shù)的圖像如圖4-6圖4- Tanh函數(shù)的圖為[0,+∞),其函數(shù)圖像如圖4-7所示。圖4- ReLU函數(shù)的圖經(jīng)網(wǎng)絡(luò)(ArtificialNeuralNetwork,ANN)。與人腦神經(jīng)網(wǎng)絡(luò)類圖4- 人工神經(jīng)元的數(shù)學(xué)描對(duì)于人工神經(jīng)元構(gòu)成的單層模型,激活函數(shù)不同,相應(yīng)的名稱也不同。事實(shí)上,線性歸模型和邏輯歸模型都屬于人工神經(jīng)網(wǎng)絡(luò)的范疇。其中,使用線性激活函數(shù)f(x)=x的單層神經(jīng)網(wǎng)絡(luò)模型,就是節(jié)中的線性歸模型;使用非線性激活函數(shù)Sigmoid的單層神經(jīng)網(wǎng)絡(luò)模型,就是4.2節(jié)中的邏輯歸模型;使用階躍函數(shù)作為激活函數(shù)的單層神經(jīng)元模型,學(xué)術(shù)名稱為感知機(jī)(Perceptron)。下面通過(guò)一個(gè)簡(jiǎn)單的例子講解什么是單層神經(jīng)元模型。假設(shè)有一男一女兩個(gè)人,身高、體重分別是1.8m、70kg和1.6m、50kg,我們用這兩個(gè)樣本訓(xùn)練出一個(gè)能判斷性別的單層神經(jīng)元模型。使用Sigmoid在上述表達(dá)式中,x為特征輸入(身高x2,體重x1,偏置1),w要學(xué)習(xí)的特征權(quán)重。將兩人的特征數(shù)據(jù)(1.8,70,1)和(1.7,50,1)重復(fù)輸入模型中,用于學(xué)習(xí)參數(shù)向量w的值,學(xué)習(xí)方法采用前文講到的梯度下降法,直到f(x=(1.8,70,1))和f(x=(1.7,50,1))的值分別趨向0和1,訓(xùn)練結(jié)束。除此之外,人工神經(jīng)網(wǎng)絡(luò)衍生出了各式各樣的結(jié)構(gòu)變種,如深度神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)、遞歸神經(jīng)網(wǎng)絡(luò)和圖神經(jīng)網(wǎng)絡(luò)等,并且開(kāi)辟了形形色色的研究方向。顧名思義,深度神經(jīng)網(wǎng)絡(luò)(DeepNeuralNetwork,DNN)的神經(jīng)圖4- 常規(guī)的深度神經(jīng)網(wǎng)絡(luò)結(jié)所有機(jī)器學(xué)習(xí)算法的學(xué)習(xí)目標(biāo),都是尋找輸出與輸入之間最合適的映射關(guān)系。在圖4-9用線性函數(shù)y=x出都會(huì)是原始輸入經(jīng)過(guò)線性變換的結(jié)果,最終效果相當(dāng)于單層人工神經(jīng)元模型的效果。與線性變換相比,非線性變換能夠表達(dá)的信息要豐(ComputerVision,CV)領(lǐng)域的深度運(yùn)用,以及圖形處理(GraphicsProcessingUnit,GPU)樣,感知并識(shí)別這個(gè)五彩繽紛的圖像世界。例如,從1000萬(wàn)張圖片中識(shí)別出貓的GoogleBrain,以及擊敗人類圍棋世界冠軍的人工智能機(jī)器人AlphaGo,背后都用到了一種圖像識(shí)別技術(shù),即卷積神經(jīng)網(wǎng)絡(luò)(ConvolutionalNeuralNetwork,CNN)要理解卷積神經(jīng)網(wǎng)絡(luò),先理解什么是卷積。我們不妨將“卷積”一詞拆開(kāi)來(lái)理解,“卷”意為翻卷,可以理解為數(shù)學(xué)變換中的翻轉(zhuǎn)和平移的意思;“積”可以理解為積累、相加、翻倍的意思,因此“卷積”表示一種簡(jiǎn)單的數(shù)學(xué)操作。卷積操作通常被看作加權(quán)滑動(dòng)平均法的一種推廣。卷積神經(jīng)網(wǎng)絡(luò)就是運(yùn)用了卷積操作的一種神經(jīng)網(wǎng)絡(luò),運(yùn)用卷積操作的神經(jīng)網(wǎng)絡(luò)層稱為卷積層(ConvolutionalLayer)。卷積層由卷積核組成,卷積核的計(jì)算類似于人工神經(jīng)元中y=ωx+b只是輸入不限定是一維的xi,可以是二維圖像中的一個(gè)像素點(diǎn)xi,j,也可以是三維空間中一個(gè)物體在某一點(diǎn)的描述xi,j,k。每個(gè)卷積核通過(guò)學(xué)習(xí)不同的參數(shù),可以感受局部視野,并且提取不同的局部特征。假設(shè)有一張3×3的圖像,卷積核為2×2,卷積核內(nèi)初始權(quán)重均為1,那么卷積操作的計(jì)算方法如圖4-10所示。 左下:4×1+1×1+7×1+9×1=21右下:1×1+5×1+9×1+3×1=18卷積神經(jīng)網(wǎng)絡(luò)除了包含卷積層,還包含池化層(PoolingLayer)受視野范圍內(nèi)的最大值作為輸出,均值池化是指每次取感受視野范圍內(nèi)的平均值作為輸出。池化層一般放在卷積層的后面計(jì)算,用于減少深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練的參數(shù)數(shù)量,提高深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練速度和泛化能力。以最大池化為例,池化大小為2×2,圖4-10中圖像的池化操作計(jì)算方法如圖4-11所示。圖4- 池化操作的計(jì)算方法示在圖4-11左上1}=4左下9}=9右上5}=6右下3}=9當(dāng)然,卷積神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu)除了包括卷積層和池化層,還包括神經(jīng)網(wǎng)絡(luò)都有的組成部分,即輸入層、全連接層和輸出層。卷積神經(jīng)網(wǎng)絡(luò)在計(jì)算機(jī)視覺(jué)和圖像識(shí)別領(lǐng)域發(fā)揮著至關(guān)重要的作用,如著名的AlexNet網(wǎng)絡(luò)結(jié)構(gòu)(詳見(jiàn)第7章圖7-1)。AlexNet是2012年ImageNet競(jìng)賽冠軍獲得者Hinton和他的學(xué)生AlexKrizhevsky后,很多更深的卷積神經(jīng)網(wǎng)絡(luò)相繼被提出,如VGGNet和GoogLeNet。遞歸神經(jīng)網(wǎng)絡(luò)(RecursiveNeuralNetwork,RNN)經(jīng)網(wǎng)絡(luò)(RecurrentNeuralNetwork),它會(huì)將一個(gè)網(wǎng)絡(luò)結(jié)構(gòu)單元的輸出作為該網(wǎng)絡(luò)結(jié)構(gòu)單元在下一時(shí)刻的輸入,所有神經(jīng)網(wǎng)絡(luò)層之間的銜接與串聯(lián)都會(huì)在時(shí)間維度上展開(kāi)。一個(gè)典型的遞歸神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如圖4-12所示。圖4- 典型的遞歸神經(jīng)網(wǎng)絡(luò)結(jié)在圖4-12遞歸神經(jīng)網(wǎng)絡(luò)模型,叫作長(zhǎng)短時(shí)記憶(Long-ShortTermMemory,圖4- 長(zhǎng)短時(shí)記憶模型的網(wǎng)絡(luò)結(jié)在圖4-13中,大長(zhǎng)方形框住的整體稱為記憶單元,實(shí)線箭頭表示當(dāng)前時(shí)刻的信息傳遞,虛線箭頭表示上一時(shí)刻的信息傳遞。與典型的遞歸神經(jīng)網(wǎng)絡(luò)模型相比,長(zhǎng)短時(shí)記憶模型一共增加了3這3個(gè)神經(jīng)網(wǎng)絡(luò)層在學(xué)術(shù)上分別稱為輸入門(mén)(InputGate)、遺忘門(mén)(ForgetGate)和輸出門(mén)(OutputGate)Cell(GatedRecurrentUnit,GRU)力(Attention)音識(shí)別、圖像識(shí)別、疾病預(yù)測(cè)等領(lǐng)域都發(fā)揮著驚人的作用,是當(dāng)下最流行的神經(jīng)網(wǎng)絡(luò)模型之一。圖神經(jīng)網(wǎng)絡(luò)(GraphNeuralNetwork,GNN)的神經(jīng)網(wǎng)絡(luò)。在講解圖神經(jīng)網(wǎng)絡(luò)之前,我們先顧一下什么是圖。根據(jù)第3章內(nèi)容可知,圖由頂點(diǎn)和邊兩部分組成。邊可以分為有向邊與無(wú)向邊,包含有向邊的圖稱為有向圖,不含有向邊的圖稱為無(wú)向圖。圖結(jié)構(gòu)在現(xiàn)實(shí)生活中是廣泛存在的,網(wǎng)站之間的超鏈接引用關(guān)系、社交網(wǎng)絡(luò)中的朋友關(guān)系、學(xué)術(shù)界論文之間的引用關(guān)系都可以用圖結(jié)構(gòu)表圖4- 常規(guī)的圖神經(jīng)網(wǎng)絡(luò)結(jié)圖神經(jīng)網(wǎng)絡(luò)一般不直接用于進(jìn)行分類或歸,通常將其作為圖的一種表征學(xué)習(xí)融入其他模型的特征輸入中。圖的表征學(xué)習(xí)是指將圖中的各種信息映射成一個(gè)N維特征向量,這種映射關(guān)系在機(jī)器學(xué)習(xí)中稱為特征嵌入(FeatureEmbedding)。圖中各種信息的嵌入統(tǒng)稱為(GraphEmbedding)。圖嵌入最常見(jiàn)的用法有兩種,分別為(NodeEmbedding)和邊嵌入(EdgeEmbedding)。如果輸出信息是經(jīng)過(guò)各種嵌入后的特征向量可以和其他特征拼接使用,也可以直接輸入神經(jīng)網(wǎng)絡(luò)的全連接層,繼續(xù)加入模型進(jìn)行學(xué)習(xí)。除了點(diǎn)嵌入和邊嵌入,還有整圖嵌入(Whole-GraphEmbedding),分子結(jié)構(gòu)、蛋白質(zhì)結(jié)構(gòu)的分析探索中有較廣泛的應(yīng)用。無(wú)論是歸模型,還是神經(jīng)網(wǎng)絡(luò)模型,都要通過(guò)純數(shù)學(xué)變換和層難以直觀理解。尤其是深度神經(jīng)網(wǎng)絡(luò),即使最后的分類或歸效果可本節(jié)介紹機(jī)器學(xué)習(xí)算法中可解釋性最強(qiáng)的模型之一——(DecisionTree)。近幾年已經(jīng)有學(xué)者研究如何利用決策樹(shù)的性質(zhì)解決策樹(shù)是一種樹(shù)形分類和歸模型,每個(gè)非葉子節(jié)點(diǎn)都相當(dāng)于一個(gè)IF條件判斷語(yǔ)句,模型通過(guò)逐個(gè)判定特征所屬類別,對(duì)樣本逐步進(jìn)行分類。決策樹(shù)模型不僅可解釋性強(qiáng),解決問(wèn)題的角度也趨近于人類看待問(wèn)題和理解問(wèn)題的視角,比較簡(jiǎn)單、直觀。下面通過(guò)一個(gè)例子,初步講解決策樹(shù)的工作原理。有10條關(guān)于西瓜的樣本數(shù)據(jù),如表4-1示,我們要根據(jù)這些數(shù)據(jù)學(xué)習(xí)如何判斷一個(gè)西瓜是否為好瓜。表4-1西瓜樣本數(shù)據(jù)集圖4- 決策樹(shù)模型圖4- 決策樹(shù)模型得到分類效果較好的決策樹(shù)呢?這涉及信息論中的一個(gè)概念——增益(InformationDivergence)。說(shuō)到信息增益,不得不先介紹(Entropy)息量(p·log(1/p),0<p≤1)們也不會(huì)覺(jué)得有時(shí)候說(shuō)的話雖然多,卻沒(méi)什么信息量,而有的話卻能一語(yǔ)中的。信息增益作為設(shè)置決策樹(shù)特征考查順序的依據(jù),可以直觀理解為,在按照當(dāng)前設(shè)置的特征考查順序劃分?jǐn)?shù)據(jù)集后,如果可以最大程度減少數(shù)據(jù)的混亂程度,那么該特征考查順序是好的特征考查順序。-log1=ID3算法每次選擇最大信息增益的特征作為父節(jié)點(diǎn),向下擴(kuò)展決必然等于最大值1。顯然,這樣的決策樹(shù)泛化能力是最弱的。因此,C4.5算法應(yīng)運(yùn)而生,該算法使用信息增益率的概念(信息增益除以數(shù)據(jù)集中該特征的總信息量),大致思路如下:先選出信息增益高于平均水平的特征,再?gòu)闹羞x擇信息增益率高的特征,用于當(dāng)前分裂。此外,還有一種CART算法,使用基尼指數(shù)選擇特征,也能增強(qiáng)決策樹(shù)的泛化能力。在決策樹(shù)變復(fù)雜之后,由于判斷分支過(guò)多,因此訓(xùn)練集中的某部分樣本特征被當(dāng)作所有樣本的一般性質(zhì),就出現(xiàn)了過(guò)擬合(Overfitting)預(yù)剪枝和后剪枝兩種。梯度提升決策樹(shù)(GradientBoostingDecisionTree,GBDT)一個(gè)與梯度有關(guān)、對(duì)決策樹(shù)進(jìn)行提升的機(jī)器學(xué)習(xí)模型。梯度提升決策樹(shù)可以是分類樹(shù),也可以是歸樹(shù)。我們不妨從后往前依次分解DT、B、G這幾個(gè)定語(yǔ),逐步理解GBDT的精髓。DT(DecisionTree,決策樹(shù))。決策樹(shù)分為分類樹(shù)和歸樹(shù)兩種。歸樹(shù)與分類樹(shù)的原理機(jī)制相似,區(qū)別在于分類樹(shù)只在葉子節(jié)點(diǎn)返唯一分類,而歸樹(shù)的每個(gè)節(jié)點(diǎn)都能返一個(gè)歸值,通常為當(dāng)前節(jié)點(diǎn)內(nèi)所有樣本的平均值。G(Gradient,梯度)間的距離或差異。因此,在上述的串行建模過(guò)程中,除了第一棵決策樹(shù)使用原始樣本數(shù)據(jù)進(jìn)行訓(xùn)練外,之后的每一棵決策樹(shù)都使用前一棵決策樹(shù)的預(yù)測(cè)值(平均值)與實(shí)際值之差(負(fù)梯度,可以理解為殘差或增量)進(jìn)行建樹(shù)。這相當(dāng)于對(duì)分錯(cuò)的樣本有針對(duì)性地繼續(xù)分類,使樣本的總體殘差趨近于0目標(biāo)的殘差或增量進(jìn)行建模預(yù)測(cè),因此梯度提升決策樹(shù)模型需要將串行建樹(shù)過(guò)程中每一棵決策樹(shù)的輸出結(jié)果相加,才能得到最終的預(yù)測(cè)輸出結(jié)果。下面通過(guò)一個(gè)經(jīng)典例子“預(yù)測(cè)年齡”來(lái)講解梯度提升決策樹(shù)的具體工作過(guò)程。假設(shè)有4個(gè)樣本,其特征描述分別如下。樣本A,消費(fèi)較高、經(jīng)常被學(xué)弟問(wèn)問(wèn)題,27樣本B,消費(fèi)較高、經(jīng)常問(wèn)學(xué)長(zhǎng)問(wèn)題,23樣本C,消費(fèi)較低、經(jīng)常被學(xué)弟問(wèn)問(wèn)題,17樣本D,消費(fèi)較低、經(jīng)常問(wèn)學(xué)長(zhǎng)問(wèn)題,13梯度提升決策樹(shù)串行建模的過(guò)程如圖4-17圖4- 梯度提升決策樹(shù)串行建模的過(guò)梯度提升決策樹(shù)的核心思想概括如下:串行訓(xùn)練n(n>2)策樹(shù),其中第i(1<i≤n)棵決策樹(shù)學(xué)習(xí)第i-1棵決策樹(shù)的負(fù)梯度(理解為殘差或增量),將n棵決策樹(shù)的輸出結(jié)果累加作為最終輸出結(jié)果。隨機(jī)森林(RandomForests,RF)是指由多棵決策樹(shù)組成的決策樹(shù)森林。組成隨機(jī)森林的決策樹(shù)既可以是分類樹(shù),又可以是歸樹(shù)。與梯度提升決策樹(shù)模型相比,隨機(jī)森林模型的原理更直觀、簡(jiǎn)潔,性能也更強(qiáng)悍。隨機(jī)森林算法的核心思路有兩個(gè):采樣和完全分裂樣分為行采樣和列采樣,這里的行與列對(duì)應(yīng)的是樣本與特征兩個(gè)維對(duì)于列采樣,每一棵決策樹(shù)都從M個(gè)特征中隨機(jī)挑選m個(gè)特征作為節(jié)點(diǎn)分裂特征來(lái)計(jì)算。在一般情況下,m為M的算術(shù)平方根。列采樣分為兩種方式,一種是全局列采樣,即同一棵樹(shù)的建樹(shù)過(guò)程均采用同一批采樣的特征;另一種是局部列采樣,即每一次節(jié)點(diǎn)分裂均單獨(dú)隨機(jī)挑選m不會(huì)出現(xiàn)過(guò)擬合的問(wèn)題。如果是歸樹(shù),則計(jì)算所有結(jié)果的平均值。對(duì)于連續(xù)型特征的距離度量,最常用的是閔可夫斯基距(MinkowskiDistance),閔可夫斯基距離有兩個(gè)明顯的缺點(diǎn):一是特征之間的量綱(距離(MahalanobisDistance)、余弦相似度(CosineSimilarity)、皮爾遜相關(guān)系數(shù)(PearsonCorrelation對(duì)于離散型特征的距離度量,最直接的度量方法是0/1對(duì)應(yīng)位置的特征相同則為1,不同則為0,累加值的大小體現(xiàn)了樣本之間的相似程度?;?/1匹配法,還可以使用杰卡德相似系數(shù)(JaccardSimilarityCoefficient)進(jìn)一步計(jì)算樣本特征之間的距離。指定兩個(gè)集合A和B,將杰卡德相似系數(shù)定義為A與B交集中的元素?cái)?shù)量與并集中的元素?cái)?shù)量的比值,計(jì)算公式如下。杰卡德相似系數(shù)的值越大,說(shuō)明相似度越高,當(dāng)A和B都為空集時(shí),杰卡德相似系數(shù)為1DifferenceMetric,VDM)。值差分度量法的使用前提是樣本必須是隨機(jī)選擇k個(gè)樣本作為初始的k將樣本逐一劃分到與這k根據(jù)上述算法執(zhí)行流程可知,k深。因?yàn)轭悇e的中心點(diǎn)坐標(biāo)是根據(jù)樣本特征距離的平均值更新的,所以一旦出現(xiàn)離群較遠(yuǎn)的樣本數(shù)據(jù),中心位置就會(huì)受到很深的影響。基于這個(gè)問(wèn)題,k中心點(diǎn)(k-Medoids)算法和k中值(k-Medians)算法應(yīng)運(yùn)而生。k別下的數(shù)據(jù)點(diǎn),計(jì)算當(dāng)前類別下其他數(shù)據(jù)點(diǎn)到該點(diǎn)的距離之和,將距離之和最小的點(diǎn)定為新的類別中心點(diǎn)。也就是說(shuō),k中心點(diǎn)坐標(biāo)一定是一條具體的樣本數(shù)據(jù),而不是計(jì)算出來(lái)的特征距離平均值。與k中心點(diǎn)算法不同,k中值算法在每次更新類別中心點(diǎn)坐標(biāo)時(shí),都會(huì)將類別中心點(diǎn)更新成同類別下所有樣本數(shù)據(jù)的中位數(shù),直到每個(gè)類別的中位數(shù)不再發(fā)生改變。k中心點(diǎn)算法和k中值算法雖然都在一定程度上解決了噪聲和離群點(diǎn)問(wèn)題,但是由于在更新類別中心點(diǎn)坐標(biāo)時(shí)不再是簡(jiǎn)單地取平均值,因此算法的時(shí)間復(fù)雜度會(huì)隨之增加。此外,k特征數(shù)據(jù),就需要使用離散型特征的距離度量法進(jìn)行距離度量。這時(shí)會(huì)有個(gè)新的算法——k-Modes算法。k-Modes算法的距離度量法可以是交集中的元素?cái)?shù)量、杰卡德相似系數(shù)等。所謂層次,就是類似于樹(shù)結(jié)構(gòu)的展開(kāi)與溯,逐層合并或拆分樣本數(shù)據(jù)集。逐層合并是自底向上的聚類方法,稱為凝聚層次法使用凝聚層次法,那么開(kāi)始的每個(gè)樣本都是一個(gè)類,然后根據(jù)相似性度量法尋找同類樣本,自下而上逐層地形成較大的類別。逐層拆解是自頂向下的聚類方法,稱為分裂層次法開(kāi)始的所有樣本都屬于同一個(gè)大類,然后根據(jù)相似性度量法逐層拆分樣本,自上而下逐層形成較小的類別。SpatialClusteringofApplicationwithNoise)為比較有代表性核心點(diǎn)。在鄰域R范圍內(nèi)數(shù)量不小于N如果只采用核心點(diǎn)計(jì)算聚類,那么可以將DBSCAN算法看作k法的變種。因?yàn)榧尤肓诉吔琰c(diǎn)和噪聲點(diǎn)的計(jì)算,所以DBSCAN算法比一般的聚類算法更強(qiáng)大。DBSCAN算法的執(zhí)行流程如下。將鄰域R范圍內(nèi)的核心點(diǎn)連接成邊,從而形成連通圖G計(jì)算連通圖G中的連通分量GCCi,連,則稱p密度可達(dá)q;如果核心點(diǎn)p可以分別密度可達(dá)邊界點(diǎn)q和s,稱q和s密度相連。密度可達(dá)屬于密度相連,密度直達(dá)屬于密度可達(dá)。根據(jù)密度概念我們發(fā)現(xiàn),每個(gè)類中的任意兩點(diǎn)之間都是密度相連的。圖4- 密度概念區(qū)顧名思義,高斯混合模型(GaussianMixtureModels,GMM)由隨機(jī)生成k個(gè)高斯分布作為初始的k單特征的高斯混合模型聚類算法的執(zhí)行流程圖例如圖4-19圖4- 單特征的高斯混合模型聚類算法的執(zhí)行流程圖如果樣本數(shù)據(jù)集是多維情況,則需要計(jì)算協(xié)方差,將不同維度之間的關(guān)聯(lián)性考慮進(jìn)來(lái)。高斯混合模型聚類和k別個(gè)數(shù)的初始值影響較大。不過(guò)高斯混合模型聚類完的樣本可以同時(shí)屬于多個(gè)類別,這種聚類又稱為軟聚類。其他的模型聚類算法還有基于PageRank的軟聚類算法、基于神經(jīng)網(wǎng)絡(luò)模型的自組織映射(Self-OrganizingMaps,SOM)聚類算法等。托馬斯·貝葉斯(ThomasBayes,1702—1761)是18世紀(jì)英國(guó)的圖4- 加法公式示意P(B|A)表示在事件A發(fā)生的前提下,事件B發(fā)生的概率,即事件B條件概率。直觀理解,乘法公式的意思是事件A和B同時(shí)發(fā)生的概率,與事件A發(fā)生的概率和事件B的條件概率之積相等,并且與事件B概率和事件A的條件概率之積相等。因此乘法公式又稱為條件概率公式,其示意圖如圖4-21圖4- 乘法公式示意其中D是樣本數(shù)據(jù)集,P(h)h的初始概率,即前面提到的先驗(yàn)概率,先驗(yàn)概率反映了關(guān)于目標(biāo)h的所有前提認(rèn)知。而在機(jī)器學(xué)習(xí)中我們通常更關(guān)心后驗(yàn)概率P(h|D),即樣本訓(xùn)練集D中目標(biāo)h成立的條件概率。在全概率公式中,Bi表示兩兩不相同的時(shí)間段,P(A|Bi)表示在Bi時(shí)間段內(nèi)事件A發(fā)生的概率,由于Bi兩兩不相容,因此事件A式P(A)可以看作加法公式。在機(jī)器學(xué)習(xí)中,如何利用上面講到的兩個(gè)概率和4呢?這便是樸素貝葉斯分類要做的事情。貝葉斯分類是指根據(jù)已分類樣本的先驗(yàn)概率,估計(jì)待分類樣本的后驗(yàn)概率。使用貝葉斯公式表示分類目標(biāo)函數(shù)如下(其中c為類別,x為樣本):但是,在樣本具備多個(gè)特征的情況下,很難根據(jù)訓(xùn)練樣本得到上式中條件概率P(x|c)的概率分布。針對(duì)這個(gè)問(wèn)題,樸素貝葉斯分類應(yīng)運(yùn)而生。樸素貝葉斯分類避開(kāi)了這個(gè)難題,對(duì)條件概率P(x|c)的概率分布做了條件獨(dú)立的假設(shè),即不同特征之間兩兩不相關(guān)。既然滿足條件獨(dú)立,就可以采用乘法公式計(jì)算P(x|c)的概率分布,公式如下(d特征總數(shù)):其中,P(c)可以直接統(tǒng)計(jì)訓(xùn)練樣本中各個(gè)類別的比例。對(duì)于條件概率P(xi|c),如果x是離散型特征,則可以通過(guò)計(jì)算在c類別中第i性取值為xi的比例。如果x是連續(xù)型特征,則需要先假設(shè)特征符合某種分布規(guī)律,如常見(jiàn)的二項(xiàng)分布、高斯分布、泊松分布、伯努利分布需要注意的是,在計(jì)算條件概率的過(guò)程中,有可能出現(xiàn)概率為0的情況,從而導(dǎo)致連乘之后的值為0。這里需要引入拉普拉斯平滑系數(shù)簡(jiǎn)單理解就是分子、分母同時(shí)加上一個(gè)常數(shù),用于避免概率為0的情況發(fā)生。可以證明,當(dāng)訓(xùn)練集足夠大時(shí),加入拉普拉斯平滑系數(shù)的估計(jì)值會(huì)趨近真實(shí)的概率。支持向量機(jī)(SupportVectorMachine,SVM)的分類模型。與邏輯歸模型、神經(jīng)網(wǎng)絡(luò)模型相比,支持向量機(jī)有更強(qiáng)的數(shù)學(xué)理論背景。因此與其他分類模型相比,支持向量機(jī)的學(xué)習(xí)門(mén)檻相對(duì)較高。在4.2子中,我們給每個(gè)樣本增加一個(gè)“是否成交”標(biāo)簽。在構(gòu)建樣本數(shù)據(jù)點(diǎn)后,使用線性歸模型得到的分類結(jié)果如圖4-22所示,其中房?jī)r(jià)和圖4- 線性回歸模型的分類結(jié)顯而易見(jiàn),線性歸能將“已成交”和“未成交”的樣本數(shù)據(jù)劃在形式上,支持向量機(jī)的模型公式和線性歸模型公式一樣,也在圖4-23圖4- 支持向量機(jī)的分類結(jié)大家不妨先憶一下點(diǎn)到直線的距離公式。直線方程為Ax+By+C=0,點(diǎn)的坐標(biāo)為(x0,y0),點(diǎn)到直線的距離公式如下:根據(jù)該公式可知,如果要最大化這個(gè)距離,則需要最小化權(quán)重向量w的L2范數(shù)。樸素的支持向量機(jī)和加了L2的線性歸模型幾乎一模一樣,所有我們可以像訓(xùn)練線性歸模型一樣訓(xùn)練支持向量機(jī)。此外,使用拉格朗日乘數(shù)法(LagrangeMultiplierMethod)和KKT條件(Karush-Kuhn-TuckerConditions)有助于更優(yōu)雅地解決支持向量機(jī)邏輯歸和線性歸相比,非線性映射函數(shù)Sigmoid的優(yōu)勢(shì)體圖4- 深度神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)示ReLU圖4- 卷積神經(jīng)網(wǎng)絡(luò)某一層的圖嘗試推導(dǎo)出4.3.4嘗試推導(dǎo)出4.3.4解了最常見(jiàn)的幾種機(jī)器學(xué)習(xí)算法,包括線性歸、邏輯歸、人工神關(guān)鍵詞線性歸邏輯歸線性歸邏輯歸k第5算法工程的本章會(huì)從原始數(shù)據(jù)的預(yù)處理開(kāi)始,到算法模型驗(yàn)收為止,逐步講解算法工程的完整流程。這個(gè)流程主要包括5特征工程、建模與調(diào)參、效果評(píng)估和模型托管。數(shù)量除以batchsize,再乘每批次訓(xùn)練花費(fèi)的時(shí)間,就能估算出一個(gè)一份擁有512條數(shù)據(jù)、特征維度為1000的數(shù)據(jù)集,假設(shè)batch為128,一個(gè)epoch包含4個(gè)batch,epoch和batch之間的關(guān)系如圖5-1示。圖5- epoch和batch之間的關(guān)少,如只有1程,因?yàn)獒槍?duì)極端比例下的類別樣本數(shù)據(jù)集,無(wú)論是模型訓(xùn)練,還是模型評(píng)估,都會(huì)完全失效。事先統(tǒng)計(jì)各類別樣本的數(shù)量,能提前發(fā)現(xiàn)樣本不均衡的問(wèn)題,尤其在類別樣本比例差別較大時(shí),一方面能幫助劃分訓(xùn)練集、驗(yàn)證集和測(cè)試集的大小,另一方面可以對(duì)樣本進(jìn)行重采樣或降低采樣比例。樣本不均衡問(wèn)題會(huì)在5.2.3一步講解。圖5- 動(dòng)物分類數(shù)據(jù)集中不同動(dòng)物類別的數(shù)量統(tǒng)計(jì)結(jié)型,都不可能得到百分之百精確的結(jié)果。訓(xùn)練再好的歸模型,也不可能將預(yù)測(cè)值與真實(shí)值之間的預(yù)測(cè)誤差降為0;類模型,也不可能保證每次的分類結(jié)果一定是正確的。在機(jī)器學(xué)習(xí)算法工程中,我們的工作是盡可能地逼近目標(biāo)和真相。除了繼續(xù)調(diào)參優(yōu)化模型,在數(shù)據(jù)層面,一方面,可以通過(guò)?觀把握數(shù)據(jù)提前發(fā)現(xiàn)問(wèn)第一,抽樣觀察用戶個(gè)體維度的行為數(shù)據(jù),換位思考,設(shè)身處地觀察具體的用戶行為序列,可以幫助我們更好地理解業(yè)務(wù)。行為數(shù)據(jù)是指用戶在時(shí)間維度上的連續(xù)動(dòng)作,如頁(yè)面曝光、鍵盤(pán)輸入、頁(yè)面點(diǎn)擊、鼠標(biāo)滑動(dòng)、觸屏等行為。圖5-3為序列。筆者自從事電商行業(yè)相關(guān)算法工作以來(lái),多次發(fā)現(xiàn)靠直覺(jué)得來(lái)的關(guān)于用戶行為的觀點(diǎn),與用戶的實(shí)際行為表現(xiàn)并不相符。例如,直覺(jué)上認(rèn)為用戶應(yīng)該先單擊商品A,然后單擊商品B,由于運(yùn)營(yíng)規(guī)則、前端規(guī)則或用戶偏見(jiàn)等原因,用戶的實(shí)際行為表現(xiàn)可能會(huì)恰恰相反。圖5- 用戶網(wǎng)上購(gòu)物行為序列示我們直接使用人工標(biāo)記的作弊訂單作為樣本標(biāo)簽,基于邏輯歸訓(xùn)練訂單,然后在驗(yàn)證階段通過(guò)電話逐一訪,發(fā)現(xiàn)大部分用戶填寫(xiě)的手舉例三,用戶行為。維度是標(biāo)識(shí)用戶的唯一編號(hào)。根據(jù)用戶的唯一編號(hào),可以關(guān)聯(lián)該用戶在某個(gè)時(shí)間段內(nèi)的所有行為數(shù)據(jù),然后按照時(shí)間的發(fā)展順序排列,從而完整復(fù)現(xiàn)該用戶在平臺(tái)上產(chǎn)生的一連串動(dòng)作序列。例如,在電商購(gòu)物場(chǎng)景中,使用用戶的賬戶編號(hào)追溯一次完等行為。圖形是最直觀的統(tǒng)計(jì)結(jié)果展示方式。常用的圖形有折線圖、散點(diǎn)圖、柱形圖和餅圖。其中折線圖主要用于看趨勢(shì),散點(diǎn)圖主要用于看分布,柱形圖主要用于看高低,餅圖主要用于看占比。(FeatureEngineering)征數(shù)據(jù)的處理和加工,都屬于特征工程的范疇。一方面,大部分機(jī)器學(xué)習(xí)算法對(duì)非結(jié)構(gòu)化特征數(shù)據(jù)束手無(wú)策,因此必須通過(guò)數(shù)據(jù)預(yù)處理將某些原始數(shù)據(jù)格式轉(zhuǎn)換成模型可接受的讀取格式;另一方面,機(jī)器學(xué)習(xí)算法雖然具備一定的數(shù)據(jù)抽象學(xué)習(xí)能力,但是特征可能有千萬(wàn)種,如何從中選擇特征、融合特征,甚至創(chuàng)造特征,從而提高算法模型的學(xué)習(xí)效率和質(zhì)量,就顯得尤為重要。特征工程主要解決的就是這兩方面的問(wèn)題,其作用是給模型算法鋪路,將晦澀、粗糙的特征轉(zhuǎn)換成對(duì)模型友好的特征。是否丟棄包含缺失值的樣本集的計(jì)算結(jié)果對(duì)比如表5-1所示。其的計(jì)算結(jié)果,右邊為沒(méi)有缺失值的樣本集及相應(yīng)的計(jì)算結(jié)果。表5-1根據(jù)表5-1的比例發(fā)生了很大變化(從75%變?yōu)?0%),因此不要輕易丟棄包含缺失值的樣本。對(duì)于離散型特征缺失值,最簡(jiǎn)單的處理方法為填入空字符串;對(duì)于連續(xù)性特征缺失值,最簡(jiǎn)單的處理方法為補(bǔ)0。(出現(xiàn)頻率最高的特征值)最常用的方法為分箱(Binning)(又稱為分桶),分箱是處理連續(xù)型特征的一種方法。連續(xù)型特征的取值個(gè)數(shù)是無(wú)限的,而值與值之間輕微的變化對(duì)預(yù)測(cè)目標(biāo)的影響較低,分箱可以基于這種輕微變化的規(guī)律,將線性特征轉(zhuǎn)換成非線性特征,從而提升特征的表達(dá)能力。分箱的方式有三種。第一種為等頻分箱,在特征的取值范圍內(nèi),按照特征值從小到大的順序排列樣本,同時(shí)將樣本按照數(shù)量均分成N份,每份作為一箱,同一個(gè)箱子中的特征值相同(通常用0和1表示)。例如,將樣本按照某特征從小到大的順序排列,然后按照每桶樣本數(shù)量相等的方式將其分成4箱,如圖5-4所示。第二種為等寬分箱,在特征的取值范圍內(nèi),將特征值按照從小到大的順序排列,并且將其均勻劃分成N份,落在同一份中的樣本屬于同一箱,同一箱特征向量的結(jié)果相同,示例如圖5-5所示。第三種為聚類分箱的方式不同,這種方式通過(guò)聚類算法將相似樣本特征值聚在一起作為分桶特征。與人為指定分桶方式的等頻分箱和等寬分箱相比,聚類分箱更靈活、合理。圖5- 等頻分箱示圖5- 等寬分箱示特征編碼(FeatureEncoding)當(dāng)拿到的原始特征數(shù)據(jù)是文本類型的數(shù)據(jù)時(shí),一般需要通過(guò)特征編碼的方式將其轉(zhuǎn)換成模型可識(shí)別的數(shù)值型數(shù)據(jù)。常用的特征編碼方式有三種。第一種是手動(dòng)建立映射字典,根據(jù)業(yè)務(wù)知識(shí)和目標(biāo)任務(wù),為離散型特征建立數(shù)字索引,用于進(jìn)行映射。第二種是labelencoding,這種方法僅適用于有序特征,對(duì)于一個(gè)有m本數(shù)據(jù)集,在經(jīng)過(guò)labelencoding處理后,每個(gè)類別都會(huì)映射到1的整數(shù)上。第三種是獨(dú)熱編碼,即One-hot編碼,這種方法很常見(jiàn),一個(gè)類別特征的取值一共有m會(huì)變?yōu)殚L(zhǎng)度為m的0-1向量,并且只有特征值對(duì)應(yīng)的位置為1的是,前面講到的分箱其實(shí)也是獨(dú)熱編碼的一種實(shí)現(xiàn)方式。獨(dú)熱編碼的具體做法是將離散型特征所有可能的取值按照一定的順序排列,同時(shí)生成一個(gè)維度相同且值全為0離散型特征所處的位置設(shè)置為1。例如,編碼圖5-2中的動(dòng)物類別離散型特征,編碼結(jié)果如表5-2所示。表5-2獨(dú)熱編碼示例特征縮放(FeatureScaling)特征縮放有三種常用方法,第一種叫作對(duì)數(shù)變換(LogTransformation)。對(duì)數(shù)變換將取值范圍很大的特征轉(zhuǎn)換到范圍較小的區(qū)間內(nèi),對(duì)特征分布的形狀有很大影響,可以降低特征值的震蕩影響,弱化特征噪聲,使特征分布更加勻稱。如圖5-6中,由于銷量值波動(dòng)很大,因此取自然對(duì)數(shù)可以弱化劇烈波動(dòng)帶來(lái)的影響。當(dāng)然,由于是取對(duì)數(shù),因此對(duì)零值或負(fù)值需要特殊處理,如統(tǒng)一設(shè)置為0。圖5- 對(duì)數(shù)變換的作映射到[0,1]區(qū)間。特征縮放的第三種方法叫作標(biāo)準(zhǔn)化(Standardization),算方法如下:首先計(jì)算得到當(dāng)前特征的平均值和標(biāo)準(zhǔn)差,然后將原始特征值先減去平均值,再除以方差,最后將特征值統(tǒng)一映射到標(biāo)準(zhǔn)正態(tài)分布中。特征縮放主要有兩個(gè)作用,第一個(gè)是使梯度下降的過(guò)程不容易發(fā)生震蕩,能更快收斂,如圖5-7模型算法中,起到統(tǒng)一量綱的作用。圖5- 不同量綱下梯度下降的對(duì)特征嵌入(FeatureEmbedding)始特征轉(zhuǎn)換成指定維度特征向量的一種方法。嚴(yán)格意義而言,特征嵌入也是特征變換的一種,但與基于特征數(shù)據(jù)層面的簡(jiǎn)單轉(zhuǎn)換相比,特征嵌入需要通過(guò)一個(gè)神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練過(guò)程來(lái)實(shí)現(xiàn)。此外,特征嵌入更加變化多端,基于不同的神經(jīng)網(wǎng)絡(luò)模型可以得到不同的特征嵌入向量。對(duì)于在距離度量下原本相近的樣本,特征嵌入能使它們?cè)谛碌奶卣骺臻g中保持原本相近的距離。例如,自然語(yǔ)言處理中的詞嵌入(WordEmbedding)就是將單字或單詞映射成較高維度的特征向量,特征交叉(FeatureOverlap)使用獨(dú)熱編碼
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 低壓電器 課件 單元二 項(xiàng)目二 任務(wù)一 刀開(kāi)關(guān)、組合開(kāi)關(guān)的使用
- 內(nèi)蒙古滿洲里市重點(diǎn)中學(xué)2024-2025學(xué)年初三下學(xué)期4月模擬物理試題含解析
- 四川省宜賓市翠屏區(qū)中學(xué)2024-2025學(xué)年中考英語(yǔ)試題:考前沖刺打靶卷含答案
- 邵陽(yáng)市大祥區(qū)2025年三下數(shù)學(xué)期末學(xué)業(yè)水平測(cè)試試題含解析
- 華中師范大學(xué)《藥理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 私立華聯(lián)學(xué)院《人機(jī)交互的軟件工程方法》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海市市西中2025年高考物理試題查漏補(bǔ)缺試題含解析
- 汕尾職業(yè)技術(shù)學(xué)院《現(xiàn)代審計(jì)學(xué)雙語(yǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古鄂托克旗烏蘭鎮(zhèn)中學(xué)2025屆初三生物試題期末試題含解析
- 云南交通職業(yè)技術(shù)學(xué)院《橋梁工程(二)》2023-2024學(xué)年第二學(xué)期期末試卷
- 智能輔具在康復(fù)中的應(yīng)用-全面剖析
- 福彩項(xiàng)目合伙協(xié)議書(shū)
- 2025年內(nèi)蒙古自治區(qū)中考一模語(yǔ)文試題(原卷版+解析版)
- 2025-2030中國(guó)濾紙市場(chǎng)現(xiàn)狀調(diào)查及營(yíng)銷發(fā)展趨勢(shì)研究研究報(bào)告
- 征文投稿(答題模板)原卷版-2025年高考英語(yǔ)答題技巧與模板構(gòu)建
- 智慧樹(shù)知到《中國(guó)文化精粹(河北政法職業(yè)學(xué)院)》2025章節(jié)測(cè)試附答案
- 空壓機(jī)每日巡檢記錄表-
- 2024-2025學(xué)年統(tǒng)編版七年級(jí)下冊(cè)歷史第一單元測(cè)驗(yàn)卷
- 2025年共青團(tuán)入團(tuán)積極分子考試測(cè)試試卷題庫(kù)及答案
- 10.2.2 加減消元法(課件)2024-2025學(xué)年新教材七年級(jí)下冊(cè)數(shù)學(xué)
- 信息科技開(kāi)學(xué)第一課課件 哪吒 人工智能 機(jī)器人 信息科技
評(píng)論
0/150
提交評(píng)論