1. 程式人生 > >R語言-knn演算法的實現

R語言-knn演算法的實現

R語言實現knn演算法,步驟如下:

一、載入R包

library(kknn)
library(sampling)
library(class)
kknn是用來提供資料集和加權knn演算法函式的,sampling是用來提供抽樣演算法函式的,class是用來提供knn演算法函式的。

如果不能載入上面幾個包請先下載。

二、準備資料

我用的資料是kknn包自帶的資料集miete,可以通過幾個不同的函式檢視資料集miete的屬性。

data(miete)
head(miete)
dim(miete)
str(miete)

先去掉第1、3、12列資料:

# 去掉第1、3、12列資料
miete = miete[, -c(1, 3, 12)]

需要用來做分類的列是miete$nmkat,通過函式table(miete$nmkat)可以看到,此列屬性共分為5類,分別標記為1、2、3、4、5,每一類所包含的物件大概都是200多一點,如下圖:


所以我們可以取三分之二的資料作為訓練集,三分之一的資料作為測試集。所以五類資料每一類的資料各隨機取三分之二,抽樣為不放回抽樣。

n = round(2 / 3 * nrow(miete) / 5)
sub_train = strata(miete,
                   stratanames = "nmkat",
                   size = rep(n, 5),
                   method = "srswor")
n是五類資料每一類應該抽取的資料個數,算出來是144個。

sub_train裡的資料是需要抽取出來的列的序號,通過方法:

# 構造訓練集
data_train = miete[sub_train$ID_unit, ]
# 構造測試集
data_test = miete[-sub_train$ID_unit, ]
分別取出訓練集和測試集。
選取資料之前也可以對資料進行歸一化處理:
# 函式歸一化
normalize = function(x) {
  return((x - min(x)) / (max(x) - min(x)))
}
ix = c(1, 8, 10)
miete[, ix] = as.data.frame(lapply(miete[, ix], normalize))
對資料集的第一列、第八列、第十列做歸一化處理。

三、實現knn演算法

fit_pre = knn(data_train[, -12], data_test[, -12], cl = data_train[, 12])
訓練集和測試集用去掉第12列的其餘屬性作為分類依據,以訓練集的第十二列作為分類的目標,獲取測試集的分類結果fit_pre。

把得出來的訓練集結果fit_pre和真實的訓練集data_test做對比:

table(data_test$nmkat, fit_pre)
結果如下:


如果不夠直觀,還可以計算一下判斷準確率:

correct = sum(as.numeric(fit_pre)==as.numeric(data_test$nmkat))/nrow(data_test)
得出準確率0.4751381。

這個準確率是k=1時的準確率,knn函式未設定k時,k的預設值是1,如果想測試不同k值得準確率,可以設定迴圈求k=1:20的準確率。

correct = rep(0,20)
for(i in 1:20){
  fit_pre = knn(data_train[, -12], data_test[, -12], cl = data_train[, 12],k=i)
  correct[i] = sum(as.numeric(fit_pre)==as.numeric(data_test$nmkat))/nrow(data_test)
}

四、實現有權重的knn演算法(kknn)

fit_kknn = kknn(nmkat~.,data_train,data_test[,-12],k=1)
fit = fitted(fit_kknn)
table(data_test$nmkat,fit)
結果如下:


得出分類的準確率為0.5138122。

當然,也可以讓k取不同的值觀察分類準確率最高時,k的值為多少。

六、最後

以上,為knn演算法的R語言實現過程,如果讀者有什麼疑問或者意見建議,歡迎留言。

相關推薦

R語言-knn演算法實現

用R語言實現knn演算法,步驟如下: 一、載入R包 library(kknn) library(sampling) library(class)kknn是用來提供資料集和加權knn演算法函式的,sampling是用來提供抽樣演算法函式的,class是用來提供knn演算法函

R語言基於KNN演算法實現蘑菇毒性識別

R語言:基於KNN演算法實現蘑菇毒性識別 平臺:Ubuntu16.04LTS   RStudio 資料集介紹: trainData.txt  訓練資料集。包含4339個樣本(行),每個樣本共6個特徵(列),其中前5列為蘑菇樣本的特徵值,第6列為蘑菇的毒性屬性,0表示無毒,1

RKNN演算法實現

K近鄰演算法,即K-Nearest Neighbor algorithm,簡稱KNN演算法,單從名字來猜想,可以簡單粗暴的認為是:K個最近的鄰居,當K=1時,演算法便成了最近鄰演算法,即尋找最近的那個鄰居。為何要找鄰居?打個比方來說,假設你來到一個陌生的村莊,現在你要找到

Hadoop偽分佈安裝詳解+MapReduce執行原理+基於MapReduce的KNN演算法實現

本篇部落格將圍繞Hadoop偽分佈安裝+MapReduce執行原理+基於MapReduce的KNN演算法實現這三個方面進行敘述。 (一)Hadoop偽分佈安裝 1、簡述Hadoop的安裝模式中–偽分佈模式與叢集模式的區別與聯絡. Hadoop的安裝方式有三種:本地模式,偽分佈模式

R語言 apriori演算法案例詳解

轉載自http://blog.csdn.net/gjwang1983/article/details/45015203 1.概念 1.1 引論 關聯規則(AssociationRules)是無監督的機器學習方法,用於知識發現,而非預測。 關聯規則的學習器(learner)無

KNN演算法實現影象分類

首先,回顧k-Nearest Neighbor(k-NN)分類器,可以說是最簡單易懂的機器學習演算法。 實際上,k-NN非常簡單,根本不會執行任何“學習”,以及介紹k-NN分類器的工作原理。 然後,我們將k-NN應用於Kaggle Dogs vs. Cats資料集,這是Microsoft的A

python資料建模與KNN演算法實現手寫體數字識別

      資料建模指的是對現實世界各類資料的抽象組織,建立一一個適合的模型對資料進行處理。在資料分析與挖掘中,我們通常需要根據一-些資料建 立起特定的模型,然後處理。模型的建立需要依賴於演算法, - -般,常見的演算法有分類、聚類、關聯、

加權歐氏距離KNN演算法實現人臉識別(Python實現)

前沿: 本實踐是純屬小白練手入門小專案,希望未來可以手動自己用神經網路來識別人臉。共勉,加油! 題目內容: 針對標準人臉樣本庫,選擇訓練和測試樣本,對基本的knn分類演算法設計智慧演算法進行改進,能夠對測試樣本識別出身份。 題目要求: 1) 選擇合適的編碼

R語言使用tibble實現簡單資料框

library(tidyverse) ####建立tibble as_tibble(iris) #將資料框轉換為tibble tibble( x = 1:5, y = 1, z = x ^ 2 + y ) #使用tibble()將一個向

R語言分類演算法之整合學習(Bootstrap Aggregating)

1.整合學習(Bootstrap Aggregating)原理分析: Bagging是Bootstrap Aggregating的縮寫,簡單來說,就是通過使用boostrap抽樣得到若干不同的訓練集,以這些訓練集分別建立模型,即得到一系列的基分類器,這些分類器

C語言——Prim演算法實現最小生成樹

詳細C++版本的Prim實現, 可以參考:https://www.61mon.com/index.php/archives/199/comment-page-2#comments 也可參考:http://blog.csdn.net/yeruby/article/detail

Spark學習筆記-KNN演算法實現

基於Spark簡單實現演算法程式碼如下: object SparkKNN extends Serializable { def main(args: Array[String]) { if (args.length != 4) { printl

KNN演算法實現及其交叉驗證

KNN演算法 用NumPy庫實現K-nearest neighbors迴歸或分類。 鄰近演算法,或者說K最近鄰(kNN,k-NearestNeighbor)分類演算法是資料探勘分類技術中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,

R語言推薦演算法

library(recommenderlab) library(ggplot2) # data(MovieLense) dim(MovieLense) ## [1] 943 1664 MovieLense ## 943 x 1664 rating matrix of c

R語言分類演算法之距離判別(Distance Discrimination)

1.距離判別原理分析 根據待判定樣本與已知類別樣本之間的距離遠近做出判斷.根據已知類別樣本資訊建立距離判別函式式,再將各待判定樣本的屬性資料逐一代入式中計算,得到距離值,再根據此將樣本判入距離值最小的

[R][原始碼]EM演算法實現基於高斯混合模型(GMM)的聚類

要求:用EM演算法實現基於GMM的聚類演算法。一、實驗資料參考[1] 3.3.2章節。由兩個二維高斯分佈混合生成1000個數據,混合係數分別是0.4、0.6,均值和方差如下:mu1=[-2,-2]sigma1=[1.2, 0.5, 0.5, 1]mean2=[2,2]sigm

基於KNN演算法實現的單個圖片數字識別

Test.csv中第1434行,圖片數字值為”0“,最終歸類為0,正確。 Test.csv中第14686行,圖片數字值為”8“,最終歸類為8,正確。 4原始碼 最後附上本次基於KNN思想實現單個數字圖片識別的全部原始碼。 /** * @Title: DigitClassification.java

機器學習實戰-KNN演算法實現及遇到的問題總結

最近在看《機器學習實戰》這本書,內容充實,重視實踐,很不錯,也很適合機器學習的入門。下面貼上用python編寫的KNN演算法程式碼,放在部落格裡安全啊~~我的電腦隨時都會崩潰的.... from numpy import * import operator from os

R語言分類演算法之線性判別分析(Linear Discriminant Analysis)

1.線性判別原理解析 基本思想是”投影”,即高緯度空間的點向低緯度空間投影,從而簡化問題的處理.在原座標系下,空間中的點可能很難被分開,如圖8-1,當類別Ⅰ和類別Ⅱ中的樣本點都投影至圖中的”原

編寫knn演算法實現手寫體識別

一、首先學習學習knn演算法。 kNN演算法的核心思想是如果一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 kNN方法