机器学习入门KNN近邻算法(一)
1 機器學習處理流程:
2 機器學習分類:
有監督學習
主要用于決策支持,它利用有標識的歷史數據進行訓練,以實現對新數據的表示的預測
1 分類
分類計數預測的數據對象是離散的。如短信是否為垃圾短信,用戶是否喜歡電子產品
常用方法: K近鄰、樸素貝葉斯、決策樹、SVM
2 回歸
回歸技術預測的數據對象是連續值。例如溫度變化或時間變化。包括一元回歸和多元回歸,線性回歸和非線性回歸
常用方法: 線性回歸、邏輯回歸、嶺回歸
無監督學習
主要用于知識發現,在歷史數據中發現隱藏的模式或內在結構
1 聚類
聚類算法用于在數據中尋找隱藏的模式或分組。K-means
半監督學習
在半監督學習方式下,訓練數據有部分被標識,部分沒有被標識,這種模型首先需要學習數據的內在結構,以便合理的組織數據來進行預測。算法上,包括一些對常用監督式學習算法的延伸,這些算法首先試圖對未標識數據進行建模,在此基礎上再對標識的數據進行預測。
常見方法: 深度學習
3 K-近鄰算法原理
KNN概述
簡單來說,K-近鄰算法采用測量不同特征值之間的距離方法進行分類(k-Nearest Neighbor,KNN)
優點: 精度高、對異常值不敏感、無數據輸入假定
缺點: 時間復雜度高、空間復雜度高
1、當樣本不平衡時,比如一個類的樣本容量很大,其他類的樣本容量很小,輸入一個樣本的時候,K個臨近值中大多數都是大樣本容量的那個類,這時可能就會導致分類錯誤。改進方法是對K臨近點進行加權,也就是距離近的點的權值大,距離遠的點權值小。
2、計算量較大,每個待分類的樣本都要計算它到全部點的距離,根據距離排序才能求得K個臨近點,改進方法是:先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。
適用數據范圍 : 數值型和標稱型
1 標稱型:標稱型目標變量的結果只在有限目標集中取值,如真與假(標稱型目標變量主要用于分類)
2 數值型:數值型目標變量則可以從無限的數值集合中取值,如0.100,42.001等 (數值型目標變量主要用于回歸分析)
工作原理
1 樣本訓練集
2 電影類別KNN分析
3 歐幾里得距離(歐式距離)
4 KNN計算過程流程圖
入門案例 : 電影類型分析
電影名稱 動作鏡頭 接吻鏡頭 電影類別 0 前任三 2 15 愛情 1 復仇者聯盟 36 3 動作 2 殺破狼 24 1 動作 3 戰狼 29 2 動作 4 泰坦尼克號 1 18 愛情 5 大話西游 29 3 愛情 6 星愿 2 20 愛情 7 西游記 25 2 動作 8 七月與安生 3 19 愛情 import numpy as np import pandas as pd from pandas import Series,DataFrameimport matplotlib.pyplot as plt %matplotlib inline #從excel讀取數據 films = pd.read_excel('films.xlsx',sheet_name=1) train = films[['動作鏡頭','接吻鏡頭']] target = films['電影類別']# 創建機器學習模型 from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier()# 對knn模型進行訓練 # 構建函數原型、構建損失函數、求損失函數最優解 knn.fit(train,target) ''' KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',metric_params=None, n_jobs=1, n_neighbors=5, p=2,weights='uniform') ''' #輸入兩個案例 cat = np.array([[3,16],[20,4]]) # 使用predict函數對數據進行預測 knn.predict(cat)plt.scatter(train.values[:,0],train.values[:,1]) plt.scatter(cat[:,0],cat[:,1],color='red')KNN近鄰機器學習案例2
from sklearn.neighbors import KNeighborsClassifier import numpy as np #knn對象 neigh = KNeighborsClassifier(n_neighbors=3)#身高、體重、鞋的尺寸 X = np.array([[181,80,44],[177,70,43],[160,60,38],[154,54,37],[166,65,40],[190,90,47],[175,64,39],[177,70,40],[159,55,37],[171,75,42],[181,85,43]]) display(X) y = ['male','male','female','female','male','male','female','female','female','male','male']# 第1步:訓練數據 neigh.fit(X,y) # 第2步:預測數據 Z = neigh.predict(np.array([[190,70,43],[168,55,37]]))display(Z) #array(['male', 'female'], dtype='<U6') 識別出對應的性格
4 KNN用于分類
用于分類的numpy方法介紹
np.meshgrid 從坐標向量返回坐標矩陣
import numpy as np nx, ny = 3, 4 x = np.linspace(0, 1, nx) y = np.linspace(0, 1, ny) xv, yv = np.meshgrid(x, y) display(x,y,xv,yv)輸出:
[ 0. , 0.5, 1. ],[ 0. , 0.5, 1. ],[ 0. , 0.5, 1. ]])
array([ 0. , 0.5, 1. ])
array([ 0. , 0.33333333, 0.66666667, 1. ])
array([[ 0. , 0.5, 1. ],array([[ 0. , 0. , 0. ],
[ 0.33333333, 0.33333333, 0.33333333],
[ 0.66666667, 0.66666667, 0.66666667],
[ 1. , 1. , 1. ]])
```np.ravel 返回一個連續的平坦矩陣
x = np.array([[1, 2, 3], [4, 5, 6]]) display(x,x.ravel())#輸出: array([[1, 2, 3],[4, 5, 6]]) array([1, 2, 3, 4, 5, 6])np.c_ 將切片對象按第二軸轉換為串聯
np.c_[np.array([1,2,3]), np.array([4,5,6])]#輸出: array([[1, 4],[2, 5],[3, 6]])具體操作
# 導入庫:KNeighborsClassifier import numpy as np from sklearn.neighbors import KNeighborsClassifier import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap# 導入sklearn自帶數據集 from sklearn import datasets# 得到訓練樣本 iris = datasets.load_iris() X = iris.data[:,:2] y = iris.target#定義三種顏色代表三種藍蝴蝶 cmap_species = ListedColormap(['#FF0000','#00FF00','#0000FF']) #c對應顏色池映射到target值 plt.scatter(X[:,0],X[:,1],c = y,cmap = cmap_species) plt.show()繪制圖形之后進行KNN
#定義KNN分類器 clf = KNeighborsClassifier(n_neighbors=10)# 第1步:訓練分類器 clf.fit(X,y)# 圖片的顯示范圍,畫布的邊界范圍 x_min, x_max = X[:,0].min()-1, X[:,0].max()+1 y_min, y_max = X[:,1].min()-1, X[:,1].max()+1# 圖片的背景顯示坐標 xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),np.arange(y_min,y_max,0.02))# 第2步:預測 ravel()數據扁平化 Z = clf.predict(np.c_[xx.ravel(),yy.ravel()]) z = Z.reshape(xx.shape)cmap_background = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF']) # 顯示背景的顏色 plt.pcolormesh(xx,yy,z,cmap=cmap_background)# 顯示點的顏色 plt.scatter(X[:,0],X[:,1],c = y,cmap=cmap_species) plt.xlim(xx.min(),xx.max()) plt.ylim(yy.min(),yy.max()) plt.title('3-class classification') plt.show()
5 KNN用于回歸
import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import KNeighborsRegressor %matplotlib inlinex = np.linspace(0,2*np.pi,40) y = np.sin(x) plt.scatter(x,y) plt.xlabel('feature') plt.ylabel('target')# 隨機數種子,用于固定隨機數 np.random.seed(2) noise = np.random.random(size=20) - 0.5 y[::2] += noise plt.scatter(x,y)# 生成knn回歸模型 # n_neighbors 就是距離預測樣本最近的點的個數 knn = KNeighborsRegressor(n_neighbors=19) knn.fit(x.reshape(-1,1),y)# 獲取預測樣本集 # 預測數據的形狀應該和訓練數據的形狀一致(不要求數量一致,要求特征一致) X_test = np.linspace(0,2*np.pi,100).reshape(-1,1) y_ = knn.predict(X_test)plt.plot(X_test,y_,color='orange',label='predict') plt.scatter(x,y,color='blue',label='true-data') plt.legend() # 創建多個算法模型,采用不同的參數,查看回歸的結果 knn1 = KNeighborsRegressor(n_neighbors=1) knn2 = KNeighborsRegressor(n_neighbors=7) knn3 = KNeighborsRegressor(n_neighbors=21)knn1.fit(x.reshape(-1,1),y) knn2.fit(x.reshape(-1,1),y) knn3.fit(x.reshape(-1,1),y)y1_ = knn1.predict(X_test) y2_ = knn2.predict(X_test) y3_ = knn3.predict(X_test)# 擬合度過高,稱為過擬合,對數據分析的過于在意局部特征 plt.plot(X_test,y1_,color='orange',label='n_neighbors=1') # 擬合度剛好,稱為最佳擬合,這是機器學習的終極目標,調參就是為了達到這個目的 plt.plot(X_test,y2_,color='cyan',label='n_neighbors=7') # 擬合度太差,稱為欠擬合,對數據特征分析不透徹,數據有效特征太少,樣本數量太少 plt.plot(X_test,y3_,color='red',label='n_neighbors=21') plt.scatter(x,y,color='blue',label='true-data') plt.legend()轉載于:https://www.cnblogs.com/why957/p/9318410.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的机器学习入门KNN近邻算法(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang 防知乎 中文验证码 源码
- 下一篇: 2015 提高组 跳石头--二分答案