k近鄰演算法(k-nearest neighbor,knn)是一種非常直觀的,易於理解的有監督的演算法:對於乙個待分類的樣本,在已知的樣本集合中尋
找與它距離最近的k個樣本,及所謂的k近鄰。通過這這k個近鄰的所述類別來決定分類結果。
距離度量距離度量方法有很多種,例如:歐式距離、曼哈頓距離、切比雪夫距離等等。
分類決策分類決策一般是通過投票決定,當然也可以根據具體情況再做改變。常見的改進方法如距離加權:賦予距離越近的樣本越大的權值。
k的選擇當k的取值很小時,決策易受到雜訊的干擾;同時模型複雜,也容易造成過擬合。
當k的取值很大時,決策邊緣會變得平滑,模型簡單,**結果容易出現錯誤。
通常採用交叉驗證來選去較好的k值。
計算距離:計算當前待分類樣本與所有已知樣本的距離
距離排序:將距離降序排序
投票分類:選擇k個近鄰,並根據其類別決定待分類樣本的類別。
讀取資料
import numpy as np
import pandas as pd
ori_data = pd.read_csv('iris.data',header=none)
處理資料
1.將標記對映為數字
label_map =
data = ori_data.replace(label_map)
2.歸一化
將資料歸一化到[a,b]之間的函式如下:
def normalization(a, b, array):
maxcols = array.max(axis=0)
mincols = array.min(axis=0)
trans_data = np.zeros(array.shape)
[m, n] = array.shape
for i in range(n):
k = (b-a)/(maxcols[i]-mincols[i])
trans_data[:, i] = a + k * (array[:, i]-mincols[i])
return trans_data
呼叫處理資料
data_array = np.array(data)
[data_num, feature_num] = data_array.shape
trans_data = normalization(0, 1, data_array[:, 0:feature_num-1])
label = data_array[:, feature_num-1].reshape(data_num, 1)
trans_data = np.hstack((trans_data, label)) #按列合併
全部**如下
import pandas as pd
import numpy as np
import math
import random
from scipy import stats
def normalization(a, b, array):
maxcols = array.max(axis=0)
mincols = array.min(axis=0)
trans_data = np.zeros(array.shape)
[m, n] = array.shape
for i in range(n):
k = (b-a)/(maxcols[i]-mincols[i])
trans_data[:, i] = a + k * (array[:, i]-mincols[i])
return trans_data
def dis(x1, x2):
return np.sqrt(np.sum(pow((x1 - x2), 2)))
#**樣本類別
def cla(x, train_x, train_y, k):
n = train_x.shape[0]
distance = np.zeros((n, 1))
for i in range(n):
x2 = train_x[i,:]
distance[i, 0] = dis(x, x2)
dis_and_y = np.hstack((distance, train_y))
index = np.argsort(dis_and_y[:, 0])
dis_and_y = dis_and_y[index]
list = dis_and_y[0:k,1]
a = stats.mode(list)[0] #計算眾數
return a[0]
#計算分類精度
def predict(train_data, test_data):
train_y = train_data[:, feature_num-1].reshape(train_data.shape[0], 1)
test_y = test_data[:, feature_num-1].reshape(test_data.shape[0], 1)
train_x = train_data[:, 0:feature_num-1]
test_x = test_data[:, 0:feature_num-1]
count = 0
for i in range(test_x.shape[0]):
y = cla(test_x[i, :], train_x, train_y, 10)
if y == test_y[i, 0]:
count = count + 1
return count/test_data.shape[0]
ori_data = pd.read_csv("iris.data", header=none)
label_map =
data = ori_data.replace(label_map) # 標記對映到1,2,3
data_array = np.array(data)
[data_num, feature_num] = data_array.shape
trans_data = normalization(0, 1, data_array[:, 0:feature_num-1])
label = data_array[:, feature_num-1].reshape(data_num, 1)
trans_data = np.hstack((trans_data, label)) #按列合併
for i in range(10):
#抽樣sl = random.sample(range(0, data_num), data_num//10)
test_data = trans_data[sl, :]
train_data = np.delete(trans_data, sl, axis=0)
prediction = predict(train_data, test_data)
print(prediction)
如有疑問,歡迎指出 k近鄰演算法 python實現
特徵距離計算 距離計算方法有很多,這裡先列三種 簡單例子 電影型別 根據歐氏距離計算公式,算出未知電影與已知電影型別之間的距離。電影名稱 打鬥鏡頭 接吻鏡頭 電影型別 歐式距離13 104愛情片 20.522 100愛情片 18.731 81愛情片 19.2 4101 10動作片 115.3599 ...
K近鄰演算法 python實現
k近鄰演算法 演算法原理 將資料轉換成向量形式 計算輸入向量與樣本中的距離 比如歐式距離等 對距離計算結果排序 取前k個 根據指定規則 多數或者按照一定權重進行計算 確定輸入向量類別。python實現 import numpy as np import operator class knnmetho...
python實現k 近鄰演算法
本文不涉及k 近鄰演算法的原理,只通過python 實現演算法,並且沒有用到機器學習庫,根據演算法流程一步一步實現。假設我們已經獲取了資料及其標籤的文字檔案,如下圖所示。資料有3個屬性,標籤分為3個型別,python讀取資料 讀取資料並記錄 defreadfile filename file ope...