在 2008 年尾的時(shí)候,讀到一本非常有趣的書(shū),叫做《Data Mining With SQL Server 2008》. 在遇到《Inside Sql Server》系列前夕,此時(shí)正值讀書(shū)的空檔期。為什么會(huì)對(duì)這本書(shū)感興趣呢,畢竟是作為不是數(shù)據(jù)挖掘畢業(yè)的我,八竿子也打不到 Data Mining 的領(lǐng)域去,主要還是對(duì)于前途的擔(dān)憂。這話題說(shuō)來(lái),估計(jì)長(zhǎng)的可以寫(xiě)篇小說(shuō)了。咱們不賣(mài)焦慮,所以簡(jiǎn)而言之:做了兩年 C/S 的開(kāi)發(fā)之后,深深感到數(shù)據(jù)才是靈魂,而這靈魂的操盤(pán)手,普天之下,Data Mining 穩(wěn)穩(wěn)得排在江湖兵器譜第一位!在堅(jiān)持了兩個(gè)月的研究之后,(為什么這么久,只有英語(yǔ)六級(jí)水平的人,看純英文版還是很吃力,當(dāng)時(shí)這本書(shū)還沒(méi)中文本),搗鼓了一點(diǎn)彩票數(shù)據(jù)進(jìn) SQL Server Cube ,以為靠著深?yuàn)W萬(wàn)能的模型,從此可以財(cái)富自由,一時(shí)間豪氣四射,信心倍增,連蛋餅都加 2 個(gè)蛋的,后來(lái)才知其實(shí)那只是黃粱一夢(mèng)。在萬(wàn)惡的資本思想驅(qū)使下,一遍遍修煉決策樹(shù),聚類,神經(jīng)網(wǎng)絡(luò),貝葉斯模型, 每一遍都用真金白銀去豪賭(2 塊錢(qián)一注,當(dāng)時(shí)月薪 1200 吧,所以真是豪賭),收獲的卻是一遍遍的失望,那時(shí)的心,就像 911 下的五角大樓一樣,崩塌在即。直到把聚類的模型統(tǒng)統(tǒng)走完,一次都沒(méi)中!從此,Data Mining 與我是路人。十年過(guò)來(lái)了,如今大火的數(shù)據(jù)挖掘,又加上了新玩法,美其名曰機(jī)器學(xué)習(xí),人工智能,深度學(xué)習(xí)等。再和朋友們談?wù)摰臅r(shí)候,閉口不談大數(shù)據(jù),AI, ML, 大家都會(huì)帶著異樣的眼光看著你,“你丫也是在 IT 圈混的?”... 所以重新拾起來(lái)看看,與時(shí)俱進(jìn)。其實(shí)內(nèi)心的回答是,“08 年小哥我開(kāi)始玩 Weka 的時(shí)候,你們連 Oracle 都不會(huì)玩吧,還談大數(shù)據(jù),AI”言歸正傳,今天的主題是 kNN ( top k nearest ) 最近鄰算法。參考的書(shū)目是兩本《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》(Peter 著)與《機(jī)器學(xué)習(xí)》(周志華著).這兩本書(shū)各有其優(yōu)點(diǎn),《實(shí)戰(zhàn)》這本書(shū)對(duì)于 Python 代碼實(shí)現(xiàn)算法講的比較多,讓你很容易就寫(xiě)出一個(gè)模型來(lái)完成一次實(shí)戰(zhàn),跟玩王者一樣的,反饋很及時(shí),而周志華教授的這本《機(jī)器學(xué)習(xí)》則是講的比較細(xì)致了,用的是挑西瓜的例子,很有趣味。當(dāng)然 Peter 這本書(shū)用的還是 Python 2.0 , 我費(fèi)了很大的勁兒,才轉(zhuǎn)成 Python 3.0 的語(yǔ)法,以下的例子會(huì)有注解, 而周教授的這本書(shū),則是沒(méi)有數(shù)學(xué)底子根本看不懂在講啥,碰到 kNN , 會(huì)跟你詳細(xì)解釋權(quán)重,概率,線性矩陣,有多少種求解最短距離的算法等,很開(kāi)眼界,讓我瞬間覺(jué)得我活著都是在浪費(fèi)社會(huì)資源。用一幅圖來(lái)講解 kNN, 可以讓你瞬間秒懂:圖中的五角星,就是我們待分類的數(shù)據(jù)。與他最近的 k 個(gè)圓點(diǎn)所代表的類別,比重最大的就是預(yù)測(cè)數(shù)據(jù)的類別。求解方式很簡(jiǎn)單,在 2 個(gè)屬性下,就是求解直三角形斜邊的長(zhǎng)度,勾股定理一算就出來(lái)了。如果在多個(gè)屬性下,也就是將各自之差的平方相加,再求根,就得到最短距離Peter 書(shū)中采用了婚戀網(wǎng)的匹配推薦項(xiàng)目來(lái)演示 kNN。采用的特征分別是:根據(jù)這三個(gè)特征,收集了近1000個(gè)打分結(jié)果,來(lái)判斷約會(huì)雙方對(duì)彼此的影響,是不喜歡,喜歡還是極度渴望約會(huì)。求解 kNN 的核心代碼的代碼,經(jīng)過(guò) Python 3.0 修改 之后,如下:
模型做出來(lái)了,我們就用劃分為測(cè)試用例的數(shù)據(jù)做預(yù)測(cè),觀察其正確率:最后得到的誤差是4%,模型可以用來(lái)預(yù)測(cè)分類。只要拿到一個(gè)對(duì)象的這三個(gè)特征,就能得到他/她是否能得到大家的喜歡,而這個(gè)結(jié)果有 96% 的準(zhǔn)確性。為了更好的了解這個(gè)功能,用 MatPlotLib 做了一個(gè)圖,圖中面積最大的那些點(diǎn),就是最受喜歡的那群人,他們的特征在某些方面具有奇高的重疊氣泡圖在 Python 的 MatPlotLib 下實(shí)現(xiàn)也非常容易:那么如何用 SQL 實(shí)現(xiàn)呢,kNN 的算法是所有算法中最簡(jiǎn)單的一個(gè),只要對(duì)原理掌握了,不過(guò)是把 Python 換成了 SQL。當(dāng)然這兩者在如今的數(shù)據(jù)量環(huán)境下,都不是好的實(shí)現(xiàn)語(yǔ)言,必須與 Spark , Hadoop 等分布式存儲(chǔ)于計(jì)算環(huán)境結(jié)合起來(lái),方能全量無(wú)死角的洞悉信息。以下是兩張數(shù)據(jù)表,第一張 datingSampleDataSet 就是收集好的數(shù)據(jù)其中的900條,第二張 datingTestingDataSet 是從收集好的數(shù)據(jù)中取出來(lái)的 100 條,因這份數(shù)據(jù)已經(jīng)有喜好的分類了,因此可以作為誤差的計(jì)算.?select * from dbo.datingSampleDataSet
select * from dbo.datingTestingDataSet
在 SQL 的實(shí)現(xiàn)過(guò)程中,我們用一個(gè)函數(shù)來(lái)求解預(yù)測(cè)值的分類,再來(lái)判斷函數(shù)的誤差。最后得到的誤差和 Python 實(shí)現(xiàn)的一樣,都是 4%。·················END·················