Python機器學習基礎(一)K 近鄰演算法

2021-10-04 20:44:08 字數 3989 閱讀 1060

k近鄰演算法是一種有監督的分類演算法,利用有標籤的資料集(帶有不同的標籤),在樣本空間預先生成一些樣本點,在進行測試時,新輸入的樣本點根據它所在周圍的k個樣本點,標籤數出現次數最多的,作為新輸入的樣本點的標籤類別,以此對輸入的資料進行分類。

在這裡通過定義k近鄰的類來實現整體的演算法

# -*- coding: utf-8 -*-

"""created on keke tang 28 18:00:18 2020

@author: 5066

"""import numpy as np

import matplotlib.pyplot as plt

from math import

*class

knn:

#類的初始化引數,這裡定義四個標籤資料集

def__init__

(self,data_x0,data_x1,data_x2,data_x3)

:

self.x = data_x0

self.y = data_x1

self.z = data_x2

self.w = data_x3

pass

#訓練過程也比較簡單,就是顯示最初的標籤引數空間

deftrain

(self)

:

plt.scatter(self.x[:,

0],self.x[:,

1],100

,'r'

) plt.scatter(self.y[:,

0],self.y[:,

1],100

,'b'

) plt.scatter(self.z[:,

0],self.z[:,

1],100

,'y'

) plt.scatter(self.w[:,

0],self.w[:,

1],100

,'g'

) plt.grid(b=1)

pass

'''

演算法的核心部分,將輸入的測試集按k近鄰演算法,完成分類

test_data為輸入測試資料(方便起見這裡僅設定乙個點),k為最近點的個數

'''defnearest

(self,test_data,k)

: self.train(

)#得到輸入點與空間樣本所有點的「距離」

x_distances =

([sqrt(np.

sum(

(x_train - test_data)**2

))for x_train in self.x]

) y_distances =

([sqrt(np.

sum(

(y_train - test_data)**2

))for y_train in self.y]

) z_distances =

([sqrt(np.

sum(

(z_train - test_data)**2

))for z_train in self.z]

) w_distances =

([sqrt(np.

sum(

(w_train - test_data)**2

))for w_train in self.w]

)#整合所有點的距離

full_distance = np.hstack(

(x_distances,y_distances,z_distances,w_distances)

) x_y_z_w0 =

['r'

,'b'

,'y'

,'g'

] x_y_z_w =[0

,0,0

,0]'''

以距離排序(從小到大)的前 k+1 個點作為參考樣本集

尋找其中種類最多的點,以它的標籤作為測試資料

'''for i in np.argsort(full_distance)

[:k+1]

: x_y_z_w[

int(

(i)/

len(x_distances))]

= x_y_z_w[

int(

(i)/

len(x_distances))]

+1#在樣本空間中得將新的點繪製出來

plt.scatter(test_data[0]

,test_data[1]

,160

,x_y_z_w0[np.argsort(x_y_z_w)[-

1]],

's')

plt.grid(b=

1)

生成訓練集

'''

形成訓練集,在這裡為了方便,將直角平面第一象限的

|(100,0) (100,100)|

|(0,0) (0,100) |

劃分出四塊區域

'''#單個資料集的樣本點個數

train_num =

50left = np.random.randint(1,

40,(train_num,1)

).astype(np.float32)

right = np.random.randint(60,

100,

(train_num,1)

).astype(np.float32)

up = np.random.randint(60,

100,

(train_num,1)

).astype(np.float32)

down = np.random.randint(1,

40,(train_num,1)

).astype(np.float32)

defgetdata

(data_x,data_y)

:return np.hstack(

(data_x,data_y)

)red = getdata(left, up)

blue = getdata(left, down)

yellow = getdata(right, up)

green = getdata(right, down)

生成資料集

#測試資料集樣本點個數

test_num =

50mindle = np.random.randint(40,

60,(test_num,1)

).astype(np.float32)

cross = np.random.randint(1,

100,

(test_num,1)

).astype(np.float32)

test0 = getdata(mindle,cross)

test1 = getdata(cross,mindle)

顯示訓練集以及測試資料集

a = knn(red,blue,yellow,green)

plt.show(

)for i in

range

(test_num)

: a.nearest(test0[i],4

) a.nearest(test1[i],4

)

plt.show(

)

訓練資料集顯示

訓練資料集

加入測試資料集,測試資料集為方塊

K近鄰 Python 機器學習

from numpy import 科學計算包 import operator 運算子模組 defcreatdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 建立資料集 labels a a b b 建立標籤 return group,labels inx,...

python與機器學習基礎(一)

機器學習是實現人工智慧的一種方法,簡單來說,機器學習就是使用演算法分析資料 需要我們自己找特徵值 從中學習並做出推斷或 與傳統的使用特定指令集手寫軟體不同,我們使用大量資料和演算法來 訓練 機器,由此帶來機器學習如何完成任務 深度學習 深度學習是一種特殊的機器學習,深度與機器最大區別是機器學習需要人...

機器學習與python實戰(一) k近鄰

knn k nearest neighbor 演算法是乙個簡單而經典的機器學習分類演算法,通過度量 待分類資料 和 類別已知的樣本 的距離對樣本進行分類。from numpy import import operator 產生資料集 defcreatedataset groups array 1.0...