python實現(xiàn)kNN算法
kNN(k-nearest neighbor)是一種基本的分類與回歸的算法。這里我們先只討論分類中的kNN算法。
k鄰近算法的輸入為實例的特征向量,對對應于特征空間中的點;輸出為實例的類別,可以取多類,k近鄰法是建設給定一個訓練數(shù)據(jù)集,其中的實例類別已定,分類時,對于新的實例,根據(jù)其k個最鄰近的訓練實例的類別,通過多數(shù)表決等方式進行預測。所以可以說,k近鄰法不具有顯示的學習過程。k臨近算法實際上是利用訓練數(shù)據(jù)集對特征向量空間進行劃分,并作為其分類的“模型”
k值的選擇,距離的度量和分類決策規(guī)則是k近鄰算法的三個基本要素。
這里需要說明的是,對于距離的度量,我們有很多種度量方法可以選擇,如歐氏距離(2-范數(shù)),曼哈頓距離(1-范數(shù)),無窮范數(shù)等,根據(jù)不同的實例,我們可以選擇不同的距離度量方法。
下面給出了利用python和sklearn庫實現(xiàn)的kNN算法的過程及部分注釋:
# coding=utf-8 # 首先利用sklearn的庫進行knn算法的建立與預測 # from sklearn import neighbors # from sklearn import datasets # # knn = neighbors.KNeighborsClassifier() # 調用分類器賦在變量knn上 # # iris = datasets.load_iris() # 返回一個數(shù)據(jù)庫,賦值在iris上 # # print iris # 顯示這個數(shù)據(jù)集 # # knn.fit(iris.data, iris.target) # fit的第一個參數(shù) 是特征值矩陣,第二個參數(shù)是一維的向量 # # predictedLabel = knn.predict([[0.1,0.2,0.3,0.4]]) # # print predictedLabel # 下面自己寫一個程序實現(xiàn)knn算法 import csv import random import math import operator # filename是指文件名,split是某一個數(shù)字,數(shù)字前的數(shù)據(jù)當做訓練集,數(shù)字后的數(shù)據(jù)當做測試集 # trainingSet是訓練集,testSet是測試集 # 函數(shù)作用,加載文件,并將文件通過隨機數(shù)的方法分為訓練集和測試集 def loadDataset(filename, split, trainingSet=[], testSet=[]): with open(filename, 'rb') as csvfile: # 導入文件為csvfile格式 lines = csv.reader(csvfile) # 讀取所有的行 reader函數(shù)的作用 dataset = list(lines) # 將所有的行轉換為list的數(shù)據(jù)節(jié)后 for x in range(len(dataset)-1): # x在總共的行數(shù)中遍歷 for y in range(4): dataset[x][y] = float(dataset[x][y]) if random.random() < split: trainingSet.append(dataset[x]) else: testSet.append(dataset[x]) # 函數(shù)作用:計算歐氏距離 # 函數(shù)的輸入是兩個實例和他們的維度 def euclideanDistance(instance1, instance2, length): distance = 0 for x in range(length): # 對于每一個維度內進行一個差的計算,計算出所有維度的平方和 distance += pow((instance1[x] - instance2[x]),2) return math.sqrt(distance) # 函數(shù)作用:返回最近的k的neightbor # 也就是返回在trainingSet中距離testInstance最近的k個鄰居 def getNeigthbors(trainingSet, testInstance, k): distances =[] # 距離的容器,用來存放所有的距離值 length = len(testInstance) - 1 # 用來存放testInstance的維度 for x in range(len(trainingSet)): # 對于每一個x 計算訓練集中的數(shù)據(jù)與實例的距離 dist = euclideanDistance(testInstance,trainingSet[x],length) distances.append((trainingSet[x],dist)) # 把這些距離從小到大排起來 distances.sort(key=operator.itemgetter(1)) neighbors = [] for x in range(k): neighbors.append(distances[x][0]) return neighbors # 返回最近的鄰居 def getResponse(neighbors): classVotes = {} for x in range(len(neighbors)): response = neighbors[x][-1] if response in classVotes: classVotes[response] += 1 else: classVotes[response] = 1 sortedVotes = sorted(classVotes.iteritems(),key=operator.itemgetter(1),reverse=True) return sortedVotes[0][0] # 用來檢驗預測結果的正確率 def getAccuracy(testSet,predictions): correct = 0 for x in range(len(testSet)): if testSet[x][-1] == predictions[x]: # [-1]值的是最后一個值,也就是每行的最后的值,即為花的分類 correct += 1 return (correct/float(len(testSet))) * 100.00 def main(): # prepare data trainingSet = [] testSet = [] split = 0.67 loadDataset('irisdata.txt',split,trainingSet,testSet) # r的作用是防止錯誤字符串意思 print 'Train Set' + repr(len(trainingSet)) print 'Test Set' + repr(len(testSet)) # generate predicitions predicitions = [] k = 3 for x in range(len(testSet)): neighbors = getNeigthbors(trainingSet,testSet[x],k) result = getResponse(neighbors) predicitions.append(result) print('> predicition = ' + repr(result) + ', actual = ' +repr(testSet[x][-1])) accuracy = getAccuracy(testSet,predicitions) print('Accuracy:' + repr(accuracy) + '%') main()
程序執(zhí)行后,相應的輸出如下:
相關文章
python神經網絡Pytorch中Tensorboard函數(shù)使用
這篇文章主要為大家介紹了python神經網絡Pytorch中Tensorboard常用函數(shù)的使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05python實現(xiàn)京東訂單推送到測試環(huán)境,提供便利操作示例
這篇文章主要介紹了python實現(xiàn)京東訂單推送到測試環(huán)境,提供便利操作,涉及Python基于requests模塊的網絡請求操作相關使用技巧,需要的朋友可以參考下2019-08-08詳解Tensorflow不同版本要求與CUDA及CUDNN版本對應關系
這篇文章主要介紹了詳解Tensorflow不同版本要求與CUDA及CUDNN版本對應關系,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08