1故硅、算法介紹
一個(gè)樣本對(duì)應(yīng)一個(gè)分類(lèi)庶灿,用訓(xùn)練數(shù)據(jù)訓(xùn)練一個(gè)分類(lèi)器,在輸入沒(méi)有標(biāo)簽的樣本時(shí)吃衅,將新數(shù)據(jù)與訓(xùn)練集的數(shù)據(jù)對(duì)應(yīng)特征進(jìn)行比較往踢,找出“距離”最近的k個(gè)數(shù)據(jù),選擇這k個(gè)數(shù)據(jù)中出現(xiàn)最多的分類(lèi)作為新數(shù)據(jù)的分類(lèi)徘层。
算法描述
- 計(jì)算已知類(lèi)別數(shù)據(jù)及中的點(diǎn)與當(dāng)前點(diǎn)的距離峻呕;
距離計(jì)算方法有"euclidean"(歐氏距離),”minkowski”(明科夫斯基距離), "maximum"(切比雪夫距離), "manhattan"(絕對(duì)值距離),"canberra"(蘭式距離), 或 "minkowski"(馬氏距離)等. - 按距離遞增次序排序
- 選取與當(dāng)前點(diǎn)距離最小的k個(gè)點(diǎn),
- 確定前K個(gè)點(diǎn)所在類(lèi)別出現(xiàn)的頻率
- 返回頻率最高的類(lèi)別作為當(dāng)前類(lèi)別的預(yù)測(cè)
特點(diǎn)
KNN是有監(jiān)督的學(xué)習(xí)算法趣效,其特點(diǎn)有:
- 精度高山上,對(duì)異常值不敏感
- 只能處理數(shù)值型屬性
- 計(jì)算復(fù)雜度高(如已知分類(lèi)的樣本數(shù)為n,那么對(duì)每個(gè)未知分類(lèi)點(diǎn)要計(jì)算n個(gè)距離)
存在的問(wèn)題
KNN算法目前存在的問(wèn)題:
- k值的確定是個(gè)難題英支。
- 如果距離最近的k個(gè)已知分類(lèi)樣本中佩憾,頻數(shù)較高的類(lèi)型有多個(gè)(頻數(shù)相同),如何選擇對(duì)未知樣本的分類(lèi)?目前看是隨機(jī)的妄帘。
- 如果有n個(gè)未知類(lèi)型樣本楞黄,m個(gè)已知類(lèi)型樣本,則需要計(jì)算n*m個(gè)距離抡驼,計(jì)算量較大鬼廓,且需存儲(chǔ)全部數(shù)據(jù)集合,空間復(fù)雜度也較大致盟。
- 能否把預(yù)測(cè)的樣本分類(lèi)加入到已知類(lèi)別集合中碎税,對(duì)剩余的未知類(lèi)型樣本進(jìn)行分類(lèi)?
- 歸一化放在所有處理的最前面馏锡,這樣需要知道全部的樣本集合(已知分類(lèi)+未知分類(lèi))來(lái)構(gòu)建分類(lèi)器雷蹂,而實(shí)際上未知分類(lèi)的樣本并不一定能事先獲得,這樣如何進(jìn)行歸一化處理杯道,任然是個(gè)問(wèn)題匪煌。
應(yīng)用領(lǐng)域:
- 計(jì)算機(jī)視覺(jué):包含字符和面部識(shí)別等
- 推薦系統(tǒng):推薦受眾喜歡電影、美食和娛樂(lè)等
- 基因工程:識(shí)別基因數(shù)據(jù)的模式党巾,用于發(fā)現(xiàn)特定的蛋白質(zhì)或疾病等
2萎庭、R算法
- class函數(shù)包中的knn、knn.cv函數(shù)齿拂;
- caret函數(shù)包中的knn3函數(shù)驳规;
- kknn函數(shù)包中的kknn函數(shù);
- ipred函數(shù)包中的ipredknn函數(shù)
- DMwR函數(shù)包中的kNN函數(shù)
3署海、案例
實(shí)驗(yàn)環(huán)境
- 操作系統(tǒng):
Mac OS X High Sierra 10.13.1+2.5 GHz Intel Core i7+16 GB 1600 MHz DDR3
R version 3.4.2 (2017-09-28)
- 數(shù)據(jù)集
kaggle上泰坦尼客號(hào)數(shù)據(jù)集 - 說(shuō)明
變量名 | 描述 |
---|---|
Survived | 生存 (1) or 死亡 (0) |
Pclass | 客艙等級(jí) |
Name | 姓名 |
Sex | 性別 |
Age | 年齡 |
SibSp | 兄弟姐妹和夫妻數(shù) |
Parch | 父母和兒女?dāng)?shù) |
Ticket | 船票號(hào) |
Fare | 費(fèi)用 |
Cabin | 客艙號(hào) |
Embarked | 出發(fā)的港口 |
- 程序代碼
#數(shù)據(jù)處理
library("class")
library("caret")
library("kknn")
library("ipred")
library("DMwR")#加載程序包
library('dplyr')
test<-read.csv("./test.csv",stringsAsFactors = F)
train<-read.csv("./train.csv",stringsAsFactors = F)
test$datatype<-"test"
train$datatype<-"train"
full <-bind_rows(train, test)
full$Sex[full$Sex=="female"]<-1
full$Sex[full$Sex=="male"]<-0
full$Sex<-as.numeric(full$Sex)
full$Embarked [full$Embarked =="S"]<-1
full$Embarked [full$Embarked =="C"]<-2
full$Embarked [full$Embarked =="Q"]<-3
full$Embarked <-as.numeric(full$Embarked )
full$Age[is.na(full$Age)]<--1
full$Fare[is.na(full$Fare)]<-8.05
full$Embarked[is.na(full$Embarked)]<-2
full$Pclass<-as.numeric(full$Pclass)
full$SibSp<-as.numeric(full$SibSp)
full$Parch<-as.numeric(full$Parch)
train <- full[1:891,]
test <- full[892:1309,]
用Pclass 达舒、Sex 、Age叹侄、SibSp巩搏、Parch 、Fare趾代、Embarked進(jìn)行建模
- 基于class 函數(shù)包knn實(shí)現(xiàn)
- 基于caret函數(shù)包中的knn3函數(shù)實(shí)現(xiàn)
- 基于kknn函數(shù)包中的kknn函數(shù)實(shí)現(xiàn)
- 基于ipred函數(shù)包中的ipredknn函數(shù)實(shí)現(xiàn)
- 基于DMwR函數(shù)包中的kNN函數(shù)實(shí)現(xiàn)