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相鄰的...