以kaggle練習賽digit recognizer為例
輸入:訓練資料集 t=
(x1,
labe
l1),
(x2,
labe
l2),
(x3,
labe
l3),
...,
(xn,
labe
ln)
其中,x
i 為例項的特徵向量,la
beli
為例項的類別
輸出:例項
x 的類別la
bel(1)根據給定的距離度量,計算例項
x 與訓練集
t中所有點的距離
(2)選出訓練集合
t 最近鄰的
k個點,根據分類決策規則(如多數表決),決定
x 所屬類別.當k=
1時,稱為最近鄰演算法,將訓練集中與
x 最臨近點的類別作為x的類
一般情況下,knn演算法會使用歐式距離.
設特徵空間
χ 是
n維實數向量空間rn
,xi,
xj∈χ
,xi=
(x1i
,x2i
,x3i
,...
xni)
t ,xj
=(x1
j,x2
j,x3
j,..
.xnj
)t,xi,
xj的l
p 距離定義為: lp
(xi,
xj)=
(∑|x
li−x
lj|p
)1p
這裡p≥1
.當p=2
時,稱為歐式距離;當p=
1 時,稱為曼哈頓距離.
**中歐式距離的計算轉化為 (x
i−yj
)2=x
2i+y
2j+2
xiyj
其中x2
i ,y2
j 可用numpy矩陣計算中的square函式計算,xi
yj為向量xi
,yj 的點乘,可用numpy矩陣計算中的dot函式計算,最後再進行求和(sum函式)即可.
(本人嘗試了先求差值再平方再求和以及上述的展開計算兩種方式,發現上述方式要比先求差值再平方再求和的方式要快)
#encoding:utf-8
import numpy as np
from collections import counter
import pandas as pd
#讀取檔案
train_data = np.array(pd.read_csv('train.csv', header=0))
test_data = np.array(pd.read_csv('test.csv', header=0))
x_train = train_data[:,1:len(train_data[0])]
y_train = train_data[:,0] #儲存訓練資料集的label
x_test = test_data
print train_data.shape, test_data.shape, len(train_data[0])
class
knn():
def__init__
(self):
pass
deftrain
(self, x, y):
self.x_train = x
self.y_train = y
#歐式距離的計算
defcompute_distance
(self, x):
dot_pro = np.dot(x, self.x_train.t)
sum_square_test = np.square(x).sum(axis=1)
sum_square_train = np.square(self.x_train).sum(axis=1)
dists = np.sqrt(-2 * dot_pro + sum_square_train + np.matrix(sum_square_test).t)
return dists
#knn
def******_knn
(self,x, k):
dists = self.compute_distance(x) #計算x與訓練集的歐式距離
num_test = x.shape[0]
y_pred = np.zeros(num_test)
for i in range(num_test):
k_close_y =
labels = self.y_train[np.argsort(dists[i, :])].flatten()
k_close_y = labels[:k] #取訓練集中與x最臨近前k個的元組的類別
c = counter(k_close_y)
y_pred[i] = c.most_common(1)[0][0]
return y_pred
#進行**
classifier = knn()
classifier.train(x_train, y_train)
k = 1
predictions =
for i in range(int(len(x_test)/2000)):
# predicts from i * batch_size to (i+1) * batch_size
print("computing batch " + str(i+1) + "/" + str(int(len(x_test)/2000)) + "...")
predts = classifier.******_knn(x_test[i * 2000:(i+1) * 2000], k)
predictions = predictions + list(predts)
outfile = open("results.csv", "w")
outfile.write("imageid,label\n")
for i in range(len(predictions)):
outfile.write(str(i+1) + "," + str(int(predictions[i])) + "\n")
outfile.close()
直接利用skleran包裡的knn求解,很方便,不過對於knn的中間過程並沒有表現,並不適合機器學習的初學者。
#encoding:utf-8
import numpy as np
from collections import counter
import pandas as pd
from sklearn import metrics
from sklearn.neighbors import kneighborsclassifier
traindata = np.array(pd.read_csv('train.csv', header = 0))
testdata = np.array(pd.read_csv('test.csv', header = 0))
model = kneighborsclassifier(n_neighbors=3)
x_traindata = traindata[:,1:traindata.shape[1]]
label_traindata = traindata[:,0]
model.fit(x_traindata,label_traindata)
pre = model.predict(testdata)
print pre
out_file = open("result.csv", "w")
out_file.write("imageid,label\n")
for i in range(len(pre)):
out_file.write(str(i+1) + "," + str(int(pre[i])) + "\n")
out_file.close()
資料探勘 分類演算法 KNN
knn k nearest neighbors k近鄰分類演算法 knn演算法從訓練集中找到和新資料最接近的k條記錄,然後根據他們的主要分類來決定新資料的類別。knn分類演算法是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表...
機器學習 K NN分類
一 定義 1 k nn分類全稱為k近鄰法 k nearest neighbor 是一種基本回歸與分類方法 給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最近的k個例項,這k個例項中多數例項屬於某一類,就把該輸入例項分為這一類。2 好比說,你周圍的同學大都是些好學生,你也會被認為是好學...
機器學習 K NN分類 回歸
k近鄰 從字面上理解,就是 近朱者赤,近墨者黑。和誰離得近和誰歸為一類。1 演算法原理 1 計算測試資料與各個訓練資料之間的距離,方法 閔可夫斯基距離 2 按照距離的遞增順序排序 3 選取距離最小的k個點 4 確定前k個點所在類別的出現頻率 即為各個類別出現次數 5 返回前k個點所在類別的出現頻率,...