目錄
採用測量不同特徵值之間的距離進行分類。缺點 適用範圍
工作原理
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
# k-近鄰演算法
defclassify0
( x, dataset, labels, k ):
''' :type x:行向量( 1*n )
:type dataset:矩陣( m*n ),和 x 列數相同
:param labels:列向量(m*1)的轉置,和 dataset 的行數相同
:param k:前 k 個最近的點
:return:前 k 個中出現頻率最高的 label
'''# 獲得 dataset 的行數,即 dataset 的規模,每一行是包含多個特徵的例項.
datasetsize = dataset.shape[0]
# 產生乙個和dataset相同行、列數的測試資料datax,
# 按這樣方法複製 np.tile( a, (y, x) )
# np.tile( a, (y, x) ):a先沿y軸(豎著)複製 y 份,再沿x軸(橫著)複製 x 份
datax = np.tile( x, (datasetsize, 1) )
# 算歐式距離
diffmat = datax - dataset # 求差
sqdiffmat = diffmat**2
sumsqdiffmat = sqdiffmat.sum( axis = 1 ) # 在 1軸(x軸)上進行求和
distances = sumsqdiffmat**0.5
# print( distances )
# 排序,得到前 k 名
distindexsorted = distances.argsort() # 預設從小到大
# 統計前 k 個都是那些類別(標籤)
labfreqtopdistk = {} # 前 k 個最近距離的例項的標籤頻率
for i in range( k ):
lab = labels[ distindexsorted[i] ]
labfreqtopdistk[lab] = labfreqtopdistk.get(lab, 0) + 1
# 對標籤頻率進行排序
labfreq = list( labfreqtopdistk.items() ) # type: list[tuple]
labfreq.sort( key=lambda x : x[1] ,reverse = true) # 引數 key 是比較列表元素的什麼屬性
# print( labfreq ) # [ ('b', 2), ('a', 1) ]
return labfreq[0][0]
def
drawdata
( x, y , labels):
''' :param x: x軸資料
:param y: y軸資料
:param labels: 分類標籤資料
:return:
'''fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter( x, y, s=15.0*np.array(labels), c=15.0*np.array(labels) ) # size, color
plt.show()
# 獲得約會資料
datingdatamat, datinglabels = file2matrix( 'datingtestset2.txt' )
for i in range( len(datinglabels) ):
datinglabels[i] = eval( datinglabels[i] )
# 視覺化
將影象格式處理為乙個向量,即把32×32的矩陣轉換為1×1024的向量。
# 將影象轉化為向量
defimg2vector
(filename):
returnvect = zeros((1,1024))
fr = open(filename)
for i in range(32):
linestr = fr.readline()
for j in range(32):
returnvect[0,32*i+j] = int(linestr[j])
return returnvect
def
handwritingclasstest
(): hwlabels =
# 獲取目錄內容
trainingfilelist = listdir('trainingdigits')
m = len(trainingfilelist)
trainingmat = zeros((m,1024))
for i in range(m):
# 從檔名中解析數字 e.g."0_53.txt"
filenamestr = trainingfilelist[i]
filestr = filenamestr.split('.')[0]
classnumstr = int(filestr.split('_')[0])
trainingmat[i,:] = img2vector('trainingdigits/%s' % filenamestr)
testfilelist = listdir('testdigits')
errorcount = 0.0
mtest = len(testfilelist)
for i in range(mtest):
filenamestr = testfilelist[i]
filestr = filenamestr.split('.')[0]
classnumstr = int(filestr.split('_')[0])
vectorundertest = img2vector('testdigits/%s' % filenamestr)
classifierresult = classify0(vectorundertest, trainingmat, hwlabels, 3)
print("the classifier came back with: %d, the real answer is: %d" % (classifierresult, classnumstr))
if (classifierresult != classnumstr): errorcount += 1.0
print("\nthe total number of errors is: %d" % errorcount)
print("\nthe total error rate is: %f" % (errorcount/float(mtest)))
結果
k-近鄰演算法是分類資料最簡單最有效的演算法,也是我入門的演算法。
end
k 鄰近演算法學習
coding utf 8 from numpy import import operator def createdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 labels a b c d return group,labels def classify...
機器學習實戰筆記(k鄰近演算法)
1.k鄰近演算法原理 k鄰近演算法通過計算不同特徵值間的距離進行分類 存在乙個樣本資料集合,也稱為訓練樣本集,樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將輸入資料中的每個特徵值和訓練樣本集進行比較,然後選出特徵最相似的資料集的標籤作為輸入資料集標籤。一般來說我們選取訓練樣本集中前k個相似資...
機器學習演算法 K鄰近演算法
coding utf 8 author whf from numpy import import operator def classify inx,dataset,labels,k 得到資料集的行數 shape方法用來得到矩陣或陣列的維數 datasetsize dataset.shape 0 t...