機器學習入門KNN近鄰算法(一)


1 機器學習處理流程:

2 機器學習分類:

  • 有監督學習python

    主要用於決策支持,它利用有標識的歷史數據進行訓練,以實現對新數據的表示的預測算法

    1 分類dom

    分類計數預測的數據對象是離散的。如短信是否爲垃圾短信,用戶是否喜歡電子產品機器學習

    經常使用方法: K近鄰、樸素貝葉斯、決策樹、SVM函數

    2 迴歸學習

    迴歸技術預測的數據對象是連續值。例如溫度變化或時間變化。包括一元迴歸和多元迴歸,線性迴歸和非線性迴歸spa

    經常使用方法: 線性迴歸、邏輯迴歸、嶺迴歸3d

  • 無監督學習rest

    主要用於知識發現,在歷史數據中發現隱藏的模式或內在結構excel

    1 聚類

    聚類算法用於在數據中尋找隱藏的模式或分組。K-means

  • 半監督學習

    在半監督學習方式下,訓練數據有部分被標識,部分沒有被標識,這種模型首先須要學習數據的內在結構,以便合理的組織數據來進行預測。算法上,包括一些對經常使用監督式學習算法的延伸,這些算法首先試圖對未標識數據進行建模,在此基礎上再對標識的數據進行預測。

    常見方法: 深度學習

3 K-近鄰算法原理

  • KNN概述

    簡單來講,K-近鄰算法採用測量不一樣特徵值之間的距離方法進行分類(k-Nearest Neighbor,KNN)

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

    缺點: 時間複雜度高、空間複雜度高

    一、當樣本不平衡時,好比一個類的樣本容量很大,其餘類的樣本容量很小,輸入一個樣本的時候,K個臨近值中大多數都是大樣本容量的那個類,這時可能就會致使分類錯誤。改進方法是對K臨近點進行加權,也就是距離近的點的權值大,距離遠的點權值小。

    二、計算量較大,每一個待分類的樣本都要計算它到所有點的距離,根據距離排序才能求得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 返回一個連續的平坦矩陣

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

相關文章
相關標籤/搜索