用Madlib學(xué)習(xí)『機器學(xué)習(xí)』之KNN
原創(chuàng)前言
機器學(xué)習(xí)(ML)分為:監(jiān)督學(xué)習(xí),無監(jiān)督學(xué)習(xí),半監(jiān)督學(xué)習(xí)等。
1.1 監(jiān)督學(xué)習(xí)(supervised learning)
監(jiān)督學(xué)習(xí)是訓(xùn)練神經(jīng)網(wǎng)絡(luò)和決策樹的常見技術(shù),高度依賴事先確定的分類系統(tǒng)給出的信息,對于神經(jīng)網(wǎng)絡(luò),分類系統(tǒng)利用信息判斷網(wǎng)絡(luò)的錯誤,然后不斷調(diào)整網(wǎng)絡(luò)參數(shù)。對于決策樹,分類系統(tǒng)用它來判斷哪些屬性提供了最多的信息。
從給定的訓(xùn)練數(shù)據(jù)集中學(xué)習(xí)出一個函數(shù),當(dāng)新的數(shù)據(jù)到來時,可以根據(jù)這個函數(shù)預(yù)測結(jié)果。
監(jiān)督學(xué)習(xí)的訓(xùn)練集要求包括輸入輸出,也可以說是特征和目標,訓(xùn)練集中的目標是由人標注的。
常見的有監(jiān)督學(xué)習(xí)算法:回歸分析和統(tǒng)計分類,最典型的算法是KNN和SVM。
有監(jiān)督學(xué)習(xí)最常見的就是:regression & classification
Regression:Y是實數(shù)向量,回歸問題,就是擬合(x,y)的一條曲線,使得價值函數(shù)(cost function) L最小。
Classification:Y是一個有窮數(shù)(finite number),可以看做類標號,分類問題首先要給定有l(wèi)abel的數(shù)據(jù)訓(xùn)練分類器,故屬于有監(jiān)督學(xué)習(xí)過程,分類過程中cost function l(X,Y)是X屬于類Y的概率的負對數(shù)。
其中fi(X)=P(Y=i/X)。
有監(jiān)督學(xué)習(xí)方法必須要有訓(xùn)練集與測試樣本,在訓(xùn)練集中找規(guī)律,而對測試樣本使用這種規(guī)律。
有監(jiān)督學(xué)習(xí)的方法就是識別事物,識別的結(jié)果表現(xiàn)在給待識別數(shù)據(jù)加上了標簽,因此訓(xùn)練樣本集必須由帶標簽的樣本組成。
1.2 名詞KNN
k-Nearest Neighbors
在一個給定的數(shù)據(jù)點上找出k個最近的數(shù)據(jù)點,在分類的情況下輸出輸出類的多數(shù)投票值,以及在回歸情況下目標值的平均值。
擼袖子
2.1 新新相映
軟件是基于***的postgresql 10.0加上***的madlib 1.12。
為了操作方便,我這里使用基于docker的ubuntu 16.04安裝madlib,這樣以后就可以拿著這個鏡像到處嗨了,以下操作就是在MAC里面進行的。
2.2 查看madlib版本
- #select madlib.version();
2.3 導(dǎo)入訓(xùn)練數(shù)據(jù)
- DROP TABLE IF EXISTS knn_train_data;
- CREATE TABLE knn_train_data (
- id integer,
- data integer[],
- label float
- );
- INSERT INTO knn_train_data VALUES
- (1, '{1,1}', 1.0),
- (2, '{2,2}', 1.0),
- (3, '{3,3}', 1.0),
- (4, '{4,4}', 1.0),
- (5, '{4,5}', 1.0),
- (6, '{20,50}', 0.0),
- (7, '{10,31}', 0.0),
- (8, '{81,13}', 0.0),
- (9, '{1,111}', 0.0);
- SELECT * from knn_train_data ORDER BY id;
2.4 導(dǎo)入測試數(shù)據(jù)
- DROP TABLE IF EXISTS knn_test_data;
- CREATE TABLE knn_test_data (
- id integer,
- data integer[]
- );
- INSERT INTO knn_test_data VALUES
- (1, '{2,1}'),
- (2, '{2,6}'),
- (3, '{15,40}'),
- (4, '{12,1}'),
- (5, '{2,90}'),
- (6, '{50,45}');
- SELECT * from knn_test_data ORDER BY id;
2.5 分類訓(xùn)練
- SELECT * FROM madlib.knn(
- 'knn_train_data', -- 訓(xùn)練數(shù)據(jù)表名
- 'data', -- 訓(xùn)練數(shù)據(jù)所在列
- 'label', -- 訓(xùn)練標簽
- 'knn_test_data', -- 測試數(shù)據(jù)表名
- 'data', -- 測試數(shù)據(jù)所在列
- 'id', -- 測試數(shù)據(jù)列名id
- 'madlib_knn_result_classification', -- 結(jié)果輸出
- 'c', -- 分類
- 3 -- 最近相鄰數(shù)
- );
2.6 查看分類輸出結(jié)果
- SELECT * from madlib_knn_result_classification ORDER BY id;
圖形化示例:
2.7 進行回歸
- DROP TABLE IF EXISTS madlib_knn_result_regression;
- SELECT * FROM madlib.knn(
- 'knn_train_data', -- 訓(xùn)練數(shù)據(jù)表名
- 'data', -- 訓(xùn)練數(shù)據(jù)所在列
- 'label', -- 訓(xùn)練標簽
- 'knn_test_data', -- 測試數(shù)據(jù)表名
- 'data', -- 測試數(shù)據(jù)所在列
- 'id', -- 測試數(shù)據(jù)列名id
- 'madlib_knn_result_regression', --結(jié)果輸出
- 'r', -- 回歸
- 3 -- 最近相鄰數(shù)
- );
2.8 查看回歸輸出結(jié)果
- SELECT * from madlib_knn_result_regression ORDER BY id;
圖形化示例:
小結(jié)
postgresql提供了對結(jié)構(gòu)化數(shù)據(jù)的存儲和加工的便捷,madlib提供了ML算法的支持,強強聯(lián)手,相得益彰。
【作者簡介】孫輝,DataHunter技術(shù)總監(jiān)。曾在索尼等知名公司任職,先后擔(dān)任過系統(tǒng)架構(gòu)、技術(shù)總監(jiān)等職位,負責(zé)過尚郵,索愛中文輸入法,快牙,mPush(魔推)等知名產(chǎn)品研發(fā)。擁有15年深厚IT技術(shù)行業(yè)經(jīng)驗,熟悉掌控產(chǎn)品研發(fā)各個環(huán)節(jié),有豐富的后端、前端、運維、DBA、測試經(jīng)驗。
【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】