日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据分析 | KNN模型

發(fā)布時間:2024/1/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据分析 | KNN模型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

KNN模型的應(yīng)用

  • 一、模型思想
  • 二、k值的選擇
    • 01 設(shè)置權(quán)重
    • 02 交叉驗證
  • 三、距離度量
    • 01 歐式距離
    • 02 曼哈頓距離
    • 03 余弦相似度
  • 四、代碼實現(xiàn)

一、模型思想

鄰近算法,或者說K最鄰近(KNN,K-NearestNeighbor)分類算法是數(shù)據(jù)挖掘分類技術(shù)中最簡單的方法之一。

如上圖所示,模型的本質(zhì)就是尋找k個最近的樣本,然后基于最近樣本做“預(yù)測”。對于離散型因變量來說,從k個最近的已知類別樣本中挑選出頻率最高的類別用于未知樣本的判斷;對于連續(xù)變量來說,則是將k個最近的已知樣本均值作為未知樣本的預(yù)測。

模型的執(zhí)行步驟如下:

  • 確定未知樣本近鄰的個數(shù)k值
  • 根據(jù)某種度量樣本間相似度的指標(biāo),將每一個未知類別樣本的最近k個已知樣本搜尋出來,形成簇
  • 對搜尋出來的已知樣本進(jìn)行投票,將各簇下類別最多的分類用作未知樣本點(diǎn)的預(yù)測
  • 二、k值的選擇

    不同的k值對模型的預(yù)測準(zhǔn)確性會有較大的影響,若k值過于偏小,可能會導(dǎo)致模型的過擬合;若k值偏大,又可能會使模型欠擬合。

    01 設(shè)置權(quán)重

    若k值設(shè)置的比較大時,擔(dān)心模型發(fā)生欠擬合的現(xiàn)象時,可以設(shè)置近鄰樣本的投票權(quán)重,若已知樣本距離未知樣本比較遠(yuǎn)時,則對應(yīng)的權(quán)重就設(shè)置得小一點(diǎn),否則權(quán)重就大一點(diǎn),通常可以將權(quán)重設(shè)置為距離的倒數(shù)。

    02 交叉驗證

    采用多重交叉驗證法,就是將k取不同的值,然后在每種值下執(zhí)行m重交叉驗證,最后選出平均誤差最小的k值

    三、距離度量

    01 歐式距離

    在n維空間中,對于兩點(diǎn) A ( x 1 , x 2 , ? , x n ) A(x_1,x_2,\cdots,x_n) A(x1?,x2?,?,xn?) B ( x 1 , x 2 , ? , x n ) B(x_1,x_2,\cdots,x_n) B(x1?,x2?,?,xn?) 間距離為:
    d A , B = ( y 1 ? x 1 ) 2 + ( y 2 ? x 2 ) 2 + ? + ( y n ? x n ) 2 d_{A,B}=\sqrt{(y_1-x_1)^2+(y_2-x_2)^2+\cdots+(y_n-x_n)^2} dA,B?=(y1??x1?)2+(y2??x2?)2+?+(yn??xn?)2 ?

    02 曼哈頓距離

    我們可以定義曼哈頓距離的正式意義為L1-距離或城市區(qū)塊距離,也就是在歐幾里德空間的固定直角坐標(biāo)系上兩點(diǎn)所形成的線段對軸產(chǎn)生的投影的距離總和。

    在平面上,坐標(biāo)(x1,y1)的i點(diǎn)與坐標(biāo)(x2,y2)的j點(diǎn)的曼哈頓距離為:
    d i j = ∣ x 1 ? x 2 ∣ + ∣ y 1 ? y 2 ∣ d_{ij}=|x_1-x_2|+|y_1-y_2| dij?=x1??x2?+y1??y2?
    以此延伸,在n維空間中,對于兩點(diǎn) A ( x 1 , x 2 , ? , x n ) A(x_1,x_2,\cdots,x_n) A(x1?,x2?,?,xn?) B ( x 1 , x 2 , ? , x n ) B(x_1,x_2,\cdots,x_n) B(x1?,x2?,?,xn?) 間的曼哈頓距離為:
    d A , B = ∣ y 1 ? x 1 ∣ + ∣ y 2 ? x 2 ∣ + ? + ∣ y n ? x n ∣ d_{A,B}=|y_1-x_1|+|y_2-x_2|+\cdots+|y_n-x_n| dA,B?=y1??x1?+y2??x2?+?+yn??xn?
    要注意的是,曼哈頓距離依賴坐標(biāo)系統(tǒng)的轉(zhuǎn)度,而非系統(tǒng)在坐標(biāo)軸上的平移或映射。

    03 余弦相似度

    余弦相似度,又稱為余弦相似性,是通過計算兩個向量的夾角余弦值來評估他們的相似度。余弦相似度將向量根據(jù)坐標(biāo)值,繪制到向量空間中,如最常見的二維空間。

    此時,二維空間AB兩點(diǎn)的余弦相似度為:
    S i m i l a r i t y A , B = C o s θ = x 1 x 2 + y 1 y 2 x 1 2 + y 1 2 x 2 2 + y 2 2 Similarity_{A,B}=Cos\theta=\frac{x_1x_2+y_1y_2}{\sqrt{x_1^2+y_1^2}\sqrt{x_2^2+y_2^2}} SimilarityA,B?=Cosθ=x12?+y12? ?x22?+y22? ?x1?x2?+y1?y2??
    同理,在n為空間的AB兩點(diǎn),其余弦相似度為:
    S i m i l a r i t y A , B = C o s θ = A → ? B → ∣ A → ∣ ∣ B → ∣ Similarity_{A,B}=Cos\theta=\frac{\overrightarrow{A}\ · \overrightarrow{B}}{|\overrightarrow{A}| \ |\overrightarrow{B}|} SimilarityA,B?=Cosθ=A ?B A ??B ?

    四、代碼實現(xiàn)

    neighbors.KNeighborsClassfier(n_neighbors=5, weights='uniform', p=2, metric='minkowski')

    • n_neighbors:指定臨近樣本個數(shù)k,默認(rèn)為5個
    • weights:指定臨近樣本的投票權(quán)重,默認(rèn)為uniform,表示所權(quán)重一樣;若為“distance”,則表示投票權(quán)重與距離成反比。
    • metric:指定距離的度量指標(biāo),默認(rèn)為閔可夫斯基距離
    • p:當(dāng)參數(shù)metric為閔可夫斯基距離時,p=1,表示計算點(diǎn)之間的曼哈頓距離;p=2,表示計算點(diǎn)之間的歐氏距離;默認(rèn)為2
    # 導(dǎo)入第三方包 import pandas as pd # 導(dǎo)入數(shù)據(jù) Knowledge = pd.read_excel(r'Knowledge.xlsx') # 返回前5行數(shù)據(jù) Knowledge.head() STG SCG STR LPR PEG UNS 0 0.00 0.00 0.00 0.00 0.00 Very Low 1 0.08 0.08 0.10 0.24 0.90 High 2 0.06 0.06 0.05 0.25 0.33 Low 3 0.10 0.10 0.15 0.65 0.30 Middle 4 0.08 0.08 0.08 0.98 0.24 Low # 構(gòu)造訓(xùn)練集和測試集 # 導(dǎo)入第三方模塊 from sklearn import model_selection # 將數(shù)據(jù)集拆分為訓(xùn)練集和測試集 predictors = Knowledge.columns[:-1] X_train, X_test, y_train, y_test = model_selection.train_test_split(Knowledge[predictors], Knowledge.UNS, test_size = 0.25, random_state = 1234) # 導(dǎo)入第三方模塊 import numpy as np from sklearn import neighbors import matplotlib.pyplot as plt# 設(shè)置待測試的不同k值 K = np.arange(1,np.ceil(np.log2(Knowledge.shape[0]))).astype(int) # 構(gòu)建空的列表,用于存儲平均準(zhǔn)確率 accuracy = [] for k in K:# 使用10重交叉驗證的方法,比對每一個k值下KNN模型的預(yù)測準(zhǔn)確率cv_result = model_selection.cross_val_score(neighbors.KNeighborsClassifier(n_neighbors = k, weights = 'distance'), X_train, y_train, cv = 10, scoring='accuracy')accuracy.append(cv_result.mean())# 從k個平均準(zhǔn)確率中挑選出最大值所對應(yīng)的下標(biāo) arg_max = np.array(accuracy).argmax() # 中文和負(fù)號的正常顯示 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] plt.rcParams['axes.unicode_minus'] = False # 繪制不同K值與平均預(yù)測準(zhǔn)確率之間的折線圖 plt.plot(K, accuracy) # 添加點(diǎn)圖 plt.scatter(K, accuracy) # 添加文字說明 plt.text(K[arg_max], accuracy[arg_max], '最佳k值為%s' %int(K[arg_max])) # 顯示圖形 plt.show()

    此時,通過圖像得到最佳k值

    # 導(dǎo)入第三方模塊 from sklearn import metrics# 重新構(gòu)建模型,并將最佳的近鄰個數(shù)設(shè)置為6 knn_class = neighbors.KNeighborsClassifier(n_neighbors = 6, weights = 'distance') # 模型擬合 knn_class.fit(X_train, y_train) # 模型在測試數(shù)據(jù)集上的預(yù)測 predict = knn_class.predict(X_test) # 構(gòu)建混淆矩陣 cm = pd.crosstab(predict,y_test) cm 獲得混淆矩陣 UNS High Low Middle Very Low row_0 High 29 0 0 0 Low 0 34 3 5 Middle 1 0 23 0 Very Low 0 0 0 6 # 分類模型的評估報告 print(metrics.classification_report(y_test, predict)) precision recall f1-score supportHigh 1.00 0.97 0.98 30Low 0.81 1.00 0.89 34Middle 0.96 0.88 0.92 26Very Low 1.00 0.55 0.71 11avg / total 0.93 0.91 0.91 101

    總結(jié)

    以上是生活随笔為你收集整理的数据分析 | KNN模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。