二 k-近鄰演算法實戰之約會**配對效果判定
上一小結學習了簡單的k-近鄰演算法的實現方法,但是這並不是完整的k-近鄰演算法流程,k-近鄰演算法的一般流程:
收集資料:可以使用爬蟲進行資料的收集,也可以使用第三方提供的免費或收費的資料。一般來講,資料放在txt文字檔案中,按照一定的格式進行儲存,便於解析及處理。
準備資料:使用python解析、預處理資料。
分析資料:可以使用很多方法對資料進行分析,例如使用matplotlib將資料視覺化。
測試演算法:計算錯誤率。
使用演算法:錯誤率在可接受範圍內,就可以執行k-近鄰演算法進行分類。 已經了解了k-近鄰演算法的一般流程,下面開始進入實戰內容。
2.1 實戰背景
在將上述特徵資料輸入到分類器前,必須將待處理的資料的格式改變為分類器可以接收的格式。分類器接收的資料是什麼格式的?從上小結已經知道,要將資料分類兩部分,即特徵矩陣和對應的分類標籤向量。在knn_test02.py檔案中建立名為file2matrix的函式,以此來處理輸入格式問題。 將datingtestset.txt放到與knn_test02.py相同目錄下,編寫**如下:
# -*- coding: utf-8 -*-
import numpy as np
"""函式說明:開啟並解析檔案,對資料進行分類:1代表不喜歡,2代表魅力一般,3代表極具魅力
parameters:
filename - 檔名
returns:
returnmat - 特徵矩陣
classlabelvector - 分類label向量
"""def file2matrix(filename):
#開啟檔案
fr = open(filename)
#讀取檔案所有內容
arrayolines = fr.readlines()
#得到檔案行數
numberoflines = len(arrayolines)
#返回的numpy矩陣,解析完成的資料:numberoflines行,3列
returnmat = np.zeros((numberoflines,3))
#返回的分類標籤向量
classlabelvector =
#行的索引值
index = 0
for line in arrayolines:
#s.strip(rm),當rm空時,預設刪除空白符(包括'\n','\r','\t',' ')
line = line.strip()
#使用s.split(str="",num=string,cout(str))將字串根據'\t'分隔符進行切片。
listfromline = line.split('\t')
#將資料前三列提取出來,存放到returnmat的numpy矩陣中,也就是特徵矩陣
returnmat[index,:] = listfromline[0:3]
#根據文字中標記的喜歡的程度進行分類,1代表不喜歡,2代表魅力一般,3代表極具魅力
if listfromline[-1] == 'didntlike':
elif listfromline[-1] == 'smalldoses':
elif listfromline[-1] == 'largedoses':
index += 1
return returnmat, classlabelvector
"""函式說明:main函式
parameters:
無returns:
無modify:
2017-03-24
"""if __name__ == '__main__':
#開啟的檔名
filename = "datingtestset.txt"
#開啟並處理資料
演算法二 K 近鄰(KNN)演算法
k近鄰法 k nearest neighbor,k nn 是1967年由cover t和hart p提出的一種基本分類與回歸方法。它的工作原理是 存在乙個樣本資料集合,也稱作為訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新的...
k 近鄰演算法
此文章參考機器學習實戰一書,具體的理論知識可以參考該書。本文的初衷只是為了做乙個複習,將學過的知識加以整理,其中不免有一定的錯誤。2.k 近鄰演算法的原理介紹 k 近鄰演算法通過測量不同的特徵值之間的距離進行分類。它的工作原理如下 存在乙個樣本的資料集合,也成為訓練樣本集合。並且樣本集中的每個資料都...
K 近鄰演算法
k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入...