k 近鄰演算法

2022-08-03 09:42:11 字數 4222 閱讀 1465

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演算法 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且...