1. 程式人生 > >python機器學習庫sklearn——K最近鄰、K最近鄰分類、K最近鄰迴歸

python機器學習庫sklearn——K最近鄰、K最近鄰分類、K最近鄰迴歸

這裡只講述sklearn中如何使用KNN演算法。

無監督最近鄰

NearestNeighbors (最近鄰)實現了 unsupervised nearest neighbors learning(無監督的最近鄰學習)。 它為三種不同的最近鄰演算法提供統一的介面:BallTree, KDTree, 還有基於 sklearn.metrics.pairwise 的 brute-force 演算法。演算法的選擇可通過關鍵字 ‘algorithm’ 來控制, 並必須是 [‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’] 其中的一個。當預設值設定為 ‘auto’ 時,演算法會嘗試從訓練資料中確定最佳方法。

# ========無監督查詢最近鄰(常在聚類中使用,例如變色龍聚類演算法)==========

from sklearn.neighbors import NearestNeighbors
import numpy as np # 快速操作結構陣列的工具

X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])  # 樣本資料
test_x = np.array([[-3.2, -2.1], [-2.6, -1.3], [1.4, 1.0], [3.1, 2.6], [2.5, 1.0], [-1.2, -1.3]]
) # 設定測試資料 # test_x=X # 測試資料等於樣本資料。這樣就相當於在樣本資料內部查詢每個樣本的鄰節點了。 nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X) # 為X生成knn模型 distances, indices = nbrs.kneighbors(test_x) # 為test_x中的資料尋找模型中的鄰節點 print('鄰節點:',indices) print('鄰節點距離:',distances) # ==============================使用kd樹和Ball樹實現無監督查詢最近鄰======================== from sklearn.neighbors import KDTree,BallTree import numpy as np # 快速操作結構陣列的工具 X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]
) # test_x = np.array([[-3.2, -2.1], [-2.6, -1.3], [1.4, 1.0], [3.1, 2.6], [2.5, 1.0], [-1.2, -1.3]]) # 設定測試資料 test_x=X # 測試資料等於樣本資料。這樣就相當於在樣本資料內部查詢每個樣本的鄰節點了。 kdt = KDTree(X, leaf_size=30, metric='euclidean') distances,indices = kdt.query(test_x, k=2, return_distance=True) print('鄰節點:',indices) print('鄰節點距離:',distances)

最近鄰分類

scikit-learn 實現了兩種不同的最近鄰分類器:KNeighborsClassifier 基於每個查詢點的 k 個最近鄰實現,其中 k 是使用者指定的整數值。RadiusNeighborsClassifier 基於每個查詢點的固定半徑 r 內的鄰居數量實現, 其中 r 是使用者指定的浮點數值。

k -鄰居分類是 KNeighborsClassifier 下的兩種技術中比較常用的一種。k 值的最佳選擇是高度依賴資料的:通常較大的 k 是會抑制噪聲的影響,但是使得分類界限不明顯。

如果資料是不均勻取樣的,那麼 RadiusNeighborsClassifier 中的基於半徑的近鄰分類可能是更好的選擇。

RadiusNeighborsClassifier 中使用者指定一個固定半徑 r,使得稀疏鄰居中的點使用較少的最近鄰來分類。

對於高維引數空間,這個方法會由於所謂的 “維度災難” 而變得不那麼有效。

在兩種k最近鄰分類中,基本的最近鄰分類使用統一的權重:分配給查詢點的值是從最近鄰的簡單多數投票中計算出來的。 在某些環境下,最好對鄰居進行加權,使得更近鄰更有利於擬合。可以通過 weights 關鍵字來實現。

預設值 weights = ‘uniform’ 為每個近鄰分配統一的權重。而 weights = ‘distance’ 分配權重與查詢點的距離成反比。 或者,使用者可以自定義一個距離函式用來計算權重。

# ==========k最近鄰分類=========
import numpy as np # 快速操作結構陣列的工具
from sklearn.neighbors import KNeighborsClassifier,KDTree   # 匯入knn分類器


# 資料集。4種屬性,3種類別
data=[
    [ 5.1,  3.5,  1.4,  0.2, 0],
    [ 4.9,  3.0,  1.4,  0.2, 0],
    [ 4.7,  3.2,  1.3,  0.2, 0],
    [ 4.6,  3.1,  1.5,  0.2, 0],
    [ 5.0,  3.6,  1.4,  0.2, 0],
    [ 7.0,  3.2,  4.7,  1.4, 1],
    [ 6.4,  3.2,  4.5,  1.5, 1],
    [ 6.9,  3.1,  4.9,  1.5, 1],
    [ 5.5,  2.3,  4.0,  1.3, 1],
    [ 6.5,  2.8,  4.6,  1.5, 1],
    [ 6.3,  3.3,  6.0,  2.5, 2],
    [ 5.8,  2.7,  5.1,  1.9, 2],
    [ 7.1,  3.0,  5.9,  2.1, 2],
    [ 6.3,  2.9,  5.6,  1.8, 2],
    [ 6.5,  3.0,  5.8,  2.2, 2],
]

# 構造資料集
dataMat = np.array(data)
X = dataMat[:,0:4]
y = dataMat[:,4]

knn = KNeighborsClassifier(n_neighbors=2,weights='distance')    # 初始化一個knn模型,設定k=2。weights='distance'樣本權重等於距離的倒數。'uniform'為統一權重
knn.fit(X, y)                                          #根據樣本集、結果集,對knn進行建模
result = knn.predict([[3, 2, 2, 5]])                   #使用knn對新物件進行預測
print(result)

最近鄰迴歸

最近鄰迴歸是用在資料標籤為連續變數,而不是離散變數的情況下。分配給查詢點的標籤是由它的最近鄰標籤的均值計算而來的。

scikit-learn 實現了兩種不同的最近鄰迴歸:KNeighborsRegressor 基於每個查詢點的 k 個最近鄰實現, 其中 k 是使用者指定的整數值。RadiusNeighborsRegressor 基於每個查詢點的固定半徑 r 內的鄰點數量實現, 其中 r 是使用者指定的浮點數值。

基本的最近鄰迴歸使用統一的權重:即,本地鄰域內的每個鄰點對查詢點的分類貢獻一致。 在某些環境下,對鄰點加權可能是有利的,使得附近點對於迴歸所作出的貢獻多於遠處點。 這可以通過 weights 關鍵字來實現。預設值 weights = ‘uniform’ 為所有點分配同等權重。 而 weights = ‘distance’ 分配的權重與查詢點距離呈反比。 或者,使用者可以自定義一個距離函式用來計算權重。

# ==============================k最近鄰迴歸========================

import numpy as np
import matplotlib.pyplot as plt
from sklearn import neighbors

np.random.seed(0)
X = np.sort(5 * np.random.rand(40, 1), axis=0)
T = np.linspace(0, 5, 500)[:, np.newaxis]
y = np.sin(X).ravel()

# 為輸出值新增噪聲
y[::5] += 1 * (0.5 - np.random.rand(8))

# 訓練迴歸模型
n_neighbors = 5

for i, weights in enumerate(['uniform', 'distance']):
    knn = neighbors.KNeighborsRegressor(n_neighbors, weights=weights)
    y_ = knn.fit(X, y).predict(T)

    plt.subplot(2, 1, i + 1)
    plt.scatter(X, y, c='k', label='data')
    plt.plot(T, y_, c='g', label='prediction')
    plt.axis('tight')
    plt.legend()
    plt.title("KNeighborsRegressor (k = %i, weights = '%s')" % (n_neighbors,weights))

plt.show()

相關推薦

python機器學習sklearn——K近鄰K近鄰分類K近鄰迴歸

這裡只講述sklearn中如何使用KNN演算法。 無監督最近鄰 NearestNeighbors (最近鄰)實現了 unsupervised nearest neighbors learning(無監督的最近鄰學習)。 它為三種不同的最近鄰演算法

Python機器學習sklearn裡利用感知機進行三分類(多分類)的原理

from IPython.display import Image %matplotlib inline # Added version check for recent scikit-learn 0.18 checks from distutils.vers

python機器學習sklearn——Lasso迴歸(L1正則化)

Lasso The Lasso 是估計稀疏係數的線性模型。 它在一些情況下是有用的,因為它傾向於使用具有較少引數值的情況,有效地減少給定解決方案所依賴變數的數量。 因此,Lasso 及其變體是壓縮感知領域的基礎。 在一定條件下,它可以恢復一組非零權重的

python機器學習sklearn——樸素貝葉斯分類

在scikit-learn中,一共有3個樸素貝葉斯的分類演算法類。分別是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先驗為高斯分佈的樸素貝葉斯,MultinomialNB就是先驗為多項式分佈的樸素

Python機器學習SKLearn:資料集轉換之預處理資料

資料集轉換之預處理資料:       將輸入的資料轉化成機器學習演算法可以使用的資料。包含特徵提取和標準化。       原因:資料集的標準化(服從均值為0方差為1的標準正態分佈(高斯分佈))是大多數機器學習演算法的常見要求。      如果原始資料不服從高斯分佈,在預測時

Python機器學習sklearn幾種迴歸演算法建模及分析(實驗)

最簡單的迴歸模型就是線性迴歸 資料匯入與視覺化分析 from IPython.display import Image %matplotlib inline # Added version che

Python機器學習sklearn網格搜尋與交叉驗證

網格搜尋一般是針對引數進行尋優,交叉驗證是為了驗證訓練模型擬合程度。sklearn中的相關API如下: (1)交叉驗證的首要工作:切分資料集train/validation/test A.)沒指定資料切分方式,直接選用cross_val_scor

Python機器學習sklearn裡利用LR模型進行三分類(多分類)的原理

首先,LR將線性模型利用sigmoid函式進一步做了非線性對映。 將分類超平面兩側的正負樣本點,通過壓縮函式轉化成了以0.5為分解的兩類:類別0和類別1。 這個轉化過程見下圖: 上圖給出的是線性邊界與LR分佈函式(即sigmoid函式)的對映對應關係;同樣,對於非線

python機器學習sklearn——支援向量機svm

支援向量機的優勢在於: 在高維空間中非常高效.即使在資料維度比樣本數量大的情況下仍然有效. 在決策函式(稱為支援向量)中使用訓練集的子集,因此它也是高效利用記憶體的. 通用性: 不同的核函式與特定的決策函式一一對應.常見的 kernel 已經提供,也

2018年受歡迎Python機器學習介紹

Python Python開發 Python全棧 機器學習庫 Python是一種面向對象的解釋型計算機程序設計語言,具有豐富和強大的庫,再加上其簡單、易學、速度快、開源免費、可移植性、可擴展性以及面向對象的特點,Python成為2017年最受歡迎的最受歡迎的編程語言! 人工智能是當前最

Python機器學習 sklearn

安裝: pip install -U scikit-learn 資料標準化 from sklearn import preprocessing a = np.array([[10, 2.7, 3.6], [-100, 5, -2],

基於python機器學習Sklearn

scikit-learn,也稱為sklearn,是基於python的機器學習庫,可以方便進行機器學習演算法的實施,包括:分類、迴歸、聚類、降維、模型選擇和預處理等資料探勘的相關演算法。 下面是對官方文件進行學習的收穫,以程式碼的形式將官方文件的內容翻譯記錄

[機器學習]基於python機器學習Sklearn-01

1.1 廣義線性模型 以下介紹的方法均是用於求解迴歸問題,其目標值預計是輸入值的一個線性組合.用數學語言表示: 假設y是預測值,則有: 在本節中,稱向量:為係數. 若要講通用的線性模型用於分類問題,可以參考Logistic迴歸 1.1.1

Python機器學習scikit-learn實踐

.get new 安裝 gis 支持 兩個 clas mod 神經網絡 一、概述 機器學習算法在近幾年大數據點燃的熱火熏陶下已經變得被人所“熟知”,就算不懂得其中各算法理論,叫你喊上一兩個著名算法的名字,你也能昂首挺胸脫口而出。當然了,算法之林雖大,但能者還是

比較好的Python機器學習有哪些?

Python是一種面向物件的解釋型計算機程式設計語言,具有豐富和強大的庫,再加上其簡單、易學、速度快、開源免費、可移植性、可擴充套件性以及面向物件的特點,Python成為2017年最受歡迎的最受歡迎的程式語言! 人工智慧是當前最熱門話題之一,機器學習技術是人工智慧實現必備技能,Python程式語

python機器學習——結巴中文分詞

結巴中文分詞 安裝: pip install jieba1 特點: 支援三種分詞模式: 精確模式,試圖將句子最精確地切開,適合文字分析; 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義; 搜尋引擎模式,在精確

python機器學習----利用sklearn進行情感分析

import jieba from collections import defaultdict import os from sklearn.feature_extraction.text import TfidfTransformer from sklear

python機器學習的使用

常見機器學習演算法名單 1.線性迴歸 線性迴歸通常用於根據連續變數估計實際數值(房價、呼叫次數、總銷售額等)。我們通過擬合最佳直線來建立自變數和因變數的關係。這條最佳直線叫做迴歸線,並且用 Y= a *X + b 這條線性等式來表示。 理解線性迴歸的最好辦法是回顧一下童年。

Python機器學習scikit-learn

概述 scikit-learn 是機器學習領域非常熱門的一個開源庫,基於Python 語言寫成。可以免費使用。 而且使用非常的簡單,文件感人,非常值得去學習。 下面是一張scikit-learn的圖譜: 我們可以看到,機器學習分為四大塊,分別是 cla

python機器學習xgboost——xgboost演算法

安裝 更新:現在已經可以通過pip install xgboost線上安裝庫了。 xgboost簡介 xgboost一般和sklearn一起使用,但是由於sklearn中沒有整合xgboost,所以才需要單獨下載安裝。 xgboost是在GB