重點內容
對機器學習的理解,所謂機器學習,就是機器從資料中學習,機器從資料中學出規律,然後運用到新的資料中,在機器學習中,前者稱為訓練集,後者稱為測試集。
學機器學習,我們第乙個往往學的是線性回歸(linear regression),在這裡,我從吳恩達教授講的例子說起,吳恩達講的是乙個房屋**與面積的關係,已知一部分房屋的面積與其**,讓我們**新的房子的**。
我們的目的是要找到一條直線,是的這些點盡量要靠攏這條直線。那麼要如何找到這條直線呢?
接下來,我們就要建立乙個模型,我們設房屋面積為x,那麼房屋的**可以用下式來表示:
上面的關係式中,x是特徵,h(x)是標籤,在本例中特徵可以是房屋面積,房屋的臥室數目,房屋所處的樓層,只要是能夠影響或者決定**的因素都可以算,而theta(抱歉,我找不到mathtype編輯器在哪)是引數,可以稱之為權重,也就是特徵能夠對標籤的貢獻是多大。
那麼,問題又來了,我們該如何選擇theta才能使得這個模型是相對準確的呢,在這裡我們需要定義乙個損失函式,也稱為懲罰函式,損失函式衡量的是**值與真實值之間的差異。損失函式定義如下:
之所以這樣定義損失是因為用數學問題很好解決,你也可以定義成其他方式,比如差的絕對值函式。
從上式看出,損失函式是乙個二次函式,也就是說他是乙個凸函式,具有全域性最優解,也是因為它具有凸函式的性質,它才可以用梯度下降演算法來解決,事實上,無論具有多少特徵,也改變不了損失函式具有全域性最優解的本質,例如當具有兩個特徵時,是乙個碗狀曲面,在本例中,損失函式是乙個二次函式,我畫了乙個二次函式:
損失函式就是上面圖的左右上下平移。接下來,我們就要求解theta了,我們的目的是要到達最低點,也就是讓損失函式最小,在這裡我們就想到了梯度,梯度是方向向量,因為某一點的梯度代表的是損失函式下降最快的方向,所以我們用導數更新theta.
為什麼是「減號」,我們來看損失函式,當某處的斜率是負值時,我們要增加theta,這樣就會離目標更近,當斜率是正值時,我們要減小theta,因此是「減號」。注意,損失函式的橫軸代表theta.
我寫了乙個**,是用的python.
**如下:
import matplotlib.pyplot as plt
import numpy as np
from numpy import *
# load the diabetes dataset 載入資料集
diabetes = datasets.load_diabetes()
# use only one feature 該資料共6維,取第三列
diabetes_x = diabetes.data[:, np.newaxis, 2]
# split the data into training/testing sets
diabetes_x_train = diabetes_x[:-20] #訓練集為除去後面的20個
##############
diabetes_x_train1=diabetes_x
##############
#diabetes_x_test = diabetes_x[-20:] #測試集為後20個
# split the targets into training/testing sets
diabetes_y_train = diabetes.target[:-20] #同
############
diabetes_y_train1=diabetes.target
#plt.scatter(diabetes_x_train1, diabetes_y_train1, color='black')
############
#定義loss function
x=diabetes_x_train1
y=diabetes_y_train1
w=np.zeros((2,1))
m=len(x)
x0=np.ones((1,m), dtype='float64')
xx=vstack((x0,x.t))#垂直連線函式
#estimation=np.dot(w.t,xx)
#j=0.5*np.dot(estimation-y,(estimation-y).t)
j0=np.zeros((1000,1),dtype='float64')
#梯度下降
#迭代次數1000,學習率0.1
lamada=0.1
iritation=1000
for i in range(1000):
estimation=np.dot(w.t,xx)
w0=w[0]-0.1/m*np.sum(estimation-y)
w1=w[1]-0.1/m*np.dot((estimation-y),x)
w[0]=w0
w[1]=w1
j0[i]=0.5/m*np.dot(estimation-y,(estimation-y).t)
plt.scatter(diabetes_x_train1, diabetes_y_train1, color='black')
plt.scatter(x.t,np.dot(w.t,xx), color='green', linewidth=1)
#plt.scatter(diabetes_x_train1[-20:], diabetes_y_train1[-20:], color='black')
#plt.plot(x.t[-20:],np.dot(w.t,xx)[-20:], color='green', linewidth=1)
plt.show()
t=arange(1000)
plt.plot(t,j0,color='red',linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
print("引數為:" ,w)
#總結一下,迭代過程中,估計值也會隨著引數的迭代而改變,第二,通常會除以乙個m,
#雖然我不知道為什麼沒有加m就會迭代不出來,反正我的是這樣,為什麼那條直線用plot畫不出來
#而我要畫scatter圖,為什麼,最終得到的引數是對的。
先寫到這裡,如有錯誤歡迎指正。
初步了解機器學習
1 特徵工程 2 train和test資料分割 3 模型訓練 4 5 交叉驗證 6 搜尋最優引數 我們以處理鳶花尾資料為例進行學習 首先是載入項 from future import print function 預先配置好的鳶尾花資料集 from sklearn.datasets import l...
人工智慧基礎 機器學習初步了解
今天學的機器學習部分,做一些總結 機器學習的一般過程 機器學習方法 有監督學習 supervised learning 從給定的有標註的訓練資料集中學習出一 個函式 模型引數 當新的資料到來時可以根據這個函式 結果。常見任務包 括分類與回歸。分類 輸出是類別標籤 回歸 輸出是實數 無監督學習 uns...
深度學習初步了解
深度學習興起,源於以下3個方面 傳統機器學習在處理原始形態的自然資料方面存在很大的侷限性。它需要技藝高超的工程師和經驗豐富的領域專家設計特徵提取器,將原始資料轉化為合適的中間表示形式或特徵向量,學習子系統,即分類器,然後對輸入模型進行檢測或分類。而深度學習較傳統機器學習的一大優勢是 它不需要人工設計...