from numpy import *
import operator
def creatdataset():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
lables = ['a','a','b','b']
return group,lables
def classify0(inx,dataset,lables,k):
#array的shape函式返回指定維度的大小,如dataset為n*m的矩陣,則dataset.shape[0]返回n,dataset.shape[1]返回m,dataset.shape返回n,m
datasetsize = dataset.shape[0]
#tile函式簡單的理解,它的功能是重複某個陣列。比如tile(a,n),功能是將陣列a重複n次,構成乙個新的陣列
#所以此處tile(inx,(datasetsize,1))的作用是將inx重複複製datasetsize次,以便與訓練樣本集的樣本個數一致
#減去dataset就是求出其差值,所以diffmat為乙個差值矩陣
diffmat = tile(inx,(datasetsize,1))- dataset
#以下三行**執行的是歐式距離的計算
sqdiffmat = diffmat**2
#平時用的sum應該是預設的axis=0,就是普通的相加,而當加入axis=1以後就是將乙個矩陣的每一行向量相加,axis用於控制是行相加還是列相加
sqdistances = sqdiffmat.sum(axis=1)
distance = sqdistances**0.5
#相關性的排序
#argsort函式返回的是陣列值從小到大的索引值
sorteddistance = distance.argsort()
#確定前k個點所在類別出現的頻率
classcount= {}
for i in range(k):
votelable = lables[sorteddistance[i]]
#dict.get(key, default=none)key 為字典中要查詢的鍵,default如果指定鍵的值不存在時,返回該預設值值。此句**用於統計標籤出現的次數
classcount[votelable] = classcount.get(votelable,0)+1
#sorted函式引數解釋,sorted(iterable, cmp=none, key=none, reverse=false)
#iterable:是可迭代型別;
#cmp:用於比較的函式,比較什麼由key決定;
#key:用列表元素的某個屬性或函式進行作為關鍵字,有預設值,迭代集合中的一項;
#reverse:排序規則. reverse = true 降序 或者 reverse = false 公升序,有預設值。
#返回值:是乙個經過排序的可迭代型別,與iterable一樣。
######
#operator模組提供的itemgetter函式用於獲取物件的哪些維的資料,引數為一些序號(即需要獲取的資料在物件中的序號)
######
sortedclasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=true)
#返回最符合的標籤
return sortedclasscount[0][0]
group,lables=creatdataset()
print classify0([0,0],group,lables,3)
#測試[0,0]所屬類別
python實現knn演算法
importnumpyasnp importoperator defcreatedataset group np.array 1.0 1.1 1.0 1.0 0.0 0.0 0.0 0.1 labels a a b b returngroup,labels 分類演算法 inx待分類的點 defcla...
python實現KNN演算法
具體 如下 import numpy as np import matplotlib.pyplot as plt class myknn def init self,k self.k k def compute self,x train,y train,x test dist i 0 計算歐式距離 ...
Python實現KNN演算法
一 作業題目 原生python實現knn分類演算法,用鳶尾花資料集。二 演算法設計 knn演算法核心思想 如果乙個樣本在特徵空間中的k個最相似 最近臨 的樣本中大多數屬於某個類別,則該樣本也屬於這個類別。knn k nearest neighbor 工作原理 存在乙個樣本資料集合,也稱為訓練樣本集,...