k近鄰演算法無訓練步驟
輸入的四個引數變數:
inx:用於分類的輸入向量
dataset:輸入的訓練樣本集
labels:標籤向量
k:引數k的定義
演算法思想:對未知類別屬性的特徵向量分別與已知類別中的特徵向量進行距離的計算;按照所得距離數值從小到大排序,選取前k個距離小的點;對挑選出來的點所屬類別進行統計,返回出現頻率最高的類別作為當前未知類別屬性的類別分類。
def classfy(inx, dataset, labels, k):
lendataset = dataset.shape[0] #計算已知資料集的點的個數
diffmat = tile(inx, (lendataset, 1)) - dataset #將未知類別屬性擴充套件為和已知資料集相同的矩陣格式
sqdiffmat = diffmat * *2 #計算平方
sqdistance = sqdiffmat.sum(axis=1) #按行相加來統計未知類別屬性與每個點之間的距離
distance = sqdistance * *0.5 #求得最後的距離
sortdistance = distance.argsort() #對距離進行排序
classcount =
for i in range (k):
votellabels = labels[sortdistance(i)] #距離最近的前k個類別的標籤
classcount[votellabels] = classcount.get(votellabels, 0)+1 #對標籤出現的次數進行統計
sortclasscount = sorted(classcount.iteritems(), key = operator.itemgetter(1), reverse = true) #按照出現的類別次數對標籤進行排序
return sortclasscount[0][0] #返回出現類別頻率最高的標籤
get函式的用法:dict.get(key, default=none),
key–為函式要查詢的值
default–如果查詢的值不存在,則返回default的值
.itemgetter(1):按照第二個元素的次序對元組進行排序;
items()和iteritems()函式的用:
items():返回的是乙個列表;
iteritems():返回的是乙個迭代器。
將文字記錄轉化為numpy的解析程式
def file2matrix( filename):
fr = open(filename)
arrayolines = fr.readlines() #讀取檔案內容
numberoflines = len(arrayolines) #統計檔案中的行數
returnmat = zeros ((numberoflines, 3)) #建立乙個用0填充的矩陣
classlabelvector = [ ]
index = 0
for line in arrayolines:
line = line.strip() #截掉所有的回車字元
listfromline = line.split('\t') #將整行資料分割為乙個元素列表
returnmat[index, :] = listfromline[0:3]
index +=1
return returnmat, classlabelvector
機器學習 演算法 KNN
參考 我感覺knn是最簡單的乙個機器學習演算法,實現很簡單,效果也一般般 就是算個euclideam distance,還有一些可以優化的地方,比如可以加權,第二篇文章提到了 python 如下 coding utf 8 created on aug 30,2013 author blacklaw ...
機器學習 KNN 演算法
一 主要目的 在樣本空間中,找到與待估計的樣本最臨近的k個鄰居,用這幾個鄰居的類別來估計待測樣本的類別 二 適用性 樣本容量比較大的類域的自動分類,而樣本容量較小的類域則容易誤分。尤其適用於樣本分類邊界不規則的情況 三 不足 1 當樣本不平衡時,比如乙個類的樣本容量很大,其他類的樣本容量很小,輸入乙...
機器學習 KNN演算法
一 近 鄰 算 法 knn 原理 工 作 原 理 是 存 在 一 個 樣 本 資料 集 合 也 稱 作 訓練 樣 本 集 並 且 樣 本 集 中 每 個 數 據 都 存 在 標 籤 即 我 們 知 道 樣 本 集 中 每 一 數 據與 所 屬 分 類 的 對 應關係 輸 人 沒 有 標 籤 的 新 ...