當前位置:首頁 » 操作系統 » knn演算法r

knn演算法r

發布時間: 2023-07-19 18:52:50

① 大數據經典演算法解析(8)一KNN演算法

  姓名:崔升    學號:14020120005

【嵌牛導讀】:

 本文討論的kNN演算法是監督學習中分類方法的一種。所謂監督學習與非監督學習,是指訓練數據是   否有標注類別,若有則為監督學習,若否則為非監督學習。監督學習是根據輸入數據(訓練數據)   學習一個模型,能對後來的輸入做預測。在監督學習中,輸入變數與輸出變數可以是連續的,也可   以是離散的。若輸入變數與輸出變數均為連續變數,則稱為 回歸 ;輸出變數為有限個離散變數,則   稱為 分類 ;輸入變數與輸出變數均為變數序列,則稱為 標注 [2]。

【嵌牛鼻子】:經典大數據演算法之kNN演算法的簡單介紹

【嵌牛提問】:kNN是一種怎麼的演算法,其數學原理又是如何?

【嵌牛正文】:

1. 引言

頂級數據挖掘會議ICDM於2006年12月評選出了數據挖掘領域的 十大經典演算法 :C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naïve Bayes與 CART。 以前看過關於這些數據挖掘演算法,但對背後數學原理未做過多探究,因而藉此整理以更深入地理解這些演算法。

2. kNN演算法

kNN演算法的核心思想非常簡單:在訓練集中選取離輸入的數據點最近的k個鄰居,根據這個k個鄰居中出現次數最多的類別(最大表決規則),作為該數據點的類別。

演算法描述

訓練集T={(x1,y1),(x2,y2),⋯,(xN,yN)}T={(x1,y1),(x2,y2),⋯,(xN,yN)},其類別yi∈{c1,c2,⋯,cK}yi∈{c1,c2,⋯,cK},訓練集中樣本點數為NN,類別數為KK。輸入待預測數據xx,則預測類別

y=argmaxcj∑xi∈Nk(x)I(yi=cj),i=1,2,⋯,N;j=1,2,⋯,K(1)(1)y=arg⁡maxcj⁡∑xi∈Nk(x)I(yi=cj),i=1,2,⋯,N;j=1,2,⋯,K

其中,涵蓋xx的k鄰域記作Nk(x)Nk(x),當yi=cjyi=cj時指示函數I=1I=1,否則I=0I=0。

分類決策規則

kNN學習模型:輸入XX,通過學習得到決策函數:輸出類別Y=f(X)Y=f(X)。假設分類損失函數為0-1損失函數,即分類正確時損失函數值為0,分類錯誤時則為1。假如給xx預測類別為cjcj,即f(X)=cjf(X)=cj;同時由式子 (1) (1)可知k鄰域的樣本點對學習模型的貢獻度是均等的,則kNN學習模型誤分類率為

1k∑xi∈Nk(x)I(yi≠f(xi))=1k∑xi∈Nk(x)I(yi≠cj)=1−1k∑xi∈Nk(x)I(yi=cj)(2)(2)1k∑xi∈Nk(x)I(yi≠f(xi))=1k∑xi∈Nk(x)I(yi≠cj)=1−1k∑xi∈Nk(x)I(yi=cj)

若要最小化誤分類率,則應

maxcj∑xi∈Nk(x)I(yi=cj)maxcj⁡∑xi∈Nk(x)I(yi=cj)

所以,最大表決規則等價於經驗風險最小化。

存在問題

k值得選取對kNN學習模型有著很大的影響。若k值過小,預測結果會對噪音樣本點顯得異常敏感。特別地,當k等於1時,kNN退化成最近鄰演算法,沒有了顯式的學習過程。若k值過大,會有較大的鄰域訓練樣本進行預測,可以減小噪音樣本點的減少;但是距離較遠的訓練樣本點對預測結果會有貢獻,以至於造成預測結果錯誤。下圖給出k值的選取對於預測結果的影響:

前面提到過,k鄰域的樣本點對預測結果的貢獻度是相等的;但距離更近的樣本點應有更大的相似度,其貢獻度應比距離更遠的樣本點大。可以加上權值wi=1/∥xi−x∥wi=1/‖xi−x‖進行修正,則最大表決原則變成:

maxcj∑xi∈Nk(x)wi∗I(yi=cj)maxcj⁡∑xi∈Nk(x)wi∗I(yi=cj)

3. 參考資料

[1] Michael Steinbach and Pang-Ning Tan, The Top Ten Algorithms in Data Mining.

[2] 李航,《統計學習方法》.

② R語言-KNN演算法

1、K最近鄰(k-NearestNeighbor,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。

2、KNN演算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。

3、KNN演算法不僅可以用於分類,還可以用於回歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成正比。

簡言之,就是將未標記的案例歸類為與它們最近相似的、帶有標記的案例所在的類 。

原理及舉例

工作原理:我們知道樣本集中每一個數據與所屬分類的對應關系,輸入沒有標簽的新數據後,將新數據與訓練集的數據對應特徵進行比較,找出「距離」最近的k(通常k<20)數據,選擇這k個數據中出現最多的分類作為新數據的分類。

演算法描述

1、計算已知數據集中的點與當前點的距離

2、按距離遞增次序排序

3、選取與當前數據點距離最近的K個點

4、確定前K個點所在類別出現的頻率

5、返回頻率最高的類別作為當前類別的預測

距離計算方法有"euclidean"(歐氏距離),」minkowski」(明科夫斯基距離), "maximum"(切比雪夫距離), "manhattan"(絕對值距離),"canberra"(蘭式距離), 或 "minkowski"(馬氏距離)等

Usage

knn(train, test, cl, k = 1, l = 0, prob =FALSE, use.all = TRUE)

Arguments

train

matrix or data frame of training set cases.

test

matrix or data frame of test set cases. A vector will  be interpreted as a row vector for a single case.

cl

factor of true classifications of training set

k

number of neighbours considered.

l

minimum vote for definite decision, otherwisedoubt. (More precisely, less thank-ldissenting votes are allowed, even

ifkis  increased by ties.)

prob

If this is true, the proportion of the votes for the

winning class are returned as attributeprob.

use.all

controls handling of ties. If true, all distances equal

to thekth largest are

included. If false, a random selection of distances equal to thekth is chosen to use exactlykneighbours.

kknn(formula = formula(train), train, test, na.action = na.omit(), k = 7, distance = 2, kernel = "optimal", ykernel = NULL, scale=TRUE, contrasts = c('unordered' = "contr.mmy", ordered = "contr.ordinal"))

參數:

formula                            A formula object.

train                                 Matrix or data frame of training set cases.

test                                   Matrix or data frame of test set cases.

na.action                         A function which indicates what should happen when the data contain 』NA』s.

k                                       Number of neighbors considered.

distance                          Parameter of Minkowski distance.

kernel                              Kernel to use. Possible choices are "rectangular" (which is standard unweighted knn), "triangular", "epanechnikov" (or beta(2,2)), "biweight" (or beta(3,3)), "triweight" (or beta(4,4)), "cos", "inv", "gaussian", "rank" and "optimal".

ykernel                            Window width of an y-kernel, especially for prediction of ordinal classes.

scale                                Logical, scale variable to have equal sd.

contrasts                         A vector containing the 』unordered』 and 』ordered』 contrasts to use

kknn的返回值如下:

fitted.values              Vector of predictions.

CL                              Matrix of classes of the k nearest neighbors.

W                                Matrix of weights of the k nearest neighbors.

D                                 Matrix of distances of the k nearest neighbors.

C                                 Matrix of indices of the k nearest neighbors.

prob                            Matrix of predicted class probabilities.

response                   Type of response variable, one of continuous, nominal or ordinal.

distance                     Parameter of Minkowski distance.

call                              The matched call.

terms                          The 』terms』 object used.

iris%>%ggvis(~Length,~Sepal.Width,fill=~Species)

library(kknn)
data(iris)

dim(iris)

m<-(dim(iris))[1]
val<-sample(1:m,size=round(m/3),replace=FALSE,prob=rep(1/m,m))

建立訓練數據集

data.train<-iris[-val,]

建立測試數據集

data.test<-iris[val,]

調用kknn  之前首先定義公式

formula : Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

iris.kknn<-kknn(Species~.,iris.train,iris.test,distance=1,kernel="triangular")

summary(iris.kknn)

# 獲取fitted.values

fit <- fitted(iris.kknn)

# 建立表格檢驗判類准確性

table(iris.valid$Species, fit)
# 繪畫散點圖,k-nearest neighbor用紅色高亮顯示

pcol <- as.character(as.numeric(iris.valid$Species))

pairs(iris.valid[1:4], pch = pcol, col = c("green3", "red")[(iris.valid$Species != fit)+1]

二、R語言knn演算法

install.packages("class")

library(class)

對於新的測試樣例基於距離相似度的法則,確定其K個最近的鄰居,在K個鄰居中少數服從多數

確定新測試樣例的類別

1、獲得數據

2、理解數據

對數據進行探索性分析,散點圖

如上例

3、確定問題類型,分類數據分析

4、機器學習演算法knn

5、數據處理,歸一化數據處理

normalize <- function(x){

num <- x - min(x)

denom <- max(x) - min(x)

return(num/denom)

}

iris_norm <-as.data.frame(lapply(iris[,1:4], normalize))

summary(iris_norm)

6、訓練集與測試集選取

一般按照3:1的比例選取

方法一、set.seed(1234)

ind <- sample(2,nrow(iris), replace=TRUE, prob=c(0.67, 0.33))

iris_train <-iris[ind==1, 1:4]

iris_test <-iris[ind==2, 1:4]

train_label <-iris[ind==1, 5]

test_label <-iris[ind==2, 5]

方法二、

ind<-sample(1:150,50)

iris_train<-iris[-ind,]

iris_test<-iris[ind,1:4]

iris_train<-iris[-ind,1:4]

train_label<-iris[-ind,5]

test_label<-iris[ind,5]

7、構建KNN模型

iris_pred<-knn(train=iris_train,test=iris_test,cl=train_label,k=3)

8、模型評價

交叉列聯表法

table(test_label,iris_pred)

實例二

數據集

http://archive.ics.uci.e/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data

導入數據

dir <-'http://archive.ics.uci.e/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data'wdbc.data <-read.csv(dir,header = F)

names(wdbc.data) <- c('ID','Diagnosis','radius_mean','texture_mean','perimeter_mean','area_mean','smoothness_mean','compactness_mean','concavity_mean','concave points_mean','symmetry_mean','fractal dimension_mean','radius_sd','texture_sd','perimeter_sd','area_sd','smoothness_sd','compactness_sd','concavity_sd','concave points_sd','symmetry_sd','fractal dimension_sd','radius_max_mean','texture_max_mean','perimeter_max_mean','area_max_mean','smoothness_max_mean','compactness_max_mean','concavity_max_mean','concave points_max_mean','symmetry_max_mean','fractal dimension_max_mean')

table(wdbc.data$Diagnosis)## M = malignant, B = benign

wdbc.data$Diagnosis <- factor(wdbc.data$Diagnosis,levels =c('B','M'),labels = c(B ='benign',M ='malignant'))

③ R語言Knn演算法中的訓練集和測試集必須各佔一半嗎

這個不一定。之所以要分訓練集和測試集是因為怕過度擬合(overfitting),所以需要一個測試集來檢驗確定 你建立的模型並不只是適合於這一組數據。我一般都是70%訓練集30%測試集。當然,得看數據量有多大,以及復雜程度。只要訓練集>=測試集,就不會錯,但好不好得具體分析。如果數據量在1000以下的話,最好是k折交叉驗證(基本上只要不是特別復雜的數據,都推薦k折交叉驗證)。如果要是數據量大於10萬的話,最好考慮80:20甚至90:10。

④ KNN 演算法-理論篇-如何給電影進行分類

KNN 演算法 的全稱是 K-Nearest Neighbor ,中文為 K 近鄰 演算法,它是基於 距離 的一種演算法,簡單有效。

KNN 演算法 即可用於分類問題,也可用於回歸問題。

假如我們統計了一些 電影數據,包括電影名稱,打鬥次數,接吻次數,電影類型 ,如下:

可以看到,電影分成了兩類,分別是動作片和愛情片。

如果現在有一部新的電影A,它的打鬥和接吻次數分別是80 和7,那如何用KNN 演算法對齊進行分類呢?

我們可以將打鬥次數作為 X 軸 ,接吻次數作為 Y 軸 ,將上述電影數據畫在一個坐標系中,如下:

通過上圖可以直觀的看出,動作電影與愛情電影的分布范圍是不同的。

KNN 演算法 基於距離,它的原理是: 選擇與待分類數據最近的K 個點,這K 個點屬於哪個分類最多,那麼待分類數據就屬於哪個分類

所以,要判斷電影A 屬於哪一類電影,就要從已知的電影樣本中,選出距離電影A 最近的K 個點:

比如,我們從樣本中選出三個點(即 K 為 3),那麼距離電影A 最近的三個點是《功夫》,《黑客帝國》和《戰狼》,而這三部電影都是動作電影。因此,可以判斷電影A 也是動作電影。

另外,我們還要處理兩個問題:

關於點之間的距離判斷,可以參考文章 《計算機如何理解事物的相關性》 。

至於K 值的選擇,K 值較大或者較小都會對模型的訓練造成負面影響,K 值較小會造成 過擬合 ,K 值較大 欠擬合

因此,K 值的選擇,一般採用 交叉驗證 的方式。

交叉驗證的思路是,把樣本集中的大部分樣本作為訓練集,剩餘部分用於預測,來驗證分類模型的准確度。一般會把 K 值選取在較小范圍內,逐一嘗試K 的值,當模型准確度最高時,就是最合適的K 值。

可以總結出, KNN 演算法 用於分類問題時,一般的步驟是:

如果,我們現在有一部電影B,知道該電影屬於動作電影,並且知道該電影的接吻次數是 7 ,現在想預測該電影的打鬥次數是多少?

這個問題就屬於 回歸問題

首先看下,根據已知數據,如何判斷出距離電影B 最近的K 個點。

我們依然設置K 為3,已知數據為:

根據已知數據可以畫出下圖:

圖中我畫出了一條水平線,這條線代表所有接吻次數是7 的電影,接下來就是要找到距離 這條線 最近的三部(K 為 3)動作電影。

可以看到,距離這條水平線最近的三部動作電影是《功夫》,《黑客帝國》和《戰狼》,那麼這三部電影的打鬥次數的平均值,就是我們預測的電影B 的打鬥次數。

所以,電影B 的打鬥次數是:

本篇文章主要介紹了 KNN 演算法 的基本原理,它簡單易懂,即可處理分類問題,又可處理回歸問題。

KNN 演算法 是基於 距離 的一種機器學習演算法,需要計算測試點與樣本點之間的距離。因此,當數據量大的時候,計算量就會非常龐大,需要大量的存儲空間和計算時間。

另外,如果樣本數據分類不均衡,比如有些分類的樣本非常少,那麼該類別的分類准確率就會很低。因此,在實際應用中,要特別注意這一點。

(本節完。)

推薦閱讀:

決策樹演算法-理論篇-如何計算信息純度

決策樹演算法-實戰篇-鳶尾花及波士頓房價預測

樸素貝葉斯分類-理論篇-如何通過概率解決分類問題

樸素貝葉斯分類-實戰篇-如何進行文本分類

計算機如何理解事物的相關性-文檔的相似度判斷

⑤ knn演算法是什麼

KNN(K- Nearest Neighbor)法即K最鄰近法,最初由Cover和Hart於1968年提出,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。

作為一種非參數的分類演算法,K-近鄰(KNN)演算法是非常有效和容易實現的。它已經廣泛應用於分類、回歸和模式識別等。

介紹

KNN演算法本身簡單有效,它是一種lazy-learning演算法,分類器不需要使用訓練集進行訓練,訓練時間復雜度為0。KNN分類的計算復雜度和訓練集中的文檔數目成正比,也就是說,如果訓練集中文檔總數為n,那麼KNN的分類時間復雜度為O(n)。

KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。

⑥ 什麼叫做knn演算法

在模式識別領域中,最近鄰居法(KNN演算法,又譯K-近鄰演算法)是一種用於分類和回歸的非參數統計方法。

在這兩種情況下,輸入包含特徵空間(Feature Space)中的k個最接近的訓練樣本。

1、在k-NN分類中,輸出是一個分類族群。一個對象的分類是由其鄰居的「多數表決」確定的,k個最近鄰居(k為正整數,通常較小)中最常見的分類決定了賦予該對象的類別。若k=1,則該對象的類別直接由最近的一個節點賦予。

2、在k-NN回歸中,輸出是該對象的屬性值。該值是其k個最近鄰居的值的平均值。

最近鄰居法採用向量空間模型來分類,概念為相同類別的案例,彼此的相似度高,而可以藉由計算與已知類別案例之相似度,來評估未知類別案例可能的分類。

K-NN是一種基於實例的學習,或者是局部近似和將所有計算推遲到分類之後的惰性學習。k-近鄰演算法是所有的機器學習演算法中最簡單的之一。

無論是分類還是回歸,衡量鄰居的權重都非常有用,使較近鄰居的權重比較遠鄰居的權重大。例如,一種常見的加權方案是給每個鄰居權重賦值為1/ d,其中d是到鄰居的距離。

鄰居都取自一組已經正確分類(在回歸的情況下,指屬性值正確)的對象。雖然沒要求明確的訓練步驟,但這也可以當作是此演算法的一個訓練樣本集。

k-近鄰演算法的缺點是對數據的局部結構非常敏感。

K-均值演算法也是流行的機器學習技術,其名稱和k-近鄰演算法相近,但兩者沒有關系。數據標准化可以大大提高該演算法的准確性。

參數選擇

如何選擇一個最佳的K值取決於數據。一般情況下,在分類時較大的K值能夠減小雜訊的影響,但會使類別之間的界限變得模糊。一個較好的K值能通過各種啟發式技術(見超參數優化)來獲取。

雜訊和非相關性特徵的存在,或特徵尺度與它們的重要性不一致會使K近鄰演算法的准確性嚴重降低。對於選取和縮放特徵來改善分類已經作了很多研究。一個普遍的做法是利用進化演算法優化功能擴展,還有一種較普遍的方法是利用訓練樣本的互信息進行選擇特徵。

在二元(兩類)分類問題中,選取k為奇數有助於避免兩個分類平票的情形。在此問題下,選取最佳經驗k值的方法是自助法。

熱點內容
阿里雲伺服器上傳圖片指令 發布:2025-03-16 01:27:25 瀏覽:25
狼戰2ftp 發布:2025-03-16 01:27:18 瀏覽:675
android濾波 發布:2025-03-16 01:25:02 瀏覽:623
海南省源碼 發布:2025-03-16 01:20:36 瀏覽:378
java程序員修煉之道 發布:2025-03-16 01:15:46 瀏覽:828
離子存儲 發布:2025-03-16 01:02:46 瀏覽:257
免費上傳雲盤 發布:2025-03-16 01:01:59 瀏覽:706
acm配置是什麼 發布:2025-03-16 00:56:56 瀏覽:647
安卓系統怎麼通話 發布:2025-03-16 00:25:13 瀏覽:320
資料庫上t 發布:2025-03-16 00:23:31 瀏覽:410