首先初始化資料
def createdataset():
group = np.array([[1.0, 1.1], [1.0, 1.0], [0.0,0.0], [0.0,0.1]])
labels = ['a', 'a', 'b', 'b']
return group, labels
然後實現分類,定義方法classify0
def classify0(inx, dataset, labels, k):
inx:**點
dataset:樣本點
labels:樣本標籤
k:選擇最近鄰居數量
datasetsize = dataset.shape[0]
獲取樣本行數。
然後計算**點和樣本點的距離
diffmat = np.tile(inx, (datasetsize, 1)) - dataset
sqdiffmat = diffmat ** 2
sqdistances = sqdiffmat.sum(axis=1)
distances = sqdistances ** 0.5
首先將樣本擴充套件成shape=(datasetsize, 1)的矩陣。舉個栗子,我們的**點是(0, 1),我們樣本的行數是4,name最後np.tile之後的結果就是
[[0, 1]
[0, 1]
[0, 1]
[0, 1]]
然後是矩陣的減法(不知道怎麼在這裡插入數學公式,只能意思一下)
np.array([[0, 1], [0, 1], [0, 1], [0, 1]])-np.array([[1.0, 1.1], [1.0, 1.0], [0.0,0.0], [0.0,0.1]]) = np.array([[-1.0, -0.1], [-1.0, 0], [0.0, 1.0], [0.0,1.0]])
在對昨晚差值的矩陣做平方和,計算出來的結果在做開根號,也就是我們通常計算標準差的方法。
這裡通過矩陣的方法實現很巧妙的解決了我們不需要是關心維度的問題。
對計算出來的標準差進行排序
sorteddistindicies = distances.argsort()
sorteddistindicies返回的結果不是排序的結果,而是按順序排序完成之後index的結果,例如乙個list[9, 6, 7, 3]
那麼返回的結果應該是[3, 1, 2, 0]分別表示的是按順序排列下來的index的值。
選取距離最近的k個點,並將結果存入classcount這個字典中,key表示label,value表示接近這個值得點的個數
for i in range(k):
voteilabale = labels[sorteddistindicies[i]]
classcount[voteilabale] = classcount.get(voteilabale, 0) + 1
最後取結果個數最多的label值作為**點的標籤。
完整**如下:
def classify0(inx, dataset, labels, k):
datasetsize = dataset.shape[0]
# 距離計算
tilemat = np.tile(inx, (datasetsize, 1))
diffmat = tilemat - dataset
sqdiffmat = diffmat ** 2
sqdistances = sqdiffmat.sum(axis=1)
distances = sqdistances ** 0.5
sorteddistindicies = distances.argsort()
classcount = {}
# 選擇距離最小的k個點
for i in range(k):
voteilabale = labels[sorteddistindicies[i]]
classcount[voteilabale] = classcount.get(voteilabale, 0) + 1
sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true)
return sortedclasscount[0][0]
機器學習實戰 knn 手寫識別
這個是 機器學習實戰 的第二個例項,用knn演算法實現手寫識別,識別0 9這幾個數字 要實現手寫識別功能,首先將影象資料轉換為矩陣或者向量形式,本例使用32 32的二值影象,轉化成1 1024的陣列,具體 如下 def img2vector filename returnvect zeros 1,1...
機器學習實戰 kNN演算法
今天看了第乙個機器學習演算法 k 鄰近演算法。大概意思就是,先根據已有分劃分好類別的資料集,然後輸入新的資料向量,就計算與資料集裡各個向量的距離,排序找到前k個資料,統計前k資料中各個類別 標籤 出現的次數,最多的那個類別 標籤 就是輸入向量所屬的類別,然後返回。哈哈get乙個機器學習的演算法開心。...
機器學習實戰 KNN演算法
k 近鄰演算法的工作機制非常簡單 對給定的測試樣本,基於某種距離度量找出訓練集中與其最靠近的 k 個訓練樣本,然後基於這 k 個 鄰居 的資訊來進行 通常,在分類任務中可使用 投票法 即選擇這 k 個樣本中出現最多的類別標記作為 結果 在回歸任務中時使用 平均法 即將這k 個樣本的實值輸出標記的平均...