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