第四章 K 近鄰演算法

2022-08-22 22:30:20 字數 3881 閱讀 9317

1.什麼是k近鄰演算法

最直觀的解釋就是:給定乙個訓練資料集,對於新的輸入例項,在訓練集中找到與該例項最近鄰的 k 個例項,這 k 個例項的多數屬於哪個類,則該例項就屬於哪個類。

2.k近鄰演算法的優缺點

優點:精度高,對異常值不敏感

缺點:計算複雜度高,空間複雜度高

3.k近鄰演算法關鍵點分析

由k近鄰演算法的解釋,這將分下述關鍵點講解:

3.1.找到與該例項最近鄰的例項,這裡就涉及到如何找到,即在特徵向量空間中,我們要採取何種方式來對距離進行度量,這是我們要考慮的第乙個問題。距離決定了資料資料點的相似程度,即分類的量度資訊。

通常計算距離的方法由曼哈頓距離和歐式距離,其餘參考的還有余弦距離、切比雪夫距離等。

以下是常用的歐式距離公式:

3.2. k 個例項中個 k 值的大小如何選擇。

一般而言,k 值的大小對分類結果有著重大的影響。當選擇的 k 值較小的情況下,就相當於用較小的鄰域中的訓練例項進行**,只有當與輸入例項較近的訓練例項才會對**結果起作用。但與此同時**結果會對例項點非常敏感,分類器抗噪能力較差,因而容易產生過擬合,所以一般而言,k 值的選擇不宜過小。但如果選擇較大的 k 值,就相當於在用較大鄰域中的訓練例項進行**,但相應的分類誤差也會增大,模型整體變得簡單,會產生一定程度的欠擬合。所以一般而言,我們需要採用交叉驗證的方式來選擇合適的 k 值。

3.3. k 個例項的多數屬於哪個類。

這裡只需要計算所選k個值種每個類別出現的額頻率,頻率最高的就是演算法輸出結果。

4.使用sklearn-knn進行多分類例項演示

#匯入相關庫  由於實際使用模組較多,這裡是所有工程需要庫,不必全部匯入

import

numpy as np

import

pandas as pd

from pandas import

read_csv

from pandas.plotting import

scatter_matrix

from matplotlib import

pyplot as plt

from sklearn.model_selection import

train_test_split

from sklearn.model_selection import

cross_val_score

from sklearn.model_selection import

stratifiedkfold

from sklearn.metrics import

classification_report

from sklearn.metrics import

confusion_matrix

from sklearn.metrics import

accuracy_score

#匯入封裝好的knn演算法

from sklearn.neighbors import

kneighborsclassifier

from sklearn import

metrics

from collections import

counter

from sklearn.externals import

joblib

import time

#解決matplotlib中文顯示亂碼問題

plt.rcparams['font.family'] = ['sans-serif']

plt.rcparams['font.sans-serif'] = ['simhei']

#匯入資料 

#資料讀取與劃分資料集

#random_state引數將隨機種子設定為固定數字,以確保每種演算法都在訓練資料集的相同分割上進行評估。

data = pd.read_csv("e:\\mywork\\分類器\\file\\data_1.csv")

print(data.shape)

print(data.head())

array = data.iloc[:,:].values

x = array[:,1:3]

y = array[:,3]

x_train, x_validation, y_train, y_validation = train_test_split(x, y, test_size=0.1, random_state=1)

#檢視資料分布狀況

#knn網路引數詳解

'''class sklearn.neighbors.kneighborsclassifier(n_neighbors=5, weights=』uniform』,

algorithm=』auto』, leaf_size=30, p=2, metric=』minkowski』, metric_params=none,

n_jobs=1, **kwargs)

1.n_neighbors : 乙個整數,指定k值。

2.weights:字串或可呼叫物件,指定投票權重型別。

uniform:節點附件鄰居節點的投票權重都相等。

distance:投票權重與距離成正比。節點越近權重越大。

[callable]:乙個可呼叫物件,它傳入距離的陣列,返回同樣形狀的權重陣列。

3.algorithm:乙個字串,指定最近鄰演算法。

ball_tree : 使用balltree演算法。

kd_tree : 使用kdtree演算法。

brute : 使用暴力搜尋演算法。

auto : 自動決定最合適演算法

4.leaf_size:乙個int,指定balltree或者kdtree葉節點的規模。影響樹的構建和查詢速度。

5.metric:乙個str,指定距離量度。預設為'minkowski'

6.p:int

1.曼哈頓距離。

2.歐式距離。

'''#使用sklearn構建knn演算法

knn_model = kneighborsclassifier(n_neighbors = 3,leaf_size = 30,p = 2,)

knn = knn_model.fit(x_train,y_train)

y_pred_knn = knn.predict(x_validation)

y_pred_raw = knn.predict(data_test_1)

#評估**

print("訓練集:", knn.score(x_train, y_train))

print("測試集:", knn.score(x_validation, y_validation))

print(accuracy_score(y_validation,y_pred_knn))

print(confusion_matrix(y_validation, y_pred_knn))

print(classification_report(y_validation, y_pred_knn))

plt.title('測試集效果')

plt.scatter(x_validation[:,0],x_validation[:,1],c = y_pred_knn)

輸出

演算法第四章作業

1.我對貪心演算法的理解 貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態...

演算法第四章作業

一 對貪心演算法的理解 貪心演算法的基本要素是 貪心選擇性質和最優子結構性質 貪心選擇每次選取當前最優解,可以依賴以往的選擇,但絕不依賴於將來所做的選擇,也不依賴於子問題的解。貪心演算法通常以自頂向下的方式進行。二 汽車加油問題的貪心選擇性質 汽車應選擇在能到達的前提下離自己最遠的加油站進行加油 i...

演算法第四章作業

我的理解 主要是在貪心二字上面,但是重要的是在哪些方面上貪心,是解決題目的最重要的思路。因此要考慮貪心選擇性質和子結構性質 貪心選擇性質 從區域性的最優解擴充套件到整體的最優解 最優子結構性質 整體的最優解包含子問題的最優解 由於要計算汽車從起點到終點的最少加油次數 故,每次可以盡可能多的在滿油量內...