knn演算法是資料分析中的一種常用方法。
本文對knn演算法的原理進行簡要說明,並給出具體的應用示例。
knn演算法根據樣本之間的距離,進行類別的劃分。
樣本間的距離可以使用歐氏距離
d =∑
i=1n
(xi−
yi)2
d = \sqrt^n(x_i - y_i)^2}
d=i=1∑
n(x
i−y
i)2
進行計算時,需要首先設定乙個鄰居數k=n。演算法會判斷距離選定樣本值最近的n個樣本值,分別計算他們與選定樣本之間的距離,然後判斷選定樣本應該屬於哪一類。
癌症資料是資料分析中常用的一大類資料集,因為癌症資料的結果一般只有兩類:惡性和良性。但是樣本中的屬性卻很充足,所以很適合使用資料分析的形式來給出**結果。
匯入資料集
import numpy as np
import pandas as pd
from sklearn.neighbors import kneighborsclassifier
from sklearn.model_selection import train_test_split
# 讀取檔案中的資料
data = pd.read_csv(
'./cancer.csv'
,sep =
'\t'
)# x為樣本資料,y為診斷結果
y = data[
'diagnosis'
]x = data.iloc[:,2:]
結果示例為
資料清理
對資料進行歸一化處理,以確保每個特徵值都被分類器考慮。歸一化的方法有:
1)最大值最小值歸一化
x no
rmal
izat
ion=
x−mi
nmax
−min
x_ = \frac
xnorma
liza
tion
=ma
x−mi
nx−m
in
2)z-score歸一化
x no
rmal
izat
ion=
x−μσ
x_ = \frac
xnorma
liza
tion
=σx
−μ
其中,μ是均值,σ是標準差
3)sigmoid歸一化
x no
rmal
izat
ion=
11+e
−xx_ = \frac}
xnorma
liza
tion
=1+
e−x1
我們分別使用三種歸一化方式進行處理,然後檢視knn演算法的準確率。
# 1.最大值最小值歸一化
x1 =
(x - x.
min())
/(x.
max(
)- x.
min())
# score為演算法的準確率
score =
0# 取1000次準確率的均值作為最終結果
for i in
range
(1000):
# 劃分訓練資料和測試資料
x_train,x_test,y_train,y_test = train_test_split(x1,y)
knn = kneighborsclassifier(
) knn.fit(x_train,y_train)
score += knn.score(x_test,y_test)
/1000
print
('使用最大值最小值歸一化的準確率為'
,score)
# 2.z-score歸一化
x2 =
(x - x.mean())
/x.std(
)score =
0for i in
range
(1000):
x_train,x_test,y_train,y_test = train_test_split(x2,y)
knn = kneighborsclassifier(
) knn.fit(x_train,y_train)
score += knn.score(x_test,y_test)
/1000
print
('使用z-score歸一化的準確率為'
,score)
# 3.sigmoid歸一化
sigmoid =
lambda x :1/
(1+ np.e**
(-x)
)x3 = sigmoid(x)
score =
0for i in
range
(1000):
x_train,x_test,y_train,y_test = train_test_split(x3,y)
knn = kneighborsclassifier(
) knn.fit(x_train,y_train)
score += knn.score(x_test,y_test)
/1000
print
('使用sigmoid歸一化的準確率為'
,score)
結果為:
對比三種歸一化的結果,可以看到使用sigmoid歸一化可能不太適合處理本例中的資料集。
KNN 演算法的例項應用
為了提高給 helen 女士匹配約會物件的成功率,收集了各位男士的以下三種資訊 每年的飛行里程數 玩遊戲所耗時間百分比 每週消費的冰淇淋公升數 約會資料 datingtestset.txt 先看一下資料集的內容 這裡擷取了三行,前三列分別是每年的飛行里程數 玩遊戲所耗時間百分比和每週消費的冰淇淋公升...
k 近鄰 KNN 演算法的應用
from numpy import from os import listdir import operator defclassify0 inx,dataset,labels,k datasetsize dataset.shape 0 diffmat tile inx,datasetsize,1 ...
手寫數字識別 KNN演算法的應用
訓練之後,即可識別手寫數字如下 我用windows自帶的畫板畫的,可能有點醜,見諒 等等執行在自己安裝好jupyter的伺服器上,安裝可以參考 在centos上安裝jupyter notebook 支援外網訪問 一定要保證路徑正確,如果不希望做任何修改的話,請保證相對路徑如下 此python檔案 如...