機器學習 資料探勘 kNN分類器

2021-07-23 21:50:14 字數 4112 閱讀 1264

以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個點所在類別的出現頻率,...