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之間...