<label id="jgr5k"></label>
    <legend id="jgr5k"><track id="jgr5k"></track></legend>

    <sub id="jgr5k"></sub>
  1. <u id="jgr5k"></u>
      久草国产视频,91资源总站,在线免费看AV,丁香婷婷社区,久久精品99久久久久久久久,色天使av,无码探花,香蕉av在线
      您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預覽,將在時失效
      人工智能開發(fā)者 正文
      發(fā)私信給恒亮
      發(fā)送

      0

      通過從零開始實現(xiàn)一個感知機模型,我學到了這些

      本文作者: 恒亮 2017-03-13 17:02
      導語:看到樣例中的代碼,你是直接復制粘貼?還是手動輸入?

      雷鋒網(wǎng)按:本文源自作者 Jean-Nicholas Hould 的個人博客,他是一位來自加拿大蒙特利爾的數(shù)據(jù)科學家,具有豐富的研發(fā)和實踐經(jīng)驗。本文節(jié)選自作者個人的學習筆記,原文見文末鏈接,雷鋒網(wǎng)編譯。

      對許多剛入門機器學習的開發(fā)者而言,許多參數(shù)和定義都顯得抽象、難以理解,可能許多人直到開始進入實際的項目研發(fā),都還沒能真正搞清楚這些參數(shù)和定義的確切含義。為此,我在這里故意避開 scikit-learn 等現(xiàn)成的算法工具,從零開始自己用 Python 實現(xiàn)了一個感知機二元分類器,一方面通過實際代碼深入認識了感知機的內部原理和相關參數(shù)的具體含義,另一方面也總結了一些自己的研發(fā)心得,希望對各位初學者有所幫助。

        什么是二元分類器(Binary Classifier)?

      通過從零開始實現(xiàn)一個感知機模型,我學到了這些

      分類器是基于一組特征來確定輸入元素所在類別的機器學習算法。例如,分類器可以根據(jù)一些既定特征,預測一個啤酒的類別。這些特征可以是酒精含量、香氣和外觀等。更詳細一點,例如一個基于機器學習的分類器,根據(jù) 8% 的酒精含量、100 IBU (International Bitterness Unit,國際苦味指數(shù))和強烈橙子香味,就能判斷一種啤酒是不是 Indian Pale Ale 。

      一般來說,機器學習可以分為三個主要的類型:無監(jiān)督學習,監(jiān)督學習和強化學習。分類器屬于監(jiān)督學習的范疇。所謂監(jiān)督學習就是我們提前知道待解問題的答案,即期望的輸出是已知的那些場景。例如在上述關于啤酒分類的例子中,我們完全可以想辦法得到一組描述啤酒各種特征和類別的數(shù)據(jù)集,然后基于這組數(shù)據(jù)對分類器展開訓練。

      這里我將實現(xiàn)的是一個二元分類器,是所有分類器中最簡單的一種,其輸出結果只有兩種:0 或 1 ,對或錯。

        怎么搭建機器學習模型?

      概括地說,要搭建和使用一個機器學習模型,一般分為如下四個步驟:

      1. 預處理

      2. 訓練

      3. 評估

      4. 預測

      通過從零開始實現(xiàn)一個感知機模型,我學到了這些

      預處理

      預處理是構建機器學習模型的第一步,該步驟的主要工作是獲取數(shù)據(jù),并對數(shù)據(jù)進行必要的預處理,以備后續(xù)使用。包括去掉數(shù)據(jù)中的冗余、格式整理以及選定與數(shù)據(jù)相關的特征等。預處理中的常見工作包括:

      從原始數(shù)據(jù)中提取特征

      清理并格式化數(shù)據(jù)

      刪除多余的特征(或高度相關的特征)

      優(yōu)化特征數(shù)

      標準化特征數(shù)據(jù)的范圍(也稱為特征縮放 Feature Scaling )

      隨機拆分數(shù)據(jù)集:訓練數(shù)據(jù)集和測試數(shù)據(jù)集

      訓練

      準備好數(shù)據(jù)之后,下一步是為目標任務選擇一個合適的算法。在下面的二元分類器中,我們選擇的算法名為感知機(perceptron)。通常各種算法都有各自的優(yōu)缺點,要根據(jù)目標任務靈活選擇。

      在這個步驟中,你可以先針對幾個不同算法展開測試,然后根據(jù)測試結果選擇性能最佳的算法。評估一個算法性能表現(xiàn)的方法有很多,在分類器場景中,一個最常用的方法是看分類精度(classification accuracy),即在所有輸入樣例中,正確分類的比例越高,算法就越優(yōu)秀。在這個步驟中,開發(fā)者需要調整選定算法的參數(shù),即所謂的超參數(shù)(Hyperparameters)過程。

      本文將主要關注二元分類器的訓練過程,深入探討算法的內在工作原理。如果你對機器學習流程中的其他步驟感興趣,可以通過文末鏈接閱讀更多其他內容。

      評估

      當模型訓練完成之后,就可以通過訓練數(shù)據(jù)集之外的未知數(shù)據(jù)對模型展開評估。評估中一個非常重要的指標是泛化誤差(Generalization Error),即一個算法面對未知數(shù)據(jù)集的預測精度究竟怎樣。一旦你對評估結果滿意,就可以通過模型進行真正的預測了。

        實現(xiàn)感知機

      下面開始搭建我們的分類器。這里我們選用的算法是感知機(perceptron),它是神經(jīng)網(wǎng)絡與支持向量機的基礎,是一種最簡單的二元分類器模型。Perceptron算法的思路雖然簡單,但功能強大,給定一個數(shù)據(jù)集,算法可以自動學習最佳權重系數(shù),然后乘以輸入特征,根據(jù)結果決定一個神經(jīng)元是否啟用。

      下面我們根據(jù)具體代碼簡述感知機模型的基本實現(xiàn)流程。

      首先,初始化一個權重等于零的數(shù)組,數(shù)組長度等于特征數(shù)加1。這里之所以加1,是為了存儲“閾值”(threshold)。這里需要注意的是,Perceptron算法要求特征必須是數(shù)字值。具體代碼如下:

      self.w_ = np.zeros(1 + X.shape[1])

      第二步,開始一個迭代次數(shù)為 n_iter 的循環(huán)。這是一個由數(shù)據(jù)科學家定義的超參數(shù)。具體代碼如下:

      for _ in range(self.n_iter):

      第三步,針對每個訓練數(shù)據(jù)和結果都開始一個循環(huán),這里的結果是指算法的最終期望輸出。由于我們搭建的是一個二元分類器,因此結果是 -1 或 1 兩種。

      基于數(shù)據(jù)點的特征,算法將計算出最終結果:-1 或 1 。這里的預測方法具體是指特征與適當權重的矩陣乘積。在乘積的基礎上加上此前定義好的閾值,如果結果大于 0 ,則預測為 1 ,否則為 -1.

      算法可以根據(jù)每次迭代得到的預測結果的準確性靈活調整權重。在迭代的初期,預測結果一般不太可能是準確的,因為權重沒有被調整過,也就不會收斂。需要注意的是,調整操作與目標值、預測值之間的差成比例,這個差值需要乘以 eta。這里 eta 是數(shù)據(jù)科學家定義的另一個超參數(shù),介于 0 和 1 之間,eta 的值越大,權重的校正就越多。最終當預測結果準確時,就會停止調整權重的過程。具體代碼如下:

      self.w_ = np.zeros(1 + X.shape[1])

      for _ in range(self.n_iter):

          for xi, target in zip(X, y):

              update = self.eta * (target - self.predict(xi))

              self.w_[1:] += update * xi

              self.w_[0] += update

      def net_input(self, X):

          """Calculate net input"""

          return np.dot(X, self.w_[1:]) + self.w_[0]

      def predict(self, X):

          """Return class label after unit step"""

          return np.where(self.net_input(X) >= 0.0, 1, -1)     

      在代碼中,只有當兩個類別是線性可分時,感知機模型才會收斂。簡單說就是:如果你能畫一條直線來完全分離兩個類,算法才會收斂。否則,算法將一直迭代下去,并將重新調整權重,直到循環(huán)達到最大次數(shù) n_iter。

      通過從零開始實現(xiàn)一個感知機模型,我學到了這些

      以上感知機的完整代碼如下所示:

      通過從零開始實現(xiàn)一個感知機模型,我學到了這些通過從零開始實現(xiàn)一個感知機模型,我學到了這些通過從零開始實現(xiàn)一個感知機模型,我學到了這些

      通過以上實踐,我有如下幾點收獲:

        收獲1:參數(shù)的理解

      如果你直接調用 scikit-learn 等工具來實現(xiàn)感知機,那么像學習率和迭代次數(shù)這些參數(shù)就會顯得很抽象,因為你只需要把它們填到 API 接口里,然后就得到了結果,完全不清楚這些參數(shù)的實際意義。但是如果你試著自己寫代碼來實現(xiàn),例如自己實現(xiàn)一個感知機,那么這些參數(shù)的含義就一目了然。

      學習率

      例如學習率,就是指當預測不準確時權重被校正的比例,該值必須介于 0 和 1 之間。如下代碼所示,fit 函數(shù)將對每個觀察結果進行迭代,調用 predict 函數(shù),然后根據(jù)目標和預測值之間的差異調整權重,然后乘以學習率。

      更高的學習率意味著算法將更積極地調整權重。每次迭代都會根據(jù)預測值是否準確重新調整權重值。

      # Partial portion of the "fit" function

      for xi, target in zip(X, y):

          update = self.eta * (target - self.predict(xi))

          self.w_[1:] += update * xi

          self.w_[0] += update

          errors += int(update != 0.0)

      迭代次數(shù)

      迭代次數(shù)是指算法在訓練集中運行的總次數(shù)。如果迭代次數(shù)設為 1,則算法就只在數(shù)據(jù)集上運行一次,針對每個數(shù)據(jù)點只更新一次權重。這樣得到的模型相比較高迭代次數(shù)的模型,準確率可能更低。在數(shù)據(jù)集的體量較大時,高迭代次數(shù)可能引起非常高迭代成本。

      for _ in range(self.n_iter):

          errors = 0

          for xi, target in zip(X, y):

              update = self.eta * (target - self.predict(xi))

              self.w_[1:] += update * xi

              self.w_[0] += update

              errors += int(update != 0.0)

          self.errors_.append(errors)

      學習度和迭代次數(shù)通常是相互關聯(lián)的,需要一起調整。例如,如果你的學習率很小,則意味著算法每次對權重的調整都很微小,那么可能就需要更多的迭代次數(shù)。

        收獲2:線性代數(shù)的重要性

      其次,特別重要的一點是:不單是Perceptron算法,在整個機器學習領域,線性代數(shù)課程中的相關內容都至關重要,因為整個算法都可以通過線性代數(shù)的相關公式來描述。而如果你從來沒有學過線性代數(shù)的相關知識,那么這些公式對你來說就是不可見的,也就不利于算法的理解和實現(xiàn)。因此,學好線性代數(shù)對開發(fā)機器學習和理解各種算法至關重要,這里推薦一個線性代數(shù)的在線教程,并且附帶練習。

      教程地址:https://www.khanacademy.org/math/linear-algebra 

        收獲3:一種通用的學習方法

      最后,我想通過以上 Perceptron 算法推薦一個通用的學習方法,即手動敲入代碼,拒絕簡單的復制粘貼。

      早在2012年,當我在學習編寫一個 Web 應用時就體會到了手動敲入代碼的好處。當時,我花了比別人多得多的時間跟著教程,一步一步把案例中的代碼手動敲入編輯器,而沒有選擇復制粘貼。這看起來很蠢,但不可否認這種方法真的有用。因為不可避免的,在手動敲入這些代碼時你一定會引入錯誤,因此你敲完的代碼可能根本就運行不起來,也可能得到一些意想不到的錯誤,這時你就必須排查和修改代碼中的錯誤。其實,這個排查和修改的過程就是思考和學習的過程,通過這樣的過程,你會對整個代碼和教程中的知識點理解的更透徹,當然也記得更清楚。

      所以,如果你要學習 Perceptron 算法,請不要直接復制和粘貼。試著將這些代碼手動敲入編輯器,然后編譯運行。更不要被動地閱讀,僅僅對著代碼讀來讀去,永遠也成不了數(shù)據(jù)科學家,你必須參與進去,主動修改和運行這些代碼,才能收獲的更多。

      原文地址:http://www.jeannicholashould.com/what-i-learned-implementing-a-classifier-from-scratch.html 

      深入閱讀:http://www.jeannicholashould.com/learning-machine-learning.html 

      雷鋒網(wǎng)相關閱讀:

      機器學習零基礎?手把手教你用TensorFlow搭建圖像分類器| 干貨

      Python粉都應該知道的開源機器學習框架:Scikit-learn入門指南

      雷峰網(wǎng)版權文章,未經(jīng)授權禁止轉載。詳情見轉載須知

      通過從零開始實現(xiàn)一個感知機模型,我學到了這些

      分享:
      相關文章

      編輯

      歡迎交流,微信:whl123465
      當月熱門文章
      最新文章
      請?zhí)顚懮暾埲速Y料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經(jīng)綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
      立即設置 以后再說
      主站蜘蛛池模板: 亚洲伊人色| 性饥渴人妻| 一区二区AV| 特级欧美成人性a片| 久久精品中文字幕无码绿巨人| 亚洲精品国男人在线视频| 日韩69永久免费视频| 亚洲制服丝袜无码| 亚洲精品成人a在线观看| 国产精品任我爽爆在线播放6080| 亚洲精品亚洲人成在线观看下载 | 放荡的美妇在线播放| 91精品国产成人观看| 精品毛片日| 无码久久久| 亚洲va综合va国产va中文| 亚洲欧美另类久久久精品播放的| 亚洲人成伊人成综合网久久久| 国产精品久久久久久无毒不卡| 夜夜高潮次次欢爽av女| 中文有码无码人妻在线| 鹿邑县| 国产成a人亚洲精v品无码性色| 白人无码| 潮喷在线播放| 亚洲在线一区二区| 午夜无码区在线观看| 99国产精品永久免费视频| 男女视频在线一区二区| 精品无码国产自产拍在线观看| 秋霞A级毛片在线看| 国产精品内射后入合集| 来安县| 国产成人精品午夜福利在线观看| 97超碰资源总站| 97无码人妻| 亚洲综合无码| 伊人综合成人| 久久国产精品波多野结衣| 日韩色图区| 元码人妻精品一区二区三区9|