1.作業題目
原生python實現knn分類演算法,用鳶尾花資料集
2.演算法設計
knn演算法設計思路:
演算法涉及3個主要因素:
訓練資料集
距離或相似度的計算衡量
k的大小
對於確定未知類別:
1.計算已知類別資料集中的點與當前點的距離(距離的計算一般使用歐氏距離或曼哈頓距離)
2.按照距離依次排序
3.選取與當前點距離最小的k個點
4.確定前k個點所在類別的出現概率
5.返回前k個點出現頻率最高的類別作為當前點**分類
3.有注釋的源**
資料分類.py:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import numpy as np
def train_test_split(x,y,test_ratio=0.2,seed=none):
"""將資料 x 和 y 按照test_ratio分割成x_train, x_test, y_train, y_test"""
assert x.shape[0]==y.shape[0]
assert 0.0<=test_ratio<=1.0
if seed:
np.random.seed(seed)
shuffle_indexes = np.random.permutation(len(x))
test_size = int(len(x)*test_ratio)
test_indexes = shuffle_indexes[:test_size]
train_indexes = shuffle_indexes[test_size:]
x_train = x[train_indexes]
y_train = y[train_indexes]
x_test = x[test_indexes]
y_test = y[test_indexes]
return x_train,x_test,y_train,y_test
鳶尾花knn演算法實現:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import numpy as py
import operator
from 資料分類 import train_test_split
import pandas as pd
from sklearn import datasets
'''載入鳶尾花資料集'''
iris = pd.read_csv('iris.data', header=none)
x = iris.iloc[0:150, 0:4].values
y = iris.iloc[0:150, 4].values
x_train, x_test, y_train, y_test = train_test_split(x,y)
#knn演算法
def knn(trainset,label,testset,k):
# 求差的平方和---注意:陣列可以做加減,此處均為陣列
distance=(trainset-testset)**2
# 對陣列的每一行求和,axis=1為對行求和,axis=0為對每列求和
distanceline=distance.sum(axis=1)
finaldistance=distanceline**0.5
# 獲得排序後原始下角標
sortedindex=finaldistance.argsort()
# 獲得距離最小的前k個下角標
index=sortedindex[:k]
# 字典 key為標籤,value為標籤出現的次數
labelcount={}
for i in index:
templabel=label[i]
labelcount[templabel]=labelcount.get(templabel,0)+1
# operator.itemgetter(1)意思是按照value值排序,即按照歐氏距離排序
sortedcount=sorted(list(labelcount.items()),key=operator.itemgetter(1),reverse=true)
return sortedcount[0][0]#輸出標籤出現最多的那個
#**正確率
def predict(trainset,trainlabel,testset,k):
total=len(testset)
truecount=0
for i in range(len(testset)):
label=knn(trainset,trainlabel,testset[i],k)
if label in testlabel[i]:
truecount=truecount+1
return "**準確率為:{}".format(float(truecount)/float(total))
if __name__=='__main__':
trainset,trainlabel=x_train, y_train#訓練資料以及標籤
testset, testlabel = x_test, y_test #測試資料以及標籤
print((predict(trainset,trainlabel,testset,3)))
4.測試用例設計及除錯過程截圖
測試用例設計:
輸入資料:
鳶尾花資料集(『iris.data』,儲存在python工程中,可直接執行)中每個樣本x包含了花萼長度(sepal length)、花萼寬度(sepal width)、花瓣長度(petal length)、花瓣寬度(petal width)四個特徵。樣本標籤y共有三類,分別是setosa,versicolor和virginica。iris資料集總共包含150個樣本,每個類別由50個樣本,整體構成乙個150行5列的二維表,80%為訓練集,20%為測試集。
預期結果:90%以上。
除錯過程:
設定斷點,只用訓練資料進行訓練和測試,結果為1即100%。
設定斷點,用訓練資料做訓練集,測試資料做測試集,此時結果發生變化,準確率降低。
鳶尾花knn演算法**執行結果:
準確率約為96.67%,說明訓練模型比較可信。
5.總結
這次的作業總的來說完成度還可以,將鳶尾花資料集放在python工程中,然後在運用時通過檔名進行直接呼叫,沒有利用庫中原本就有的函式,但遺憾的是參考了網上的部分**,然後進行理解,對knn演算法也有了一定程度的理解,在執行過程中發現執行速度較慢,鳶尾花資料集為150個資料,執行時間約為0.00398922s。其中,遇到的問題是怎麼將鳶尾花的資料分為訓練集和測試集,將資料分類擷取,一部分作為訓練集,一部分作為測試集,這裡佔比為80%和20%,然後再結合knn演算法的思路完善程式。
knn的特點:
優點(1)監督學習:可以看到,knn演算法首先需要乙個訓練樣本集,這個集合中含有分類資訊,因此它屬於監督學習。
(2)通過計算距離來衡量樣本之間相似度,演算法簡單,易於理解和實現。
缺點(1)需要設定k值,結果會受到k值的影響,通過上面的例子可以看到,不同的k值,最後得到的分類結果不盡相同。k一般不超過20。
(2)計算量大,需要計算樣本集中每個樣本的距離,才能得到k個最近的資料樣本。
(3)訓練樣本集不平衡導致結果不準確問題。當樣本集中主要是某個分類,該分類數量太大,導致近鄰的k個樣本總是該類,而不接近目標分類。
6.參考文獻:
原生Python實現KNN分類演算法
原生python實現knn分類演算法,用鳶尾花資料集。knn是一種聚類演算法,用於對新的資料點進行分類。對於乙個只知道特徵的資料點,首先計算它和已知訓練集所有點的距離,然後選擇最近的k個點進行 投票表決 來決定所屬型別。因為訓練集的標籤是已知的,所以根據 投票 結果,判定該點的型別為 票數 最多的類...
原生python實現knn分類演算法
一 題目 原生python實現knn分類演算法 二 演算法設計 k 近鄰 k nearset neighbor,簡稱 knn 學習是一種常用的監督學習方法,其工作機制非常簡單 給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的 k 個訓練樣本,然後基於這 k 個 鄰居 的資訊來進行觀測。通常,在...
原生python實現knn演算法
1 knn演算法的思想 就是在訓練集中資料和標籤已知的情況下,輸入測試資料,將測試資料的特徵與訓練集中對應的特徵進行相互比較,找到訓練集中與之最為相似的前k個資料,則該測試資料對應的類別就是k個資料 現次數最多的那個分類。2 演算法設計 根據knn演算法的思想可以得到knn演算法的步驟為 1 計算測...