python機器學習(一)KNN演算法

2021-08-15 18:04:11 字數 4258 閱讀 6440

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()

按照公升序進行快速排序,返回的是原陣列的下標。

比如,x = [30, 10, 20, 40]

公升序排序後應該是[10,20,30,40],他們的原下標是[1,2,0,3]

那麼,numpy.argsort(x) = [1, 2, 0, 3]

# 投票過程,就是統計前k個最近的樣本所屬類別包含的樣本個數

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...