knn人脸识别判断_WEEK1_LRamp;KNN
第一節 機器學習介紹 by 袁源老師
因為是導入的又Jupyter notebook導出的MD文件,所以排版有些混亂。抱歉。
理論知識
機器學習是人工智能(AI)的一部分,研究如何讓計算機從數據學習某種規律。 具體而言可以應用在: + 通過計算機程序根據數據去優化某一個評價指標 + 自動的從數據發現規律,使用這些規律做出預測 + 根據過去預測未來
大數據指的是各種來源的大量非結構化的或者結構化的數據
數據挖掘指的是從數據中發現信息
機器學習、大數據、數據挖掘各自都有關聯,但是并非包含關系。
機器學習分為監督式學習與非監督式學習以及半監督式學習,從數據設置上看,它們之間的區別為:
- 監督學習任務:從已標記的訓練數據來訓練模型。 主要分為:分類任務、回歸任務、序列標注任務。
- 無監督學習任務:從未標記的訓練數據來訓練模型。主要分為:聚類任務、降維任務。
- 半監督學習任務:用大量的未標記訓練數據和少量的已標記數據來訓練模型。
Note: 可以這樣簡單地去理解“標簽”的含義,比如說,有若干張圖片,都是水果,有的貼了蘋果的標簽,有的貼了香蕉的標簽 ...給你一張新的圖片,讓你來判斷這張圖片里的東西是屬于哪種水果。這屬于監督式機器學習的分類,蘋果、香蕉就是標簽。
監督式學習(分類)實例:垃圾郵件/短信檢測、自動車牌號識別、人臉識別、手寫字符識別、語音識別、醫學影像的病癥診斷
監督式學習(回歸)實例:自動為二手車估價、預測股票價格、預測未來氣溫、自動駕駛
在選擇合適的機器學習模型進行模型訓練之前,要對數據進行預處理,主要包含以下4個步驟:
1. 特征提取:我個人的理解就是根據需求,把獲取的數據中有價值的部分提取出來,剔除與機器學習無關的數據。
2. 處理缺失數據:可以通過均值、中間值、眾數等等方法代替缺失的數據,不過在某一特征數據丟失率太高的時候,直接丟棄這個特征數據可能更好。
3. 數據定標:包含歸一化法和標準化法。(公式認真理解一下便可以輕松的記住。)
4. 數據轉換:包含One-Hot encoding, One/Two/MultiGram, Bag of words, 取對數 等等。
代碼實例
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression data = pd.read_csv("data/Advertising.csv") data.head()TV sales 0 230.1 22.1 1 44.5 10.4 2 17.2 9.3 3 151.5 18.5 4 180.8 12.9
data.columns Index(['TV', 'sales'], dtype='object') plt.figure(figsize=(16, 8)) plt.scatter(data['TV'], data['sales'], c ='black') plt.xlabel("Money spent on TV ads") plt.ylabel("Sales") plt.show()X = data['TV'].values.reshape(-1,1) y = data['sales'].values.reshape(-1,1)reg = LinearRegression() reg.fit(X, y) LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False) print('a = {:.5}'.format(reg.coef_[0][0])) print('b = {:.5}'.format(reg.intercept_[0]))print("線性模型為: Y = {:.5}X + {:.5} ".format(reg.coef_[0][0], reg.intercept_[0])) a = 0.047537 b = 7.0326 線性模型為: Y = 0.047537X + 7.0326 predictions = reg.predict(X)plt.figure(figsize=(16, 8)) plt.scatter(data['TV'], data['sales'], c ='black') plt.plot(data['TV'], predictions,c ='blue', linewidth=2) plt.xlabel("Money spent on TV ads") plt.ylabel("Sales") plt.show()課后作業
- 氣溫會隨著海拔高度的升高而降低, 我們可以通過測量不同海拔高度的氣溫來預測海拔高度和氣溫的關系.
- 我們假設海拔高度和氣溫的關系可以使用如下公式表達: y(氣溫) = a * x(海拔高度) + b
- 理論上來講, 確定以上公式 a 和 b的值只需在兩個不同高度測試, 就可以算出來 a 和 b 的值了. 但是由于所有的設備都是有誤差的, 而使用更多的高度測試的值可以使得預測的值更加準確.
- 我們提供了在9個不同高度測量的氣溫值, 請你根據今天學習的線性回歸方法預測 a 和 b 的值. 根據這個公式, 我們預測一下在8000米的海拔, 氣溫會是多少?
- 數據文件請見exercise/height.vs.temperature.csv
height temperature 0 0.0 12.834044 1 500.0 10.190649 2 1000.0 5.500229 3 1500.0 2.854665 4 2000.0 -0.706488
data.columns #顯示每一列的標題 Index(['height', 'temperature'], dtype='object') plt.figure(figsize=(16, 8)) plt.scatter(data['height'], data['temperature'], c ='blue') plt.xlabel("Height") plt.ylabel("Temperature") plt.show()X = data['height'].values.reshape(-1, 1) y = data['temperature'].values.reshape(-1, 1) reg = LinearRegression() reg.fit(X, y) LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False) print('a = {:.5}'.format(reg.coef_[0][0])) #打印斜率 print('b = {:.5}'.format(reg.intercept_[0])) #打印截距print("線性模型為: Y = {:.5}X + {:.5} ".format(reg.coef_[0][0], reg.intercept_[0])) a = -0.0065695 b = 12.719 線性模型為: Y = -0.0065695X + 12.719可視化訓練好的線性回歸模型
predictions = reg.predict(X)plt.figure(figsize=(16, 8)) plt.scatter(data['height'], data['temperature'], c ='black') plt.plot(data['height'], predictions,c ='blue', linewidth=2) plt.xlabel("Height") plt.ylabel("Temperature") plt.show()做預測
我們預測一下在8000米的海拔, 氣溫會是多少?
predictions = reg.predict([[8000]]) print('在8000米的海拔, 氣溫大約是{:.5}攝氏度'.format( predictions[0][0]) ) 在8000米的海拔, 氣溫大約是-39.838攝氏度心得體會
這是機器學習的第一節課,通過老師的講解,了解了與機器學習的各種概念以及機器學習的大致流程。
通過學習案例,也成功地將線性回歸算法應用到了溫度預測問題上。
雖然簡單,但是感覺只要一步一步踏踏實實的學習積累,肯定會很有收獲。
代碼一定要自己寫出來,而不能復制粘貼。只有自己寫,才能清楚代碼的含義,熟悉機器學習的流程。復制粘貼代碼只能給自己一種以為自己學會了的錯覺。不要自欺欺人。
第二節 K-NN最近鄰 by 李文哲老師
理論知識
KNN算法是機器學習所應用的算法中最簡單的算法之一。有人用一句成語來形容這個算法:近朱者赤近墨者黑。感覺說得挺有道理的。 用我自己最通俗的語言的來講,KNN算法的核心思想就是離誰近就和誰屬于一類。具體而言,還要考慮“多近”的問題,也就是K值選取的問題。還有“近”的度量問題,我們在這節課學習過程中主要是使用歐式距離公式來度量距離的。
疑惑
老師提問過,為什么在歷程中K值選取的都是奇數呢?最后老師給出的答案是防止平手。
可以我仍然不太理解,為什么選取奇數就能避免平手的情況出現呢?
代碼實例
1. 調用KNN函數實現分類
使用經典的iris數據,是三分類問題
#獨缺相應的庫 from sklearn import datasets #導入自帶的數據集 from sklearn.model_selection import train_test_split #導入訓練數據和測試數據分類函數 from sklearn.neighbors import KNeighborsClassifier #導入KNN分類器 import numpy as np #導入做矩陣運算常用的numpy庫 #讀取數據X, y iris = datasets.load_iris() X = iris.data y = iris.target #print(X, y) # 把數據分成訓練數據和測試數據 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 47) # 創建KNN模型, K值為3, 并作訓練 clf = KNeighborsClassifier(n_neighbors = 3) clf.fit(X_train, y_train) KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',metric_params=None, n_jobs=1, n_neighbors=3, p=2,weights='uniform') #計算準確率 from sklearn.metrics import accuracy_score #導入準確率函數,Python真好用,想使用什么功能時隨時導入即可 :D print ("Accuracy is: %.3f" %(accuracy_score(y_test, clf.predict(X_test))))#如果想要自己計算和打印準確率,可以uncomment下面的兩行代碼 #correct = np.count_nonzero((clf.predict(X_test) == y_test) == True) #print ("Accuracy is: %.3f" %(correct/len(X_test))) Accuracy is: 0.974為什么要在進行訓練數據和測試數據分類時,也就是調用train_test_split函數時要傳random_state參數?它有什么含義?
因為該函數在分類時,是隨機地分配。使用random_state參數,可以保證保證優化算法時訓練數據和測試數據分類的結果相同,也就是分類的結果是一致的,不會改變。
參數分為模型參數(Model parameter)和超參數(Hyper parameter) KNN中K就是超參數。可以把超參數理解成開關,它用來控制模型如何去訓練。找到最好的超參數的過程叫做調參。
KNN算法中需要考慮的幾個問題 1. 把一個物體表示成向量,這個過程也叫做特征工程(Feature Engineering),目標是提取有價值的信息并用向量表示出來。 2. 標記好每個物體的標簽 3. 計算兩個物體之間的距離/相似度 4. 選擇合適的K
決策邊界決定“線性分類器”或者“非線性分類器”
在選定決策邊界時既需要考慮分類的準確性,還要考慮穩定性。也就是說,曲線不能太陡峭。
一般而言,K值越大,決策曲線會變得越來越平滑,但是K值過大的話,就會有過擬合的問題。
交叉驗證 把訓練數據進一步分成訓練數據(Training Data)和驗證數據(Validation Data)。選擇在驗證數據里最好的超參數組合。
一定要牢記,測試數據只能用來做測試,不能用來做訓練。
特征的縮放 1. 線性歸一化(Min-max Normalization) 2. 標準差標準化(Z-score Normalization)
這里和在第一節課中袁源老師講解的內容一樣。
心得體會
老師講解的預測二手車價格的例子很實用,大致的流程可以理解,有些代碼細節還不是很明白。今天加班沒有把作業完成。很遺憾。
計劃把前面代碼中發現的問題整理出來咨詢一下老師。
問題列表
為什么預測在做KNN訓練時,y_train數據要加ravel函數?
熱力圖表示的是什么含義?
...
The drop of rain makes a hole in the stone, not by violence, but by of falling.
總結
以上是生活随笔為你收集整理的knn人脸识别判断_WEEK1_LRamp;KNN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stata中计算公式命令_珠联璧合:把J
- 下一篇: 绘图的尺寸_AutoCAD新功能:参数化