最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Python實(shí)現(xiàn)KNN分類算法

 更新時間:2017年12月22日 10:50:40   作者:玉米味土豆片  
這篇文章主要為大家詳細(xì)介紹了用Python實(shí)現(xiàn)KNN分類算法的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Python KNN分類算法的具體代碼,供大家參考,具體內(nèi)容如下

KNN分類算法應(yīng)該算得上是機(jī)器學(xué)習(xí)中最簡單的分類算法了,所謂KNN即為K-NearestNeighbor(K個最鄰近樣本節(jié)點(diǎn))。在進(jìn)行分類之前KNN分類器會讀取較多數(shù)量帶有分類標(biāo)簽的樣本數(shù)據(jù)作為分類的參照數(shù)據(jù),當(dāng)它對類別未知的樣本進(jìn)行分類時,會計(jì)算當(dāng)前樣本與所有參照樣本的差異大小;該差異大小是通過數(shù)據(jù)點(diǎn)在樣本特征的多維度空間中的距離來進(jìn)行衡量的,也就是說,如果兩個樣本點(diǎn)在在其特征數(shù)據(jù)多維度空間中的距離越近,則這兩個樣本點(diǎn)之間的差異就越小,這兩個樣本點(diǎn)屬于同一類別的可能性就越大。KNN分類算法利用這一基本的認(rèn)知,通過計(jì)算待預(yù)測樣本點(diǎn)與參照樣本空間中所有的樣本的距離,并找到K個距離該樣本點(diǎn)最近的參照樣本點(diǎn),統(tǒng)計(jì)出這最鄰近的K個樣本點(diǎn)中占比數(shù)量最多的類別,并將該類別作為預(yù)測結(jié)果。

KNN的模型十分簡單,沒有涉及到模型的訓(xùn)練,每一次預(yù)測都需要計(jì)算該點(diǎn)與所有已知點(diǎn)的距離,因此隨著參照樣本集的數(shù)量增加,KNN分類器的計(jì)算開銷也會呈比例增加,并且KNN并不適合數(shù)量很少的樣本集。并且KNN提出之后,后續(xù)很多人提出了很多改進(jìn)的算法,分別從提高算法速率和提高算法準(zhǔn)確率兩個方向,但是都是基于“距離越近,相似的可能性越大”的原則。這里利用Python實(shí)現(xiàn)了KNN最原始版本的算法,數(shù)據(jù)集使用的是機(jī)器學(xué)習(xí)課程中使用得非常多的鶯尾花數(shù)據(jù)集,同時我在原數(shù)據(jù)集的基礎(chǔ)上向數(shù)據(jù)集中添加了少量的噪聲數(shù)據(jù),測試KNN算法的魯棒性。

數(shù)據(jù)集用得是鶯尾花數(shù)據(jù)集,下載地址。

數(shù)據(jù)集包含90個數(shù)據(jù)(訓(xùn)練集),分為2類,每類45個數(shù)據(jù),每個數(shù)據(jù)4個屬性 

Sepal.Length(花萼長度),單位是cm;
Sepal.Width(花萼寬度),單位是cm;
Petal.Length(花瓣長度),單位是cm;
Petal.Width(花瓣寬度),單位是cm;

分類種類: Iris Setosa(山鳶尾)、Iris Versicolour(雜色鳶尾)
之前主打C++,近來才學(xué)的Python,今天想拿實(shí)現(xiàn)KNN來練練手,下面上代碼:

#coding=utf-8
import math
#定義鳶尾花的數(shù)據(jù)類
class Iris:
 data=[]
 label=[]
 pass
#定義一個讀取鶯尾花數(shù)據(jù)集的函數(shù)
def load_dataset(filename="Iris_train.txt"):
 f=open(filename)
 line=f.readline().strip()
 propty=line.split(',')#屬性名
 dataset=[]#保存每一個樣本的數(shù)據(jù)信息
 label=[]#保存樣本的標(biāo)簽
 while line:
 line=f.readline().strip()
 if(not line):
 break
 temp=line.split(',')
 content=[]
 for i in temp[0:-1]:
 content.append(float(i))
 dataset.append(content)
 label.append(temp[-1])
 total=Iris()
 total.data=dataset
 total.label=label
 return total#返回數(shù)據(jù)集
 
#定義一個Knn分類器類
class KnnClassifier:
 def __init__(self,k,type="Euler"):#初始化的時候定義正整數(shù)K和距離計(jì)算方式
 self.k=k
 self.type=type
 self.dataloaded=False
 def load_traindata(self,traindata):#加載數(shù)據(jù)集
 self.data=traindata.data
 self.label=traindata.label
 self.label_set=set(traindata.label)
 self.dataloaded=True#是否加載數(shù)據(jù)集的標(biāo)記
 
 def Euler_dist(self,x,y):# 歐拉距離計(jì)算方法,x、y都是向量
 sum=0
 for i,j in zip(x,y):
 sum+=math.sqrt((i-j)**2)
 return sum
 def Manhattan_dist(self,x,y):#曼哈頓距離計(jì)算方法,x、y都是向量
 sum=0
 for i,j in zip(x,y):
 sum+=abs(i-j)
 return sum
 def predict(self,temp):#預(yù)測函數(shù),讀入一個預(yù)測樣本的數(shù)據(jù),temp是一個向量
 if(not self.dataloaded):#判斷是否有訓(xùn)練數(shù)據(jù)
 print "No train_data load in"
 return
 distance_and_label=[]
 if(self.type=="Euler"):#判斷距離計(jì)算方式,歐拉距離或者曼哈頓距離
 for i,j in zip(self.data,self.label):
 dist=self.Euler_dist(temp,i)
 distance_and_label.append([dist,j])
 else:
 if(self.type=="Manhattan"):
 for i,j in zip(self.data,self.label):
 dist=self.Manhattan_dist(temp,i)
 distance_and_label.append([dist,j])
 else:
 print "type choice error"
 #獲取K個最鄰近的樣本的距離和類別標(biāo)簽
 neighborhood=sorted(distance_and_label,cmp=lambda x,y : cmp(x[0],y[0]))[0:self.k]
 neighborhood_class=[]
 for i in neighborhood:
 neighborhood_class.append(i[1])
 class_set=set(neighborhood_class)
 neighborhood_class_count=[]
 print "In k nearest neighborhoods:"
 #統(tǒng)計(jì)該K個最鄰近點(diǎn)中各個類別的個數(shù)
 for i in class_set:
 a=neighborhood_class.count(i)
 neighborhood_class_count.append([i,a])
 print "class: ",i," count: ",a
 result=sorted(neighborhood_class_count,cmp=lambda x,y : cmp(x[1],y[1]))[-1][0]
 print "result: ",result
 return result#返回預(yù)測的類別
 
if __name__ == '__main__':
 traindata=load_dataset()#training data
 testdata=load_dataset("Iris_test.txt")#testing data
 #新建一個Knn分類器的K為20,默認(rèn)為歐拉距離計(jì)算方式
 kc=KnnClassifier(20)
 kc.load_traindata(traindata)
 predict_result=[]
 #預(yù)測測試集testdata中所有待預(yù)測樣本的結(jié)果
 for i,j in zip(testdata.data,testdata.label):
 predict_result.append([i,kc.predict(i),j])
 correct_count=0
 #將預(yù)測結(jié)果和正確結(jié)果進(jìn)行比對,計(jì)算該次預(yù)測的準(zhǔn)確率
 for i in predict_result:
 if(i[1]==i[2]):
 correct_count+=1
 ratio=float(correct_count)/len(predict_result)
 print "correct predicting ratio",ratio

測試集中11個待測樣本點(diǎn)的分類結(jié)果:

In k nearest neighborhoods:
class: Iris-setosa count: 20
result: Iris-setosa
In k nearest neighborhoods:
class: Iris-setosa count: 20
result: Iris-setosa
In k nearest neighborhoods:
class: Iris-setosa count: 20
result: Iris-setosa
In k nearest neighborhoods:
class: Iris-setosa count: 20
result: Iris-setosa
In k nearest neighborhoods:
class: Iris-setosa count: 20
result: Iris-setosa
In k nearest neighborhoods:
class: Iris-versicolor count: 20
result: Iris-versicolor
In k nearest neighborhoods:
class: Iris-versicolor count: 20
result: Iris-versicolor
In k nearest neighborhoods:
class: Iris-versicolor count: 20
result: Iris-versicolor
In k nearest neighborhoods:
class: Iris-versicolor count: 20
result: Iris-versicolor
In k nearest neighborhoods:
class: Iris-versicolor count: 20
result: Iris-versicolor
In k nearest neighborhoods:
class: Iris-setosa count: 18
class: Iris-versicolor count: 2
result: Iris-setosa
correct predicting ratio 0.909090909091

KNN中對距離的計(jì)算有很多種方法,不同的方法適用于不同的數(shù)據(jù)集,該代碼中只實(shí)現(xiàn)了歐拉距離和曼哈頓距離兩種計(jì)算方式;測試集中的數(shù)據(jù)是從原數(shù)據(jù)集中抽離出來的,數(shù)據(jù)量不是很大,結(jié)果并不能很好地體現(xiàn)KNN的性能,所以程序運(yùn)行結(jié)果僅供參考。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

剑阁县| 莒南县| 延寿县| 友谊县| 民勤县| 潼南县| 五原县| 长沙市| 阿克陶县| 绥中县| 康定县| 桃园市| 扎兰屯市| 南丰县| 上蔡县| 铁岭市| 闻喜县| 新野县| 宁武县| 大兴区| 崇信县| 阳春市| 和静县| 西乌| 山东省| 开化县| 河西区| 纳雍县| 东源县| 三明市| 大城县| 彭阳县| 宜兰县| 桑日县| 上杭县| 芮城县| 克拉玛依市| 安丘市| 轮台县| 溧阳市| 普格县|