2.1 概述
1) k-近鄰演算法採用測量不同特徵值之間 距離 的辦法進行分類。
優點:精度高、對異常值不敏感、無資料輸入假定;泛化錯誤率不超過不超過貝葉斯最優分類的兩倍。
缺點:計算複雜度高、空間複雜度高
適用範圍: 數值型 和 標稱型
2)k-近鄰演算法原理:
1. 已知 訓練樣本集 和 樣本集中資料的標籤。
2. 輸入 沒有標籤的 資料集 並將 新資料集中的資料的特徵 與 訓練集 的 特徵 進行比較
3 演算法提取最接近資料集的樣本集的標籤。
3) python演算法實現(py3.6)
#coding:utf-8#準備
#使用python匯入資料
#匯入科學計算包numpy 和 運算子模組
#createdataset 建立資料集 和 標籤
from numpy import *
import
operator
defcreatedataset():
group = array([[1.0,0.9], [1.1,0.8],[0.2,0.3],[0,0]])
labels = ('
a','
a','
b','b'
)
return group,labels
驗證模板是否建立成功
#在cmd中輸入以下**驗證上述模組是否插入成功>>>import
knn>>>group,labels =knn.createdataset()
>>>group
array([[1. , 0.9],
[1.1, 0.8],
[0.2, 0.3],
[0. , 0. ]])
>>>labels('
a', '
a', '
b', '
b')
程式清單2-1 k-近鄰演算法
#程式清單2-1
#k-近鄰演算法
#分類**
#四個引數的意義:
#inx:用來分類的測試集
#dataset : 用來訓練的資料集屬性
#labels: 用來分類的資料集標籤
#k: k-近鄰演算法的k,表示選取k個有效數
defclassify0 (inx, dataset, labels, k):
#shape[0], 返回data的行數 0- 按0維變化方向shape[i]
datasetsize =dataset.shape[0]
#tile函式實現矩陣重複,在列方向重複1次,行方向重複datasetsize次;
#對應值相減存放在 列表 diffmat中
diffmat = tile(inx, (datasetsize,1)) -dataset
#平方sqdiffmat = diffmat ** 2
#sum求和,axis = 1為按1即維變化方向操作sum[j],axis = 0 為按0維方向操作sum[i]
sqdistances = sqdiffmat.sum(axis=1)
#開方distances = sqdistances ** 0.5
#distances.argsort(),將distances中元素即距離,從小到大排序,並返回索引值,存放在sorteddistindicies
sorteddistindicies =distances.argsort()
#建立乙個空字典
classcount ={}
for i in
range(k):
#返回距離排名第i的標籤
voteilabel =labels[sorteddistindicies[i]]
# 用字典記錄 鍵(標籤)出現的 次數
#dict.get(key,default= none),字典中 get() 返回字典中指定 鍵 的 值
#dict.get() 若字典中沒有該標籤則建立並將其值置為1,若已有標籤則返回其值並將值加1
#如果 key不在字典中,則返回預設值default的值
classcount[voteilabel] = classcount.get(voteilabel, 0) + 1
#將 classcount 中的值進行排序
#sorted(iterable,cmp= none,key = none,reverse = false)
#iterable 待排序的可迭代型別的容器
#cmp:用於比較函式;key = operator,itemgetter(1)根據字典的值進行排序
#key=operator.itemgetter(1)根據字典的鍵進行排序
#reverse = true 降序 or reverse = false 公升序|(預設)
sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true)
#返回要分類的類別的標籤
return sortedclasscount[0][0]
程式清單 2-2 將文字程式轉化為numpy的解析程式
#2.2.1
#準備資料:從文字中解析資料
#程式清單2-2
#將文字記錄轉化為numpy的解析程式
deffile2matrix(filename):
#開啟檔案
fr =open(filename)
#readlines()方法用於讀取所有行(直到結束符 eof)並返回 列表 ;如果碰到結束符 eof 則返回 空字串
arrayolines =fr.readlines()
#返回檔案行數
numberoflines =len(arrayolines)
#建立返回特定形狀的以0填充的 numpy 矩陣(n 行 * 每行 m 列)
returnmat = zeros((numberoflines, 3))
#建立空列表 儲存標籤
classlabelvector =
index =0
for line in
arrayolines:
#去掉字串前後的空格
line =line.strip()
#split() 通過指定 分隔符("\t") 對字串進行切片,如果引數 num 有指定值,則僅分隔 num 個子字串
listfromline = line.split("\t"
)
#填充 returnmat 用切片好的 listfromlines
returnmat[index, :] = listfromline[0:3]
#將 listfromlines 中的標籤輸入字典 classlabelvetor 中
index += 1
return returnmat, classlabelvector
2.2.3 歸一化數值
當資料集和樣本集中的 某乙個屬性的 數值差值過大時 會影響 到各個屬性的權重值。所以採用歸一化的方法來解決這個問題。
公式: newvalue = (oldvalue - min) / (max - min)
#2.2.3
#資料歸一化
defautonorm(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))
normdataset = normdataset / tile(ranges, (m,1))
return normdataset, ranges, minvals
遇到的一些問題
knn 模板路徑問題 :1.可以直接放在 python.exe 所在的資料夾 如我的是 c:\anaconda3
2.如上使用 import sys 方法
datingtestset.txt 路徑問題 : 1. 引用時使用絕對路徑 2.命名為 datingtestset 而不是 datingtestset.txt
k 近鄰演算法
此文章參考機器學習實戰一書,具體的理論知識可以參考該書。本文的初衷只是為了做乙個複習,將學過的知識加以整理,其中不免有一定的錯誤。2.k 近鄰演算法的原理介紹 k 近鄰演算法通過測量不同的特徵值之間的距離進行分類。它的工作原理如下 存在乙個樣本的資料集合,也成為訓練樣本集合。並且樣本集中的每個資料都...
K 近鄰演算法
k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入...
K 近鄰演算法
首先,我們將 k 近鄰演算法的基本理論 其次我們將使用python從文字檔案中匯入並解析資料 再次,討論當存在許多資料 的時,如何避免計算距離時可能碰到的一些常見錯誤 最後,利用實際的例子講解如何使用k 近鄰演算法改進約會 1.1 knn演算法 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且...