上一節講解了手寫knn演算法實現手寫數字識別系統,但是在實際應用中並不需要自己手寫knn,可以直接呼叫sklearn庫中封裝好的方法,這一節通過資料庫中鳶尾花的資料集來練習手寫knn演算法以及呼叫sklearn庫中的knn演算法。
話不多說,直接上**
首先講解一下鳶尾花資料集,以後會經常用到。
鳶尾花有四個特徵:sepal length、sepal width、petal length、petal width
分為三類:0 表示iris setosa、1 表示 iris versicolor、2 表示 iris virginica
# 導包
from sklearn import datasets
import matplotlib.pyplot as plt
# 載入資料集
iris = datasets.load_iris()
x = iris.data # 資料
y = iris.target # 標籤
#畫圖,選擇特徵3、特徵4分別作為x軸和y軸,也可以選擇其他特徵
x_axis = x[:,2]
y_axis = x[:,3]
#c指定點的顏色,c根據標籤的不同自動著色
plt.scatter(x_axis, y_axis, c=iris.target)
plt.show()
資料在當前特徵下分布如下圖所示
# 導包
import operator
from numpy import *
import numpy as np
from sklearn import datasets # 資料集
from sklearn.model_selection import train_test_split
# 載入資料
iris = datasets.load_iris()
x = iris.data
y = iris.target
# 劃分資料集
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=2000)
#f 手寫knn演算法
def classify0(inx,dataset,labels,k):
datasetsize = dataset.shape[0]#檢視矩陣的維度
diffmat = tile(inx,(datasetsize,1)) - dataset
#tile(陣列,(在行上重複次數,在列上重複次數))
sqdiffmat = diffmat**2
sqdistances = sqdiffmat.sum(axis=1)
#sum預設axis=0,是普通的相加,axis=1是將乙個矩陣的每一行向量相加
distances = sqdistances**0.5
sorteddistindicies = distances.argsort()
#sort函式按照陣列值從小到大排序
#argsort函式返回的是陣列值從小到大的索引值
classcount={}
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]
classcount[voteilabel] = classcount.get(voteilabel,0) + 1
#get(key,k),當字典dic中不存在key時,返回預設值k;存在時返回key對應的值
sortedclasscount = sorted(classcount.items(),
key=operator.itemgetter(1),reverse=true)
#python2中用iteritems,python3中用items代替;operator.itemgetter(k),返回第k個域的值
return sortedclasscount[0][0]
# 測試
pre_test = [classify0(data,x_train,y_train,3) for data in x_test]
correct = np.count_nonzero((pre_test==y_test)==true)
print('準確率%.3f'%(correct/(len(y_test))))
# 準確率0.921
# 可以通過修改random_state,提高準確率
# 導包
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import kneighborsclassifier
# 載入資料
iris = datasets.load_iris()
x = iris.data
y = iris.target
# 劃分資料集
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=42)
# 呼叫sklearn庫函式
clf = kneighborsclassifier(n_neighbors=3)
clf.fit(x_train,y_train)
pre_test = clf.predict(x_test)
correct = np.count_nonzero((pre_test==y_test)==true)
print('準確率%.3f'%(correct/(len(y_test))))
# 準確率1.000
# 這裡並不是庫函式比手寫knn效果要好,而是資料集劃分不同,這裡random_state=42
在上面兩部分**中,計算準確率都是通過我們自己手寫判斷**正確的個數/**的總數,sklearn庫中整合的有正確率計算的函式。
# 直接引用sklearn庫進行準確率的計算
from sklearn.metrics import accuracy_score
pre_test=clf.predict(x_test)
acc=accuracy_score(y_test,pre_test)
print('準確率',acc)
# 準確率0.921
# 準確率1.000
# 準確率 1.0
可以看出直接呼叫庫函式著實減少了很多**,但是對手寫knn**的練習可以加強對knn的理解和應用,基礎還是比較重要的!
歡迎交流~
DBSCAN聚類演算法的原理及sklearn的演示
概念 基於密度的帶有雜訊點的聚類方法。內部概念理解 1.核心物件 若某個點的密度達到演算法設定的閾值則稱為核心點。2.距離閾值 設定的半徑r。3.直接密度可達 若某點p在點q的r鄰域內,且q是核心密度點,則pq直接密度可達。4.密度可達 直接密度可達的相互傳播。5.密度相連 若從某核心點q出發,點p...
KNN演算法 鄰近演算法
knn演算法是機器學習裡面比較簡單的乙個分類演算法了,整體思想比較簡單 計算乙個點a與其他所有點之間的距離,取出與該點最近的k個點,然後統計這k個點裡面所屬分模擬例最大的,則點a屬於該分類。這樣講可能還有點迷糊,下面用乙個例子來說明一下 電影名稱 打鬥次數 接吻次數 電影型別 california ...
KNN演算法(鄰近演算法)
鄰近演算法 或者說k最近鄰 knn,k nearestneighbor 分類演算法是 資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。knn演算法的核心思想 是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類...