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進行多分類例項演示
#匯入相關庫 由於實際使用模組較多,這裡是所有工程需要庫,不必全部匯入plt.rcparams['font.family'] = ['sans-serif']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.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...
演算法第四章作業
我的理解 主要是在貪心二字上面,但是重要的是在哪些方面上貪心,是解決題目的最重要的思路。因此要考慮貪心選擇性質和子結構性質 貪心選擇性質 從區域性的最優解擴充套件到整體的最優解 最優子結構性質 整體的最優解包含子問題的最優解 由於要計算汽車從起點到終點的最少加油次數 故,每次可以盡可能多的在滿油量內...