機器學習 k 近鄰演算法(kNN)

2021-09-29 12:34:15 字數 4578 閱讀 4001

from numpy import

*import operator

##從文字中提取資訊

deffilemat

(filename)

:file

=open

(filename)

lines =

file

.readlines(

) lines_number =

len(lines)

#建立乙個與文字相同行,相同列的零矩陣

#列需要事前確定

zeromat = zeros(

(lines_number,3)

)#空字典作為類別

class_label =

index =

0#提取檔案資料

for line in lines:

line = line.strip(

) line_list = line

list1 = line.split(

'\t'

)#用檔案中的資料替換零矩陣和空類別

zeromat[index,:]

= list1[0:

3]-1

])index+=

1return zeromat,class_label

## 歸一化方法:(x-min)/range

defauto_norm

(dataset)

:# 選取每一列的最大最小值

min_value = dataset.

min(0)

max_value = dataset.

max(0)

ranges = max_value - min_value

# 形成乙個與資料集相同的零矩陣

norm_dataset = zeros(shape(dataset)

) shape0 = dataset.shape[0]

# 得到當前值與最小值的差值矩陣

norm_dataset = dataset - tile(min_value,

(shape0,1)

) norm_dataset = norm_dataset/tile(ranges,

(shape0,1)

)return norm_dataset,ranges,min_value

## 歐氏距離分類(注意需不需要事先將x歸一化)

defclassify

(x,dataset,labels,k)

:# shape函式的功能是讀取矩陣的維度

# shape[0]代表一維中的元素數,二維中的行數

datasetsize = dataset.shape[0]

# 建立x與所有點的距離陣列

diffmat = tile(x,

(datasetsize,1)

)-dataset

sqdiffmat = diffmat**

2 sqdistances = sqdiffmat.

sum(axis=1)

distances = sqdistances **

0.5#從小到大排列所有點與x的距離

sortdisindex = distances.argsort(

)#列表

classcount=

#選擇前k個距離最近的點並統計這k個點的類別次數

for i in

range

(k):

klabel = labels[sortdisindex[i]

] classcount[klabel]

= classcount.get(klabel,0)

+1#將k個點的類別出現次數進行排序,取最高出現次數的類別

sortclasscount =

sorted

(classcount.items(

),key=operator.itemgetter(1)

,reverse=

true

)# 返回分類結果

return sortclasscount[0]

[0]## 檢測分類器錯誤率(自分類為測試集和訓練集)

defclassify_test

(data_mat,data_labels,ratio=

0.1)

: line_num = data_mat.shape[0]

test_num =

int(ratio*line_num)

error_count =

0.0for i in

range

(test_num)

: classify_result = classify(data_mat[i,:]

,data_mat[test_num:line_num,:]

,\ data_labels[test_num:line_num]

,k=3)if

(classify_result != data_labels[i]

): error_count+=

1 error_rate =

float

(error_count)/(

float

(test_num)

)return error_rate

from os import listdir

import numpy as np

import operator

import knn

## 讀取檔案

defimagex

(filename)

: f =

open

(filename)

# 形成乙個1024維的行向量

return_vector = zeros((1

,1024))

for i in

range(32

):line_str = f.readline(

)for j in

range(32

):return_vector[0,

32*i+j]

=int

(line_str[j]

)return return_vector

defhandwritingtest()

: hwlabels=

# 將資料夾下所有檔名提出,需要與**在同一資料夾

training_list = listdir(

'trainingdigits'

) test_list = listdir(

'testdigits'

) train_num =

len(training_list)

test_num =

len(test_list)

train_mat = zeros(

(train_num,

1024))

# 訓練集—將所有檔案中的資料放入乙個numpy陣列

for i in

range

(train_num)

: filename = training_list[i]

file

= filename.split(

'.')[0

] class_number =

int(

file

.split(

'_')[0

])train_mat[i,:]

= imagex(

'trainingdigits/%s'

%filename)

error_count0 =

0.0# 測試集進行測試

for i in

range

(test_num)

: filename = test_list[i]

file

= filename.split(

'.')[0

] class_number =

int(

file

.split(

'_')[0

])test_vector = imagex(

'testdigits/%s'

%filename)

class_result = classify(test_vector,train_mat,hwlabels,k=3)

if(class_result != class_number)

:error_count0+=

1 error_rate =

float

(error_count0)/(

float

(test_num)

)return error_rate

if __name__==

"__main__"

: rate = handwritingtest(

)print

(rate)

機器學習 k 近鄰 kNN 演算法

一 基本原理 存在乙個樣本資料集合 也稱訓練樣本集 並且樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料 最近鄰 的分類標籤。我們一般只選擇樣本集中前k k通常是不大於20的整數 個最相似的資料,最後選擇k個...

機器學習 k近鄰演算法 kNN

knn演算法通過計算當前測試樣本與離它最近的k個點的距離,進行投票,得到它最有可能的分類結果。首先來看看機器學習演算法的基本流程 由此可見knn演算法的特點 1.k近鄰演算法是非常特殊的,可以認為是沒有模型的演算法。2.為了和其他演算法統一,可以認為訓練資料集就是模型本身。這也是scikit lea...

機器學習 k 近鄰演算法(KNN)

簡單地說,k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定。缺點 計算複雜度高 空間複雜度高。適用範圍 數值型和標稱型。對於該演算法更通俗的說法,拿到乙個資料a,計算其與資料集c中的資料的距離,通過使用特徵值進行求歐式距離。然後排序取出其前k相鄰的...