# -*- 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 它的工...