Knn原理及Python實現 資料展示

2021-07-16 15:04:26 字數 4487 閱讀 9057

knn演算法又稱為k近鄰分類(k-nearest neighbor classification)演算法。

演算法原理是,從訓練集中找到和新資料距離最接近的k條記錄,然後根據這k條記錄的分類來決定新資料的類別。所以knn的關鍵是,訓練集與測試集、距離或相似的衡量、k的大小及分類決策規則。一旦他們確定了,則結果就確定了。常用的距離度量公式是歐氏距離,k值的選擇反映了對近似誤差與估計誤差之間的權衡,k值的選擇會對結果產生重大的影響,通常由交叉驗證選擇最優的k值。

knn演算法的優點:

簡單,易於理解,易於實現,無需估計引數,無需訓練; 適合對稀有事件進行分類;特別適合於多分類問題, knn比svm的表現要好

缺點:懶惰演算法,對測試樣本分類時的計算量大,記憶體開銷大(我自己夠用)

#-*- coding: utf-8 -*-

from numpy import *

import operator

'''從檔案中讀取資料,將文字記錄轉換為矩陣,提取其中特徵和類標'''

deffilematrix

(filename):

fr=open(filename)

arrayolines=fr.readlines()

numberoflines=len(arrayolines) #得到檔案行數

returnmat=zeros((numberoflines,7)) #建立以零填充的numberoflines*7的numpy矩陣

classlabelvector=

index=0

for line in arrayolines: #獲取資料,獲取特徵矩陣

line=line.strip()

##文字分割

listfromline=line.split('\t')

# print(listfromline[1:8])

##獲取x

returnmat[index, : ]=listfromline[1:8]

##獲取標籤y

index+=1

return returnmat,classlabelvector #返回特徵矩陣和類標集合

'''歸一化數字特徵值到0-1範圍,防止特大值與特小值的影響'''

'''輸入為特徵值矩陣'''

defautonorm

(dataset):

minvals=dataset.min(0)

maxvals=dataset.max(0)

ranges=maxvals-minvals

normdataset=zeros(shape(dataset))

m=dataset.shape[0]

normdataset=dataset-tile(minvals,(m,1))

normdataset=normdataset/tile(ranges,(m,1))

return normdataset, ranges, minvals

defclassify

(sample,dataset,labels,k):

datasetsize=dataset.shape[0] #資料集行數即資料集記錄數

'''距離計算'''

diffmat=tile(sample,(datasetsize,1))-dataset #樣本與原先所有樣本的差值矩陣

sqdiffmat=diffmat**2

#差值矩陣平方

sqdistances=sqdiffmat.sum(axis=1) #計算每一行上元素的和

distances=sqdistances**0.5

#開方 sorteddistindicies=distances.argsort() #按distances中元素進行公升序排序後得到的對應下標的列表(索引值)

'''選擇距離最小的k個點'''

classcount={}

for i in range(k):

voteilabel=labels[sorteddistindicies[i]]

classcount[voteilabel]=classcount.get(voteilabel,0)+1

'''從大到小排序'''

sortedclasscount=sorted(classcount.items(),key=operator.itemgetter(1),reverse=true)

return sortedclasscount[0][0]

defclasstest

(): horatio=0.20

#測試樣例資料比例

datingdatamat,datinglabels=filematrix('user_info_and_topic_5topicand50word.txt')

#將測試集資料標準化,轉化為0-1之間

normmat, ranges, minvals=autonorm(datingdatamat)

##樣本總數目

m =normmat.shape[0]

##測試集的數目

numtestvecs=int(m*horatio)

precisioncount=0.0

##執行時,設定k的數目來調解演算法的準確率

k=35

##對測試集乙個乙個與訓練集算距離

for i in range(numtestvecs):

classifierresult=classify(normmat[i, : ],normmat[numtestvecs:m, : ], datinglabels[numtestvecs:m],k)

print("the classifier came back with: %s, the real answer is: %s" % (classifierresult, datinglabels[i]))

##如果真實類別的和**的類別相同,則加1

如圖所示,為以上演算法的資料格式,但是在運用是需要將資料的第一行刪除,只保留數字。並將其轉化為.txt文件,注意最好是utf-8的形式。以下**中的,其中7表示age,user_province,topic1……..topic5七個變數

returnmat=zeros((numberoflines,7))     #建立以零填充的numberoflines*7
以下**是獲得變數x的

##獲取x

returnmat[index, : ]=listfromline[1:8]

'''從檔案中讀取資料,將文字記錄轉換為矩陣,提取其中特徵和類標'''

deffilematrix

(filename):

fr=open(filename)

arrayolines=fr.readlines()

numberoflines=len(arrayolines) #得到檔案行數

returnmat=zeros((numberoflines,7)) #建立以零填充的numberoflines*7的numpy矩陣

classlabelvector=

index=0

for line in arrayolines: #獲取資料,獲取特徵矩陣

line=line.strip()

##文字分割

listfromline=line.split('\t')

# print(listfromline[1:8])

##獲取x

returnmat[index, : ]=listfromline[1:8]

##獲取標籤y

index+=1

return returnmat,classlabelvector #返回特徵矩陣和類標集合

如下圖所示,為knn演算法,針對我的資料跑出的精度,以及**的標籤,通過調節k值來調解**的精度。

KNN原理及python實現 kd樹

覺得自己完全看懂和做出來是兩回事,希望自己可以堅持將機器學習演算法基本都復現出來,並有時間進行時間空間複雜度的優化,用matlab梳理完思路後有時間再用python寫一遍,畢竟我是乙個厲害的小女子哈哈哈。如果你閱讀我的文章有什麼疑問,或是任何學術討論,歡迎和我交流 ianqi1994 163.com...

KNN(一) 簡單KNN原理及實現

原文 1.knn演算法介紹 鄰近演算法,或者說k最近鄰 knn,k nearestneighbor 分類演算法可以說是整個資料探勘分類技術中最簡單的方法了。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用她最接近的k個鄰居來代表。knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最...

KNN(一) 簡單KNN原理及實現

原文 1.knn演算法介紹 鄰近演算法,或者說k最近鄰 knn,k nearestneighbor 分類演算法可以說是整個資料探勘分類技術中最簡單的方法了。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用她最接近的k個鄰居來代表。knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最...