寫了knn演算法以後,再寫乙個二,
一的連線
#-*- coding:utf-8 -*-
#import math
import random
import operator
import csv
import numpy as np
defloaddataset
(filename,split,trainingset = ,testset = ):
with open(filename,'rb') as csvfile:
lines = csv.reader(csvfile) #csv讀入所有的行
dataset = list(lines) #轉換為列表
for x in range(len(dataset)-1): #轉化為csv後多出來乙個空,所以要-1
for i in range(4):
dataset[x][i] = float(dataset[x][i])
if random.random() #隨機分割訓練集和測試集
else:
return trainingset,testset
# loaddataset('irisdata.txt',0.5,trainingset = ,testset = )
# 返回兩個例項之間的距離
defeuclideandistance
(instance1,instance2):
n = len(instance1)-1
instance1 = np.array(instance1[:n])
instance2 = np.array(instance2[:n])
distance = (instance2-instance1)**2
distances = distance.sum(axis = 0)
return math.sqrt(distances)
#返回k個最近的例項集合
defgetneaborhod
(testset,trainset,k):
distances =
for i in range(len(trainset)):
distance = euclideandistance(testset,trainset[i])
distances = np.array(distances) #轉化為np.array()型別,為了方便使用argsort,返回從小到大的元素的下標
distancessort = distances.argsort()
neighbors =
for x in range(k):
return neighbors #返回最近的k個物件
#找到最近的label
defgetresponse
(neighbors):
classvotes = {}
for x in range(len(neighbors)):
label = neighbors[x][-1]
classvotes[label] = classvotes.get(label,0)+1
result = sorted(classvotes.iteritems(),key = operator.itemgetter(1),reverse=true)
return result[0][0]
defmain
(): trainset,testset = loaddataset('irisdata.txt',0.8,trainingset = ,testset = ) #80作為訓練集
print
'trainset1',len(trainset)
print
'testset1',len(testset)
n = 0.0
for i in range(len(testset)):
test = testset[i]
neighbor = getneaborhod(test,trainset,3)
predict = getresponse(neighbor)
if predict == test[-1]:
n = n+1
allset = float(len(testset))
result = n/allset
print result
trainset,testset = loaddataset('irisdata.txt',0.8,trainingset = ,testset = )
print
'trainset2',len(trainset)
print
'testset2',len(testset)
a = [6.1,2.8,4.7,1.2]
defpredict
(new,train):
neighbor = getneaborhod(new,train,3)
predict = getresponse(neighbor)
print predict
if __name__ == '__main__':
main()
predict(a,testset)
測試結果還算是比較滿意,達到了識別率95%
測試結果如下:
trainset2 112
testset2 38
trainset1 109
testset1 41
0.951219512195
iris-versicolor
[finished in
1.5s]
機器學習之KNN演算法
在幾位志同道合的小夥伴的帶領下,開始了機器學習的路程,然而一切並不是想象的那麼簡單,因此本文記錄了自己的學習路程,希望還能堅持做好這件事。knn演算法是機器學習中屬於比較簡單的演算法,容易理解和閱讀。1.knn的應用 客戶流失 欺詐偵測等 更適合於稀有事件的分類問題 2.優缺點 優點 這是乙個簡單有...
機器學習演算法之KNN
物以類聚 人以群分,乙個例項與它周圍的例項屬於同一類的概率較大。給定乙個訓練資料集,對新輸入的例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。這裡,選用了歐氏距離,k的預設值為3,使用了sklearn提供的digits資料集來進行測試。inpu...
機器學習之kNN演算法
knn原理及實踐 1 演算法介紹 總的來說,機器學習入門的第乙個演算法是k 近鄰演算法 knn 它的工作原理是 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進...