機器學習實戰K 近鄰演算法

2021-08-13 09:35:37 字數 3983 閱讀 1694

# -*- coding: utf-8 -*-

from numpy import *

import operator

import matplotlib

import matplotlib.pyplot as plt

defcreatdataset

(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels = ['a','a','b','b']

return group,labels

#初級k-近鄰演算法

defclassify0

(inx,dataset,labels,k):

datasetsize = dataset.shape[0] #獲取資料集有多少元素(資料集的第一維度)

diffmat = tile(inx,(datasetsize,1)) - dataset #資料集中每個元素與inx做差

print (datasetsize)

sqdiffmat = diffmat**2

#差值平方

sqdistance = sqdiffmat.sum(axis=1) #差值平方的和

distances = sqdistance**0.5

#差值平方和開根號

sorteddistindicies = distances.argsort() #降序排列

classcount = {}

for i in range(k):

voteilabel = labels[sorteddistindicies[i]] #當前標籤賦值

classcount[voteilabel] = classcount.get(voteilabel,0) + 1

#與哪個接近,哪個標籤次數就+1

sortedclasscount = sorted(classcount.iteritems(),

key=operator.itemgetter(1), #class集合排序,輸出最有可能的

reverse=true)

return sortedclasscount[0][0]

# group,labels = creatdataset()

# print classify0([0,0],group,labels,3)

#從檔案中讀取資料

deffile2matrix

(filename):

fr = open(filename)

arrayolines = fr.readlines()

numberoflines = len(arrayolines) #獲取檔案行數

returnmat = zeros((numberoflines,3)) #建立矩陣

classlabelvector =

index = 0

for line in arrayolines:

line = line.strip() #移除頭尾的指定元素(預設為空格)

listformline = line.split('\t') #根據 \t 分開字元

returnmat[index,:] = listformline[0:3] #為矩陣賦值 逗號表示可選(,後面的:為可選部分)

# print returnmat

index += 1

return returnmat,classlabelvector

# datingdatamat,datinglabels = file2matrix('datingtestset2.txt')

# fig = plt.figure()

# ax = fig.add_subplot(111)

# ax.scatter(datingdatamat[:,1],datingdatamat[:,2])

# plt.show()

#歸一化處理

defautonorm

(dataset):

minvals = dataset.min(0)

maxvals = dataset.max(0)

ranges = maxvals - minvals

normdataset = zeros(shape(dataset))

m = dataset.shape[0] #m獲取資料集的第一維度

normdataset = dataset - tile(minvals,(m,1)) # 資料集與minvals做差(與上一步共同構成矩陣減法)

normdataset = normdataset/tile(ranges,(m,1)) #對資料歸一化處理

return normdataset,ranges,minvals

# normmat,ranges,minvals = autonorm(datingdatamat)

#正確率驗證

defdatingclasstest

(): horatio = 0.10

datingdatamat, datinglabels = file2matrix('datingtestset2.txt')

normmat,ranges,minvals = autonorm(datingdatamat)

m = normmat.shape[0]

numtestvecs = int(m*horatio)

errorcount = 0.0

for i in range(numtestvecs):

classifierresult = classify0(normmat[i,:],normmat[numtestvecs:m,:],\

datinglabels[numtestvecs:m],3)

print

"the classifier came back with: %d, the real answer is: %d"\

% (classifierresult,datinglabels[i])

if (classifierresult != datinglabels[i]):

errorcount += 1.0

print

"the total error rate is %f" %(errorcount/float(numtestvecs))

# datingclasstest()

defclassifyperson

(): resultlist = ['不喜歡','一般','感興趣']

percentats = float(raw_input(\

"打電腦遊戲時間佔百分比?"))

ffmiles = float(raw_input(\

"每年獲得飛行常客里程數?"))

icecream = float(raw_input(\

"每年消耗的冰激凌公升數?"))

datingdatamat ,datinglabels = file2matrix('datingtestset2.txt')

normmat ,ranges,minvals = autonorm(datingdatamat)

inarr = array([ffmiles,percentats,icecream])

classifierresult = classify0((inarr-\

minvals)/ranges,normmat,datinglabels,3)

print

"you will pro`這裡寫**片`bably like this person: ",\

resultlist[classifierresult - 1]

classifyperson()

《機器學習實戰》 K 近鄰演算法

基本原理 通過計算新資料與給定的樣本資料之間的距離,來確定相似度排名 然後取前k個最相似的樣本,統計這k 一般不大於20 個樣本中出現最多的分類,設為新資料的分類。新資料,訓練樣本集,樣本資料標籤 即分類 最近鄰 前k個最相似資料 最近鄰標籤 演算法實施 首先提取要比較的特徵,確定各特徵的權重,進行...

機器學習實戰 K 近鄰演算法

簡單的說,k 近鄰演算法採用測量不同特徵值之間的距離辦法進行分類.收集資料 可以使用任何方法。準備資料 距離計算所需要的數值,最好是結構化的資料格式。分析資料 可以使用任何方法。訓練演算法 此步驟不適用於k 近鄰演算法。測試演算法 計算錯誤率。使用演算法 首先需要輸入樣本資料和結構化的輸出結果,然後...

機器學習實戰 k 近鄰演算法

本系列是基於 機器學習實戰 這本書做的讀書筆記,原書採用python2作為工具,我則將原書 改為用python3編寫並記錄在此系列中。我將把書中對這些機器學習演算法的定義謄上,然後寫下自己對該演算法的通俗理解,之後貼出書中演算法清單中的 本書講解的第乙個機器學習演算法是k 近鄰演算法 knn 它的工...