學習kNN演算法的感受

2021-07-09 12:34:34 字數 4766 閱讀 8287

本來預計的打算是一天乙個十大挖掘演算法,然而由於同時要兼顧資料結構面試的事情,所以很難辦到,但至少在回家前要把資料探勘十大演算法看完,過個好年,在course上學習老吳的課程還是幫了我很大的忙,雖然浪費了時間,但是也無形中幫助我很多,所以說還是很值得的,今天就總結knn演算法的一部分,這部分老吳的課程中沒有太多涉及到,所以我又重新關注了一下,下面是我的總結,希望能對大家有所幫組。

介紹環鏡:python2.7  idle  pycharm5.0.3

作業系統:windows

第一步:因為沒有numpy,所以要安裝numpy,詳情見另一篇安裝numpy的部落格,這裡不再多說.

第二步:貼**:

from numpy import *

import operator

from os import listdirdef classify0(inx, dataset, labels, k):datasetsize = dataset.shape[0]

diffmat = tile(inx, (datasetsize,1)) - dataset

sqdiffmat = diffmat**2

sqdistances = sqdiffmat.sum(axis=1)

distances = sqdistances**0.5

sorteddistindicies = distances.argsort()

classcount={}

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

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

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

return sortedclasscount[0][0]def createdataset():group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels = ['a','a','b','b']

return group, labelsdef file2matrix(filename):fr = open(filename)

numberoflines = len(fr.readlines()) #get the number of lines in the file

returnmat = zeros((numberoflines,3)) #prepare matrix to return

classlabelvector = #prepare labels return

fr = open(filename)

index = 0

for line in fr.readlines():

line = line.strip()

listfromline = line.split('\t')

returnmat[index,:] = listfromline[0:3]

index += 1

return returnmat,classlabelvectordef autonorm(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)) #element wise divide

return normdataset, ranges, minvalsdef datingclasstest():horatio = 0.50 #hold out 10%

datingdatamat,datinglabels = file2matrix('datingtestset2.txt') #load data setfrom file

normmat, ranges, minvals = autonorm(datingdatamat)

m = normmat.shape[0]

numtestvecs = int(m*horatio)

errorcount = 0.0

for i in range(numtestvecs):

classifierresult = classify0(normmat[i,:],normmat[numtestvecs:m,:],datinglabels[numtestvecs:m],3)

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

if (classifierresult != datinglabels[i]): errorcount += 1.0

print "the total error rate is: %f" % (errorcount/float(numtestvecs))

print errorcountdef img2vector(filename):returnvect = zeros((1,1024))

fr = open(filename)

for i in range(32):

linestr = fr.readline()

for j in range(32):

returnvect[0,32*i+j] = int(linestr[j])

return returnvectdef handwritingclasstest():hwlabels =

trainingfilelist = listdir('trainingdigits') #load the training set

m = len(trainingfilelist)

trainingmat = zeros((m,1024))

for i in range(m):

filenamestr = trainingfilelist[i]

filestr = filenamestr.split('.')[0] #take off .txt

classnumstr = int(filestr.split('_')[0])

trainingmat[i,:] = img2vector('trainingdigits/%s' % filenamestr)

testfilelist = listdir('testdigits') #iterate through the test set

errorcount = 0.0

mtest = len(testfilelist)

for i in range(mtest):

filenamestr = testfilelist[i]

filestr = filenamestr.split('.')[0] #take off .txt

classnumstr = int(filestr.split('_')[0])

vectorundertest = img2vector('testdigits/%s' % filenamestr)

classifierresult = classify0(vectorundertest, trainingmat, hwlabels, 3)

print "the classifier came back with: %d, the real answer is: %d" % (classifierresult, classnumstr)

if (classifierresult != classnumstr): errorcount += 1.0

print "\nthe total number of errors is: %d" % errorcount

print "\nthe total error rate is: %f" % (errorcount/float(mtest))

第三步:通過命令列互動

(1):先將上述**儲存為knn.py

(2):再在idle下的run選單下run一下,將其生成python模組

(3): import  knn(因為上一步已經生成knn模組)

(4): knn.classify0([0,0],group,labels,3) (討論[0,0]點屬於哪乙個類)

注:其中【0,0】可以隨意換

即【】內的座標就是我們要判斷的點的座標:

>>> knn.classify0([0,0],group,labels,3)

'b'>>> knn.classify0([0,1],group,labels,3)

'b'>>> knn.classify0([0.6,0.6],group,labels,3)

'a'

機器學習演算法 kNN演算法

knn k 鄰近演算法 1.knn是non parametric分類器,既不做分布式假設,直接從資料估計概率密度 2.knn不適用於高維資料 優點 1.無需估計引數,無需訓練 2.特別適合於多分類問題 物件具有多個標籤 缺點 1.當樣本容量不平衡是,輸入有個新樣本,該樣本的k個鄰值中大容量樣本占多數...

機器學習演算法 KNN演算法

knn演算法原理 knn k nearest neighbor 最鄰近分類演算法是資料探勘分類 classification 技術中最簡單的演算法之一,其指導思想是 近朱者赤,近墨者黑 即由你的鄰居來推斷出你的類別。knn最鄰近分類演算法的實現原理 為了判斷未知樣本的類別,以所有已知類別的樣本作為參...

演算法學習感受

經過一段時間的資料查閱發現程式中的演算法主要就是 lifo,fifo,圖,表,和樹,還有就是排序問題結構,剛開始對演算法的問題接觸不多,所以一直沒有時間仔細研究過這個問題 csdn上有很多講解的,而且有的講解的非常好 1.首先那lifo來講,是典型的棧結構,後進先出 實現方式常接觸的就是通過鍊錶實現...