機器學習入門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,DataFrame
    
    import 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')
    

    predict

    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)
    

    輸出:
    array([ 0. , 0.5, 1. ])
    array([ 0. , 0.33333333, 0.66666667, 1. ])
    array([[ 0. , 0.5, 1. ],

       [ 0. ,  0.5,  1. ],
       [ 0. ,  0.5,  1. ],
       [ 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  返回一個連續的平坦矩陣
    
    ```python
    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]])



- **具體操作**

```python
# 導入庫: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 inline

x = 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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM