機器學習實戰第二章 KNN

2022-08-03 20:24:19 字數 4716 閱讀 1908

tile的使用方法

tile(a,n)的功能是把a陣列重複n次(可以在列方向,也可以在行方向)

argsort()函式

argsort()函式返回的是陣列中值從大到小的索引值

dict.get()函式

語法:dict.get(key, default=none)

key----字典中要查詢的鍵

default----如果指定的簡直不存在時,返回該預設值

add_subplot()基礎用法

import matplotlib.pyplot as plt

from numpy import *

fig = plt.figure()

ax = fig.add_subplot(349)

ax.plot(x,y)

將畫布分成三行四列,在第九個分割槽畫圖

from numpy import *

from os import listdir

import operator

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

# 對資料進行分類

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

datasetsize = dataset.shape[0] #shape[0]獲取第一維的數目

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

sqdiffmat = diffmat**2

# 求差的平方和

sqdistance = sqdiffmat.sum(axis=1) #axis=1???????sum函式預設是axis=0列元素相加,axis=1是一行的元素求和

# 求標準差

distances = sqdistance**0.5

# 距離排序

sortdistindicies = distances.argsort() #argsort函式返回的是陣列值從小到大的索引值

# 定義元字典

classcount = {}

for i in range(k):

# 獲得前k個元素的標籤

voteilabel = labels[sortdistindicies[i]]

# 計算前k個資料標籤出現的次數

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

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

return sortedclasscount[0][0]

# 讀取文字檔案資料

def file2matrix(filename):

fr = open(filename)

lines = fr.readlines()

num_lines = len(lines)

train_matrix = zeros((num_lines, 3))

label_vector =

index = 0

for line in lines:

line = line.strip()

line_list = line.split('\t')

train_matrix[index, :] = line_list[0:3] # 獲取列表的前0,1,2列

index += 1

return train_matrix, label_vector # add_subplot????????????????

#歸一化函式

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)) # minvals在列上重複一次(本身),在行上重複m次,從而形成m*3的向量

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

return normdataset, ranges, minvals # 歸一化後的資料, 極差範圍, 最小值

# 分類器測試函式

def datingclasstest():

horatio = 0.10 #測試集比例

datingdatamat, datinglabels = file2matrix('datingtestset2.txt')

normmat, ranges, minvals = autonorm(datingdatamat)

m = normmat.shape[0]

numtestvecs = int(m*horatio)

errcount = 0.0

for i in range(numtestvecs):

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

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

if(classifierresult != datinglabels[i]):

errcount += 1.0

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

# 手寫字元檔案轉換成向量

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('digits/trainingdigits')

m = len(trainingfilelist)

trainingmat = zeros((m, 1024))

for i in range(m):

filenamestr = trainingfilelist[i]

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

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

# 把檔案變成向量並賦值到trainingmat

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

testfilelist = listdir('digits/testdigits')

errcount = 0.0

mtest = len(testfilelist)

for i in range(mtest):

filenamestr = testfilelist[i]

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

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

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

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

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

if(int(classifierresult) != int(classnumstr)):

errcount += 1

print('\nthe total number of errors is %d' % errcount)

print('\nthe total error rate is: %f' % float(errcount/mtest))

《機器學習實戰》 第二章KNN

knn演算法是基本的機器學習方法,其原理很簡單 如果乙個例項在特徵空間中的k個最相似 即特徵空間中最近鄰 的例項中的大多數屬於某乙個類別,則該例項也屬於這個類別。其實際上是選擇k個最可能的樣本進行投票,這和k means尋找k個幾何中心點進行聚類是不同的.如下圖所示 有兩種型別的樣本資料,一類是藍色...

機器學習實戰 第二章 K 近鄰演算法

本系列目的在於總結每乙個分類器的特點 優點 缺點 使用資料型別 使用時的注意事項等 相關 自己搜。python 建議使用2.7 python常用函式庫 numpy scikit learn等 python整合環境 anaconda 優點 1 對異常值不敏感 2 無資料輸入假設 缺點 1 計算複雜度高...

機器學習實戰 第二章KNN中的一些問題

第一 書中file2matrix函式可能無法通過編譯。函式如下 def file2matrix filename fr open filename arrayolines fr.readlines numberoflines len arrayolines returnmat zeros numbe...