k最近鄰(k-nearest neighbor,knn)分類演算法可以說是最簡單的機器學習演算法了。它屬於監督學習的一種。它採用測量不同特徵值之間的距離方法進行分類。它的思想很簡單:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。
上圖中要確定測試樣本綠色屬於藍色還是紅色。
顯然,當k=3時,將以1:2的投票結果分類於紅色;而k=5時,將以3:2的投票結果分類於藍色。
k-近鄰演算法的具體思想如下:
(1)計算已知類別資料集中的點與當前點之間的距離
(2)按照距離遞增次序排序
(3)選取與當前點距離最小的k個點
(4)確定前k個點所在類別的出現頻率
(5)返回前k個點中出現頻率最高的類別作為當前點的**分類
這裡所說的距離,一般最常用的就是多維空間的
歐式距離
。這裡的維度指
特徵維度
,即樣本有幾個特徵就屬於幾維。
1計算歐式距離
import math
def computer_euclid_distance(x1,y1,x2,y2):
d=math.sqrt(math.pow((x1-x2),2)+math.pow((y1-y2),2))
return d
##pow(x,y) 計算x的y次方 即,x^y
computer_euclid_distance(2,4,5,6) 結果是:3.605551275463989
2.鳶尾花資料擬合
from sklearn import neighbors
from sklearn import datasets
import numpy as np
knn=neighbors.kneighborsclassifier()
iris=datasets.load_iris()#匯入鳶尾花資料庫
print(iris)
knn.fit(iris.data,iris.target) # 利用函式擬合
predictde_lable=knn.predict(np.array([0.1,0.2,0.3,0.4]).reshape(1,-1)) ##輸入點集**
print(predictde_lable)
結果是[0]
3.knn聚類方法
import numpy as np
import matplotlib.pyplot as plt
import operator
def createdataset():
group = np.array([[2, 5], [3, 6], [1, 7], [6, 8]]) ##建立資料集 第一二個點是一類,後兩個點是一類
labels = [1,1,0,0]
return group, labels
def classify(target_plot, dataset, labels, k):
"""
target_plot 是輸入的測試樣本,是乙個[x, y]樣式的
dataset 是訓練樣本集
labels 是訓練樣本標籤
是top k最相近的
"""# shape返回矩陣的[行數,列數],
# 那麼shape[0]獲取資料集的行數,
# 行數就是樣本的數量
datasetsize = dataset.shape[0]
"""下面的求距離過程就是按照歐氏距離的公式計算的。
即 根號(x^2+y^2)
"""#
diffmat = np.tile(target_plot, (datasetsize, 1)) - dataset
sqdiffmat = diffmat ** 2
sqdistance = sqdiffmat.sum(axis=1)
distance = sqdistance ** 0.5
sorteddistindicies =distance.argsort()
# 存放最終的分類結果及相應的結果投票數
從圖中可以看出,藍色圓點屬於第二類,紅色的點屬於第一類,黑色 的點是目標點,屬於第一類。
幾點說明:
1.tile函式
tile屬於numpy模組下邊的函式tile(a, reps)返回乙個shape=reps的矩陣,矩陣的每個元素是a
比如 a=[0,1,2] 那麼,tile(a, 2)= [0, 1, 2, 0, 1, 2]
tile(a,(2,2)) = [[0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2]]
tile(target,(4,1))array([[1, 1],
[1, 1],
[1, 1],
[1, 1]])
diffmat = np.tile(target_plot, (datasetsize, 1)) - dataset
print(diffmat)
[[-1 -4]
[-2 -5]
[ 0 -6]
[-5 -7]]
sqdiffmat = diffmat ** 2
print(sqdiffmat)
sqdistance = sqdiffmat.sum(axis=1)
distance = sqdistance ** 0.5
axis=1表示按照橫軸,sum表示累加,即按照行進行累加。[[ 1 16]
[ 4 25]
[ 0 36]
[25 49]]
sorteddistindicies =distance.argsort()
按照公升序進行快速排序,返回的是原陣列的下標。# 投票過程,就是統計前k個最近的樣本所屬類別包含的樣本個數比如,x = [30, 10, 20, 40]
公升序排序後應該是[10,20,30,40],他們的原下標是[1,2,0,3]
那麼,numpy.argsort(x) = [1, 2, 0, 3]
for i in range(k):
# index = sorteddistindicies[i]是第i個最相近的樣本下標
# voteilabel = labels[index]是樣本index對應的分類結果('1' or '2')
voteilabel = labels[sorteddistindicies[i]]
# classcount.get(voteilabel, 0)返回voteilabel的值,如果不存在,則返回0
# 然後將票數增1
classcount[voteilabel] = classcount.get(voteilabel, 0) + 1
# 把分類結果進行排序,然後返回得票數最多的分類結果
sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true)
return sortedclasscount[0][0]
參考:
knn人臉識別判斷 機器學習概念及KNN演算法
這一周主要是圍繞兩個主題來展開,乙個是機器學習的基本概念和knn演算法的基本邏輯。我們先來談談機器學習方面。機器學習的概念與用途及分類。1.概念,主要區分兩個對比,主要參考兩個圖,但是這個兩個概念之間沒有明顯的界限,有時候會互相影響。機器學習v.s.人工智慧v.s.深度學習 機器學習v.s.資料探勘...
機器學習實戰(一) KNN
knn演算法本身簡單有效,它是一種lazy learning演算法,分類器不需要使用訓練集進行訓練,訓練時間複雜度為0。knn分類的計算複雜度和訓練集中的文件數目成正比,也就是說,如果訓練集中文件總數為n,那麼knn的分類時間複雜度為o n knn演算法不僅可以用於分類,還可以用於回歸。通過找出乙個...
機器學習 KNN演算法(一)
k近鄰 k nearest neighbor,k nn 1968年提出了最初的鄰近演算法 是一種基於分類和回歸的演算法 基於例項的學習 懶惰學習 演算法思想 給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的k個訓練樣本,然後基於這k個鄰居的資訊來 通常,在分類任務中,可使用 投票法 即選擇這k...