kNN演算法 直接呼叫sklearn庫函式

2021-10-21 03:17:49 字數 3439 閱讀 6433

上一節講解了手寫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個最相鄰的樣本中的大多數屬於某乙個類...