水平有限,若有錯誤還請不吝賜教!
最近在學機器學習,因為python2跟python3的差距,所以,我選擇直接學習python3來完成對機器學習實戰的內容,此類部落格會持續更新
(等我完成本書內容,**會慢慢在github上更新)
接觸到第乙個演算法為k-近鄰演算法,其偽**如下:
1.計算已知類別資料集中的點與當前點之間的距離
2.按照距離遞增次序排列
3.選取與當前點距離最小的k個點
4.確定前k個點所在類別的出現頻率
5.返回k個點出現頻率最高的類別作為當前點的**分類
下面貼上knn.py**:
from numpy import *
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):
#此函式擁有4個輸入引數,inx表示分類的輸入向量,dataset表示輸入的訓練樣本集,labels為標籤向量,
#k表示用於選擇最近鄰的數目,其中標籤向量的元素數目與矩陣dataset的函行數相同。
datasetsize = dataset.shape[0]
diffmat = tile(inx,(datasetsize,1)) - dataset
sqdiffmat = diffmat**2
sqdistances =sqdiffmat.sum(axis=1)
distances = sqdistances**0.5
sorteddistindicies =distances.argsort()
classcount={}
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]
classcount[voteilabel] =classcount.get(voteilabel,0) +1
sortedclasscount =sorted(classcount.items(),
key=operator.itemgetter(1),reverse=true)
return sortedclasscount[0][0]
進入python命令提示符輸入
import knn
group,labels =knn.createdataset()
knn.classify0([0,0],group,labels,3)【輸出結果是b,可以改變[0,0]的值試試其他】
由於對python了解不多,在這裡說一下我對這些**的理解,加深自己學習python的印象
輸入向量的規格需要和測試資料集的相同,之後按步驟計算出距離之後,通過argsort()函式進行從小到大排序,確定k個距離最小元素所在的主要分類,輸入的k總是正整數
之後將classcount字典分解為元組列表,classcount.get(voteilabel,0)就是從字典裡面取值(votellabel相當於key),若有+1,若沒有返回0,也就是k個點所在的出現概率。
然後使用itemgetter(1)函式對第二個元素對元組進行排序。reverse=true表示逆序。最後返回發生頻率最高的元素標籤。
首先要做的是從文字檔案中解析資料,那麼新增以下**到knn.py,以此來處理輸入格式問題,該函式的輸入為檔名字串,輸出為訓練樣本矩陣和類標籤向量
def file2matrix(filename):
fr = open(filename)
arrayolines = fr.readlines()
numberoflines = len(arrayolines)
returnmat = zeros((numberoflines,3))
classlabelvector =
index =0
for line in arrayolines:
line = line.strip()
listfromline = line.split('\t')
returnmat[index,:] = listfromline[0:3]
index += 1
return returnmat,classlabelvector
python處理文字檔案非常容易,首先我們需要知道文字檔案有多少行,也就是開啟檔案,得到行數,然後建立以零填充的矩陣numpy
為了簡化處理,這裡講該矩陣的另一維度設定為固定值3.迴圈處理檔案中的每行資料,首先使用line.strip()擷取所有的回車字元,
然後使用\t將上一步得到的整行資料分割成乙個元素列表,接著選取前3個元素,儲存到特徵矩陣中。利用python的負索引(索引值為-1表示列表中的最後一列元素)
可以很方便的將列表最後一列儲存到向量classlabelvector中,需要注意的是我們必須明確地通知直譯器,告訴他列表
中儲存的元素值為整數,否則python會將這些元素當成字串處理
reload(knn)
datingdatamat,datinglabels = knn.file2matrix('檔名') 檔案必須存在在工作目錄中。
現在我們已經可以轉換成想要的格式了。那麼接下來就是了解資料的真實含義。
使用malplotlib來展示資料
import matplotlib
import matplotlib.pyplot as plt
fig =plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingdatamat[:,1],datingdatamat[:,2])
plt.show()
輸出結果使用datingdatamat矩陣的第二第三列資料。
由於沒有使用樣本分類的特徵值,所以,很難辨別資料,一般會採用色彩來標記不同樣本分類。
ax.scatter(datingdatamat[:,1],datingdatamat[:,2],15.0*array(datinglabels),15.0*array(datinglabels))
執行這行**,如果出現報錯,重新匯入numpy
from numy import *
之後 重新繪圖即可出現用色彩標記後的散點圖
plt.show()
機器學習實戰筆記一 Python3
程式清單2 1 k近鄰演算法 本筆記將主要注意力放在理解 上,所以大家看 中的注釋即可 個人程式注釋 python3 部分 改造 針對iteritems只支援python2的情況 from numpy import import operator 運算子模組 def createdataset gr...
機器學習實戰 Python3編譯存在的各種問題
第四章 問題1 程式清單4 5執行錯誤 gbk codec can t decode byte 0xae in position 199 illegal multibyte sequence 問題定位 wordlist textpares open email ham d.txt i encodin...
Python3《機器學習實戰》02 決策樹
執行平台 windows python版本 python3 ide anaconda3 決策樹 decision tree 的乙個重要任務就是為了理解資料中所蘊含的知識資訊,因此決策樹可以使用不熟悉的資料集合,並從中提取出一系列規則,這些機器根據資料集建立規則的過程,就是機器學習過程。決策樹是一種基...