機器學習 手寫數字識別(KNN 決策樹)

2021-09-08 21:44:36 字數 3787 閱讀 2227

knn 及決策樹演算法為監督學習中的兩種簡單演算法。

knn演算法(鄰近演算法)的核心思想是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。

歐式距離的計算公式:

假設每個樣本有兩個特徵值,如 a :(a1,b1)b:(a2,b2) 則ab的歐式距離為

d =(

a1−a

2)2+

(b1−

b2)2

d=\sqrt

d=(a1−

a2)2

+(b1

−b2)

2​例如:根據消費分配來**性格

已知張三美食消費為110、衣服消費為190、文具消費為30,張三的性格為活潑。…

根據前3個樣本我們算出歐式距離

d =(

110−90)

2+(190

−100)2

+(140−30)

2=143d=\sqrt=143

d=(110

−90)

2+(1

90−1

00)2

+(14

0−30

)2​=

143d=(

90−30)

2+(100

−100)2

+(200−

140)2=

26d=\sqrt=26

d=(90−

30)2

+(10

0−10

0)2+

(200

−140

)2​=

26d =(

90−88)

2+(200

−100)2

+(140−24)

2=153d=\sqrt=153

d=(90−

88)2

+(20

0−10

0)2+

(140

−24)

2​=1

53…尋找d的最近鄰居為143和153,推測出劉二的性格為活潑

決策樹是一種樹形結構,其中每個內部節點表示乙個屬性上的測試,每個分支代表乙個測試輸出,每個葉節點代表一種類別。

每個決策樹都表述了一種樹型結構,它由它的分支來對該型別的物件依靠屬性進行分類。每個決策樹可以依靠對源資料庫的分割進行資料測試。這個過程可以遞迴式的對樹進行修剪。 當不能再進行分割或乙個單獨的類可以被應用於某一分支時,遞迴過程就完成了。

%matplotlib inline

import numpy as np

import matplotlib.pyplot as plt

from sklearn.neighbors import kneighborsclassifier

from sklearn.tree import decisiontreeclassifier

from sklearn.linear_model import logisticregression

from ipython.display import display

x =

y =

for i in range(0,10):

for j in range(1,701):

digit = plt.imread('./database/%d/1 (%d).bmp'%(i,j))

x = np.array(x)

y = np.array(y)

x.shape

index = np.random.randint(0,7000,size=1)[0]

digit = x[index]

plt.figure(figsize=(1,1))

plt.imshow(digit,cmap='gray')

print("true:%d"%(y[index]))

from sklearn.model_selection import train_test_split

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.1)

x_train.shape

knn = kneighborsclassifier(n_neighbors=5)

knn.fit(x_train.reshape([6300,28*28]),y_train)

knn.score(x_test.reshape([-1,28*28]),y_test)

y_ = knn.predict(x_test.reshape([-1,28*28]))

display(y_[:20],y_test[:20])

x.reshape(7000,-1).shape

#knn演算法實現**

plt.figure(figsize=(10*1,10*1.5))

for i in range(100):

axes = plt.subplot(10,10,i+1)

axes.imshow(x_test[i],cmap='gray')

t = y_test[i]

p = y_[i]

axes.set_title('true:%d\npred:%d'%(t,p))

axes.axis('off')

#決策樹實現**

##深度為50

plt.figure(figsize=(10*1,10*1.5))

for i in range(100):

axes = plt.subplot(10,10,i+1)

axes.imshow(x_test[i],cmap='gray')

t = y_test[i]

p = y_[i]

axes.set_title('true:%d\npred:%d'%(t,p))

axes.axis('off')

tree = decisiontreeclassifier(max_depth=50)

tree.fit(x_train.reshape(6300,-1),y_train)

y_ = tree.predict(x_test.reshape([-1,28*28]))

tree.score(x_test.reshape([-1,28*28]),y_test)

##深度為150

plt.figure(figsize=(10*1,10*1.5))

for i in range(100):

axes = plt.subplot(10,10,i+1)

axes.imshow(x_test[i],cmap='gray')

t = y_test[i]

p = y_[i]

axes.set_title('true:%d\npred:%d'%(t,p))

axes.axis('off')

tree = decisiontreeclassifier(max_depth=150)

tree.fit(x_train.reshape(6300,-1),y_train)

y_ = tree.predict(x_test.reshape([-1,28*28]))

tree.score(x_test.reshape([-1,28*28]),y_test)

機器學習(二) kNN手寫數字識別

一 knn演算法 1 knn演算法是機器學習的入門演算法,其中不涉及訓練,主要思想是計算待測點和參照點的距離,選取距離較近的參照點的類別作為待測點的的類別。2,距離可以是歐式距離,夾角余弦距離等等。3,k值不能選擇太大或太小,k值含義,是最後選取距離最近的前k個參照點的類標,統計次數最多的記為待測點...

機器學習案例 基於KNN手寫數字識別

演算法介紹 之前已經介紹過,簡單來說,k nn可以看成 有那麼一堆你已經知道分類的資料,然後當乙個新資料進入的時候,就開始跟訓練資料裡的每個點求距離,然後挑離這個訓練資料最近的k個點看看這幾個點屬於什麼型別,然後用少數服從多數的原則,給新資料歸類。演算法步驟 演算法步驟 step.1 初始化距離為最...

機器學習基礎 KNN實現手寫數字識別

k 近鄰演算法是一種監督機器學習分類演算法。它的思想很簡單,計算測試點與樣本集合之間的歐幾里得距離 直線距離 找到測試點與樣本集合中距離最近的k個樣本集,這k個樣本集合中對應的最多的分類就可以作為測試點的分類。本文使用的資料集,解壓後的testdigits資料夾為測試檔案,trainingdigit...