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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Scikit-learn的分类器算法:k-近邻及案例

發布時間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scikit-learn的分类器算法:k-近邻及案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

k-近鄰算法采用測量不同特征值之間的距離來進行分類

優點:精度高、對異常值不敏感、無數據輸入假定

缺點:計算復雜度高、空間復雜度高

使用數據范圍:數值型和標稱型

一個例子弄懂k-近鄰

電影可以按照題材分類,每個題材又是如何定義的呢?那么假如兩種類型的電影,動作片和愛情片。動作片有哪些公共的特征?那么愛情片又存在哪些明顯的差別呢?我們發現動作片中打斗鏡頭的次數較多,而愛情片中接吻鏡頭相對更多。當然動作片中也有一些接吻鏡頭,愛情片中也會有一些打斗鏡頭。所以不能單純通過是否存在打斗鏡頭或者接吻鏡頭來判斷影片的類別。那么現在我們有6部影片已經明確了類別,也有打斗鏡頭和接吻鏡頭的次數,還有一部電影類型未知。

電影名稱打斗鏡頭接吻鏡頭電影類型
California Man3104愛情片
He's not Really into dues2100愛情片
Beautiful Woman181愛情片
Kevin Longblade10110動作片
Robo Slayer 3000995動作片
Amped II982動作片
?1890未知

那么我們使用K-近鄰算法來分類愛情片和動作片:存在一個樣本數據集合,也叫訓練樣本集,樣本個數M個,知道每一個數據特征與類別對應關系,然后存在未知類型數據集合1個,那么我們要選擇一個測試樣本數據中與訓練樣本中M個的距離,排序過后選出最近的K個,這個取值一般不大于20個。選擇K個最相近數據中次數最多的分類。那么我們根據這個原則去判斷未知電影的分類

電影名稱與未知電影的距離
California Man20.5
He's not Really into dues18.7
Beautiful Woman19.2
Kevin Longblade115.3
Robo Slayer 3000117.4
Amped II118.9

我們假設K為3,那么排名前三個電影的類型都是愛情片,所以我們判定這個未知電影也是一個愛情片。那么計算距離是怎樣計算的呢?

歐氏距離那么對于兩個向量點$$a{1}$$和$$a{2}$$之間的距離,可以通過該公式表示:

$$\sqrt{\left({x{1}-x{2}}\right)^{2}+\left({y{1}-y{2}}\right)^{2}}$$

如果說輸入變量有四個特征,例如(1,3,5,2)和(7,6,9,4)之間的距離計算為:

$$\sqrt{\left({1-7}\right)^{2}+\left({3-6}\right)^{2}+\left({5-9}\right)^{2}+\left({2-4}\right)^{2}}$$

sklearn.neighbors

sklearn.neighbors提供監督的基于鄰居的學習方法的功能,sklearn.neighbors.KNeighborsClassifier是一個最近鄰居分類器。那么KNeighborsClassifier是一個類,我們看一下實例化時候的參數

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)**""":param n_neighbors:int,可選(默認= 5),k_neighbors查詢默認使用的鄰居數:param algorithm:{'auto','ball_tree','kd_tree','brute'},可選用于計算最近鄰居的算法:'ball_tree'將會使用 BallTree,'kd_tree'將使用 KDTree,“野獸”將使用強力搜索。'auto'將嘗試根據傳遞給fit方法的值來決定最合適的算法。:param n_jobs:int,可選(默認= 1),用于鄰居搜索的并行作業數。如果-1,則將作業數設置為CPU內核數。不影響fit方法。""" import numpy as np from sklearn.neighbors import KNeighborsClassifierneigh = KNeighborsClassifier(n_neighbors=3)

Method

fit(X, y)

使用X作為訓練數據擬合模型,y作為X的類別值。X,y為數組或者矩陣

X = np.array([[1,1],[1,1.1],[0,0],[0,0.1]]) y = np.array([1,1,0,0]) neigh.fit(X,y)

kneighbors(X=None, n_neighbors=None, return_distance=True)

找到指定點集X的n_neighbors個鄰居,return_distance為False的話,不返回距離

neigh.kneighbors(np.array([[1.1,1.1]]),return_distance= False)neigh.kneighbors(np.array([[1.1,1.1]]),return_distance= False,an_neighbors=2)

predict(X)

預測提供的數據的類標簽

neigh.predict(np.array([[0.1,0.1],[1.1,1.1]]))

predict_proba(X)

返回測試數據X屬于某一類別的概率估計

neigh.predict_proba(np.array([[1.1,1.1]]))

本案例使用最著名的”鳶尾“數據集

該數據集曾經被Fisher用在經典論文中,目前作為教科書般的數據樣本預存在Scikit-learn的工具包中。

讀入Iris數據集細節資料

from sklearn.datasets import load_iris # 使用加載器讀取數據并且存入變量iris iris = load_iris()# 查驗數據規模 iris.data.shape# 查看數據說明(這是一個好習慣) print iris.DESCR

通過上述代碼對數據的查驗以及數據本身的描述,我們了解到Iris數據集共有150朵鳶尾數據樣本,并且均勻分布在3個不同的亞種;每個數據樣本有總共4個不同的關于花瓣、花萼的形狀特征所描述。由于沒有制定的測試集合,因此按照慣例,我們需要對數據進行隨即分割,25%的樣本用于測試,其余75%的樣本用于模型的訓練。

由于不清楚數據集的排列是否隨機,可能會有按照類別去進行依次排列,這樣訓練樣本的不均衡的,所以我們需要分割數據,已經默認有隨機采樣的功能。

對Iris數據集進行分割

from sklearn.cross_validation import train_test_split X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.25,random_state=42)

對特征數據進行標準化

from sklearn.preprocessing import StandardScalerss = StandardScaler() X_train = ss.fit_transform(X_train) X_test = ss.fit_transform(X_test)

K近鄰算法是非常直觀的機器學習模型,我們可以發現K近鄰算法沒有參數訓練過程,也就是說,我們沒有通過任何學習算法分析訓練數據,而只是根據測試樣本訓練數據的分布直接作出分類決策。因此,K近鄰屬于無參數模型中非常簡單一種。

from sklearn.datasets import load_iris from sklearn.cross_validation import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import classification_report from sklearn.model_selection import GridSearchCVdef knniris():"""鳶尾花分類:return: None"""# 數據集獲取和分割lr = load_iris()x_train, x_test, y_train, y_test = train_test_split(lr.data, lr.target, test_size=0.25)# 進行標準化std = StandardScaler()x_train = std.fit_transform(x_train)x_test = std.transform(x_test)# estimator流程knn = KNeighborsClassifier()# # 得出模型# knn.fit(x_train,y_train)## # 進行預測或者得出精度# y_predict = knn.predict(x_test)## # score = knn.score(x_test,y_test)# 通過網格搜索,n_neighbors為參數列表param = {"n_neighbors": [3, 5, 7]}gs = GridSearchCV(knn, param_grid=param, cv=10)# 建立模型gs.fit(x_train,y_train)# print(gs)# 預測數據print(gs.score(x_test,y_test))# 分類模型的精確率和召回率# print("每個類別的精確率與召回率:",classification_report(y_test, y_predict,target_names=lr.target_names))return Noneif __name__ == "__main__":knniris()

總結

以上是生活随笔為你收集整理的Scikit-learn的分类器算法:k-近邻及案例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。