KNN演算法原始碼解析

2021-07-15 15:07:02 字數 4904 閱讀 8674

created on

sep 16, 2010

knn: k nearest neighbors

input: inx: vector to compare to existing dataset (1xn)

dataset: size m data set

of known vectors (nxm)

labels: data set labels (1xm vector)

k: number

of neighbors to use for comparison (should be an odd number)

output: the most popular class label

@author: pbharrin

'''from numpy import *

import operator

from os import listdir

def classify0(inx, dataset, labels, k):

datasetsize = dataset.shape[0]#得到陣列的行數,即知道有幾個訓練資料.

#tile:numpy中的函式.tile將原來的乙個陣列,擴充成了4個一樣的陣列.diffmat得到了目標與訓練數值之間的差值.

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

sqdiffmat = diffmat**2

#各個元素分別平方.

sqdistances = sqdiffmat.sum(axis=1)#對應列相乘,即得到了每乙個距離的平方.

distances = sqdistances**0.5

#開方,得到距離.

sorteddistindicies = distances.argsort()#公升序排列.

#選擇距離最小的k個點.

classcount={}

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

#排序#sorted(iterable[,cmp,[,key[,reverse=true]]])

#作用:return a new sorted list from the items in iterable.

#第乙個引數是乙個iterable,返回值是乙個對iterable中元素進行排序後的列表(list)。

#可選的引數有三個,cmp、key和reverse。

#1)cmp指定乙個定製的比較函式,這個函式接收兩個引數(iterable的元素),如果第乙個引數小於第二個引數,返回乙個負數;如果第乙個引數等於第二個引數,返回零;如果第乙個引數大於第二個引數,返回乙個正數。預設值為none。

#2)key指定乙個接收乙個引數的函式,這個函式用於從每個元素中提取乙個用於比較的關鍵字。預設值為none。

#3)reverse是乙個布林值。如果設定為true,列表元素將被倒序排列。

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, labels

#函式file2matrix把字串轉換為整數存入classlabelvector。

def file2matrix(filename):

fr = open(filename)

numberoflines = len(fr.readlines()) #獲得檔案的行數

returnmat = zeros((numberoflines,3)) #準備返回的矩陣

classlabelvector = #準備返回的標籤

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,classlabelvector

def 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)) #元素分割

return normdataset, ranges, minvals

def datingclasstest():

horatio = 0.50

#拿出10%

datingdatamat,datinglabels = file2matrix('datingtestset2.txt') #從檔案中載入資料集

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 errorcount

def 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 returnvect

def handwritingclasstest():

hwlabels =

trainingfilelist = listdir('trainingdigits') #載入訓練集

m = len(trainingfilelist)

trainingmat = zeros((m,1024))

for i in range(m):

filenamestr = trainingfilelist[i]

filestr = filenamestr.split('.')[0]

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

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

testfilelist = listdir('testdigits') #迭代測試集

errorcount = 0.0

mtest = len(testfilelist)

for i in range(mtest):

filenamestr = testfilelist[i]

filestr = filenamestr.split('.')[0]

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))

Fabric 原始碼解析 原始碼目錄解析

這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...

Integer原始碼解析

public class test else integer i3 200 integer i4 200 if i3 i4 else 結果為 原因integer 類會快取 128 到 127 之間的整數 但是如果new interger的話就是不同的物件了 源 分析 如果是在 128到正的127之間...