k 鄰近演算法學習筆記

2021-08-01 18:55:21 字數 4035 閱讀 3512

目錄

採用測量不同特徵值之間的距離進行分類。

缺點 適用範圍

工作原理

#!/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...