《機器學習實戰》讀書筆記 1

2021-09-12 09:58:19 字數 4598 閱讀 5599

#(本人開發工具為pycharm,python版本是3.5)

第二章 knn

2.1 概述

k-緊鄰演算法的一般流程:

收集資料:可以使用任何方法

準備資料:距離計算所需要的數值,最好是結構化的資料格式

分子資料:可以使用任何方法

訓練資料:此步驟不適應於k-緊鄰演算法

測試資料:計算錯誤率

使用演算法:首先需要輸入樣本資料和結構化的輸出結果,然後執行k-緊鄰演算法判定輸入資料分別屬於哪個分類,最後應用對計算出的分類執行後續的處理

2.1.1 準備資料

建立名為knn.py的python模組

import

numpy as np

import

operator

defcreatedataset():

group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels = ['

a','

a','

b','b'

]

return group,labels

在資料夾中建立另外乙個.py檔案

import

knngroup,labels =knn.createdataset()

print('

group =

',group,'

\n','

labels =

',labels)

執行結果:

group =  [[ 1.   1.1]

[ 1. 1. ]

[ 0. 0. ]

[ 0. 0.1]]

labels = ['

a', '

a', '

b', '

b']

group中有四組資料,每組資料有兩個屬性或者特徵值,labels包含了資料點的標籤資訊

2.1.2 實施knn演算法

對未知類別屬性的資料集中的每個點依次執行以下操作:

計算已知類別資料集中的點與當前點之間的距離

按照距離遞增次序排序

選取與當前點距離最小的k個點

確定前k個點所在類別的出現頻率

返回前k個點出現頻率最高的類別作為當前點的**分類   

程式清單2-1 k-緊鄰演算法

def

classify0(inx,dataset,labels,k):

datasetsize = dataset.shape[0] #

取出dataset的shape

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

將inx轉換成與dataset相同形狀的陣列

sqdiffmat = diffmat**2sqdistances = sqdiffmat.sum(axis=1)

distances = sqdistances**0.5sorteddistindicies = distances.argsort() #

argsort()函式用法:從小到大排序,取其索引值index輸出

#print(sorteddistindicies)

classcount ={}

for i in

range(k):

voteilabel =labels[sorteddistindicies[i]]

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

#print(classcount)

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

key=operator.itemgetter(1)意思是使用字典的第二個元素排序

return sortedclasscount[0][0]

classify0()函式的四個輸入引數:inx是待分類的輸入向量,dataset是已知屬性的樣本集,labels是標籤向量,k是選擇最近鄰居的數目。

import

knngroup,labels =knn.createdataset()

print('

group =

',group,'

\n','

labels =

',labels)

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

輸出結果:

group =  [[ 1.   1.1]

[ 1. 1. ]

[ 0. 0. ]

[ 0. 0.1]]

labels = ['

a', '

a', '

b', 'b'

]b

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

#print(classcount)

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

key=operator.itemgetter(1)意思是使用字典的第二個元素排序

return sortedclasscount[0][0]

分析資料:使用matplotlib畫二維擴散圖

訓練演算法:此步驟不適用於k-近鄰演算法

測試演算法:使用海倫提供的部分資料作為測試樣本。測試樣本和非測試樣本的區別在於:測試樣本是已經完成分類的資料,如果**分類與實際類別不同,則標記為乙個錯誤

使用演算法:產生簡單的命令列程式,然後海倫可以輸入一些特徵資料以判斷對方是否為自己喜歡的型別

2.2.1 準備資料從文字檔案中解析資料

我們獲得的文字是分類器不能識別的,所以我們要把它轉換成分類器可以識別的型別。在knn.py中建立名為file2matrix的函式,以此來處理文字資料格式的問題。該函式的輸入為檔名字串,輸出為訓練樣本矩陣和類標籤向量。

將下面**增加到knn.py中:

#

從文字檔案中解析資料

deffile2matrix(filename):

fr =open(filename)

arrayolines = fr.readlines() #

readlines()讀取檔案所有行,儲存在乙個list中,每行作為乙個元素

numberoflines = len(arrayolines) #

讀取檔案中元素數

returnmat = np.zeros((numberoflines,3)) #

建立返回的numpy矩陣

classlabelvextor =

index =0

for line in

arrayolines:

line = line.strip() #

移除字串頭尾指定的字元

listfromline = line.split('

\t') #

使用tab字元 \t 將上一步得到的整行資料分割成乙個元素列表

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

前三列儲存到特徵矩陣中

最後一列儲存到標籤矩陣中

index += 1

return returnmat,classlabelvextor

在另外乙個knn-1.py中:

datingdatamat,datinglabels = knn.file2matrix('

datingtestset2.txt')

print(datingdatamat,'

\n',datinglabels)

注意:使用函式file2matrix讀取檔案資料,必須確保資料集儲存到工作目錄下。

2.2.2 分析資料:使用matplotlib建立散點圖

import

matplotlib

import

matplotlib.pyplot as plt

import

numpy as np

fig =plt.figure()

ax = fig.add_subplot(111)

ax.scatter(datingdatamat[:,0],datingdatamat[:,1],15.0*np.array(datinglabels),15.0*np.array(datinglabels))

plt.show()

輸出效果如下圖:

2.2.3 準備資料:歸一化數值

posted @

2018-03-18 21:59

qamra 閱讀(

...)

編輯收藏

《機器學習實戰》讀書筆記

監督學習使用兩種型別的目標變數 之所以稱監督學習,是因為這類演算法必須知道 什麼,即目標變數的分類資訊 在無監督學習中,將資料集合分成由類似的物件組成的多個類的過程被稱為聚類 將尋找描述資料統計值的過程稱之為密度估計 是 否要 預測目標 變數的值 是 監督學習 目標變數型別 begin離散型 分類演...

機器學習實戰讀書筆記(三)

從本節開始,將介紹無監督學習。今天整理了無監督學習中的k均值聚類演算法和mapreduce部分的內容。本部分是8月24號的內容。9.k均值聚類演算法 1 k均值聚類演算法 優點 易於實現。缺點 可能收斂到區域性最小值,在大規模的資料集上的收斂速度慢。適用資料型別 數值型。可以用的誤差指標如誤差的平方...

機器學習讀書筆記

第一章 引言介紹一些常識引入什麼是機器學習,機器學習的一些術語資料,規律,泛化,假設空間歸納偏好。1,假設空間 假設空間 監督學習的目的在於學習乙個由輸入到輸出的對映,這一對映由模型來表示。換句話說,學習的目的就在於找到最好的這樣的模型。模型屬於由輸入空間到輸出空間的對映集合,這個集合就是假設空間 ...