#(本人開發工具為pycharm,python版本是3.5)
第二章 knn
2.1 概述
k-緊鄰演算法的一般流程:
收集資料:可以使用任何方法
準備資料:距離計算所需要的數值,最好是結構化的資料格式
分子資料:可以使用任何方法
訓練資料:此步驟不適應於k-緊鄰演算法
測試資料:計算錯誤率
使用演算法:首先需要輸入樣本資料和結構化的輸出結果,然後執行k-緊鄰演算法判定輸入資料分別屬於哪個分類,最後應用對計算出的分類執行後續的處理
2.1.1 準備資料
建立名為knn.py的python模組
import在資料夾中建立另外乙個.py檔案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
import執行結果:knngroup,labels =knn.createdataset()
print('
group =
',group,'
\n','
labels =
',labels)
group = [[ 1. 1.1]group中有四組資料,每組資料有兩個屬性或者特徵值,labels包含了資料點的標籤資訊[ 1. 1. ]
[ 0. 0. ]
[ 0. 0.1]]
labels = ['
a', '
a', '
b', '
b']
2.1.2 實施knn演算法
對未知類別屬性的資料集中的每個點依次執行以下操作:
計算已知類別資料集中的點與當前點之間的距離
按照距離遞增次序排序
選取與當前點距離最小的k個點
確定前k個點所在類別的出現頻率
返回前k個點出現頻率最高的類別作為當前點的**分類
程式清單2-1 k-緊鄰演算法
defclassify0()函式的四個輸入引數:inx是待分類的輸入向量,dataset是已知屬性的樣本集,labels是標籤向量,k是選擇最近鄰居的數目。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]
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分析資料:使用matplotlib畫二維擴散圖#print(classcount)
sortedclasscount = sorted(classcount.items(),key = operator.itemgetter(1),reverse=true) #
key=operator.itemgetter(1)意思是使用字典的第二個元素排序
return sortedclasscount[0][0]
訓練演算法:此步驟不適用於k-近鄰演算法
測試演算法:使用海倫提供的部分資料作為測試樣本。測試樣本和非測試樣本的區別在於:測試樣本是已經完成分類的資料,如果**分類與實際類別不同,則標記為乙個錯誤
使用演算法:產生簡單的命令列程式,然後海倫可以輸入一些特徵資料以判斷對方是否為自己喜歡的型別
2.2.1 準備資料從文字檔案中解析資料
我們獲得的文字是分類器不能識別的,所以我們要把它轉換成分類器可以識別的型別。在knn.py中建立名為file2matrix的函式,以此來處理文字資料格式的問題。該函式的輸入為檔名字串,輸出為訓練樣本矩陣和類標籤向量。
將下面**增加到knn.py中:
#在另外乙個knn-1.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
datingdatamat,datinglabels = knn.file2matrix('注意:使用函式file2matrix讀取檔案資料,必須確保資料集儲存到工作目錄下。datingtestset2.txt')
print(datingdatamat,'
\n',datinglabels)
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,假設空間 假設空間 監督學習的目的在於學習乙個由輸入到輸出的對映,這一對映由模型來表示。換句話說,學習的目的就在於找到最好的這樣的模型。模型屬於由輸入空間到輸出空間的對映集合,這個集合就是假設空間 ...