国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用感知器的Python機器學習簡介

Null / 2578人閱讀

摘要:發布于年月日,年月日更新作者使用感知器的機器學習簡介每個熟悉技術的人都聽說過機器學習。什么是感知器感知器是機器學習和神經網絡的基礎。第一個參數用于控制感知器學習的速度。請注意,我們在這里使用變量,它決定了感知器學習的速度。

發布于2016年11月29日,2017年1月19日更新, 作者: Matthew Corrigan

使用感知器的Python機器學習簡介

每個熟悉技術的人都聽說過機器學習。但都認為必得高智商的數學大師才能搞, 咋也得懂微積分才整機器學習吧。其實沒那么難,本文將指導您在沒有任何高級數學理論的情況下, 在Python中創建感知器,總計也不到60行代碼。

什么是感知器?

感知器是機器學習和神經網絡的基礎。你為程序喂一堆輸入數據,想個法兒把這些輸入數據變成輸出數據。通過為每個輸入數據分配權重來實現。每個輸入乘以該權重,并加在一起。最后,我們需要將該總和轉換為二個值之一:1或-1。在訓練感知器時,我們會評估程序生成的輸出,并根據輸入和應該輸出的內容調整權重。實際上,感知器可以幫助我們對數據進行分類。如果這個解釋讓你感到困惑,請不要擔心,當我們開始編碼時你就會明白了。

編碼感知器類

我們應該從創建一個感知器類開始。在初始化函數中,我們想要初始化我們的權重,每個權重是從-1到1之間的隨機數。為了生成隨機數,我們將使用random.random(),它返回0到1之間的數字。

??import random
??
??class Perceptron:
??
????def __init __(self, learn_speed, num_weights):
????
??????self.speed = learn_speed
????
??????self.weights = []
??????for x in range(0, num_weights):
????????self.weights.append(random.random()* 2-1)

????????
第一個參數learn_speed用于控制感知器學習的速度。值越低,學習的時間越長,但每個數據對總體權重的值改變就越小。如果此參數太高,我們的程序將很快改變其權重,使其不準確。另一方面,如果learn_speed太低,則因為精度問題永遠也無法完成感知器的訓練。該參數的值約為0.01-0.05時比較合適。

第二個參數num_weights控制感知器將具有多少個權重值。我們的感知器也將具有與權重相同的輸入數量,因為每個輸入都有自己對應的權重值。

接下來,我們需要在類中創建一個函數來接收輸入,并將它們轉換為輸出。我們通過將每個輸入乘以其相應的權重,將所有這些加在一起,然后檢查總和是否大于0來完成此操作。在您的perceptron類中,在__init__函數之后添加此代碼:

??def feed_forward(self, inputs):
??????sum = 0
??????#權重乘以輸入并求和
??????for x in range(0, len(self.weights)):
????????sum + = self.weights[x] * inputs[x]
??????#返回"激活"總和
??????return self.activate(sum)
??????
????def activate(self, num):
??????#將大于0之和轉為1,低于0轉為-1
??????if num> 0:
????????return 1
??????return -1

上面的代碼是我們感知器的基礎。如果您能夠很好地理解這些代碼,那么您對機器學習的基礎知識已有了一個飛躍。讓我們一塊一塊地剖析這段代碼。

第一個函數feed_forward用于將輸入轉換為輸出。術語前饋通常用于神經網絡,以描述將輸入轉換為輸出的過程。該方法基于每個對應的權重對每個輸入進行加權并求和,然后使用activate函數返回1或-1。

activate函數用于將數字轉換為1或-1。這是因為當我們使用感知器時,我們想要對數據進行分類。我們將它分為兩??組,其中一組用1表示,另一組用-1表示。

你可能想知道,“如果權重是隨機的,那有什么用?” 這就是我們在使用之前必須訓練感知器的原因。在我們的訓練函數中,我們希望根據提供的輸入進行猜測,然后看看我們的猜測與我們想要的輸出相比如何。感知器類的訓練函數如下所示。

??def train(self,inputs,desired_output):
??????guess = self.feed_forward(inputs)
??????error = desired_output - guess
??????
??????for x in range(0, len(self.weights)):
????????self.weights[x] + = error * inputs[x] * self.speed

????????
前幾行中的大多數都應該有意義。我們的函數接受輸入,以及當我們通過程序運行輸入時應該發生的輸出。我們使用feed_forward函數猜測輸入,然后根據我們應該輸出的內容計算出錯誤。請注意,如果我們正確預測,則錯誤將等于0,并且函數的最后一行根本不會改變我們的權重。

這個功能的最后兩行是多汁的部分 - 他們把學習放在機器學習中。我們遍歷每個重量并根據我們有多少錯誤來調整它。請注意,我們在這里使用self.speed變量,它決定了感知器學習的速度。通過在一堆輸入及其輸出上運行此訓練函數,我們最終可以教我們的感知器獲得正確的輸出。

訓練感知器

如果我們不實際訓練它們,我們的感知器就沒用了。我們將通過編寫快速Trainer類來完成此操作。在這個例子中,我們將訓練我們的感知器, 使其能分辨一個點是在一條線之上還是在一條線之下。我們的線由方程 y = 0.5x + 10表示。一旦您知道如何訓練感知器來識別線,您可以將x和y表示為不同的屬性,在線的上方或下方作為這些屬性的運算結果。

例如,如果您有關于哈佛大學申請人的GPA和ACT分數的數據集,以及他們是否被接受,您可以訓練感知器在圖表上找到x = GPA分數和y = ACT分數的線。在線以上將是被接受的學生,并且在線以下將是被拒絕的學生。然后,您可以使用此感知器來預測學生是否會根據他們的GPA和ACT分數被哈佛大學錄取。

在這個例子中,我們將繼續去識別一條線。為此,我們將創建一個Trainer類,用于訓練感知器的點數,以及它們是否在線上。以下是我們的Trainer類的代碼:

 class Trainer:
    
    def __init__(self):
      self.perceptron = Perceptron(0.01, 3)
      
    def f(self, x):
      return 0.5*x + 10 # line: f(x) = 0.5x + 10
      
    def train(self):
      for x in range(0, 1000000):
        x_coord = random.random()*500-250
        y_coord = random.random()*500-250
        line_y = self.f(x_coord)
        
        if y_coord > line_y: # 在線上方
          answer = 1
          self.perceptron.train([x_coord, y_coord, 1], answer)
        else: # 在線下??面
          answer = -1
          self.perceptron.train([x_coord, y_coord, 1], answer)
      return self.perceptron # 返回我們訓練有素的感知器????

??????
正如您所看到的,Trainer類的初始化程序創建了一個具有三個輸入且學習速度為0.01的感知器。前兩個輸入是x和y,但最后一個輸入是什么?這是神經網絡和機器學習的另一個核心概念。最后一個輸入將始終設置為1. 與其對應的權重將決定它對我們的線的影響。例如,如果你回顧我們的等式:y = 0.5x + 10,我們需要某種方式來表示y軸截距10. 我們通過創建第三個輸入來實現這一點,該輸入需要根據感知器的權重增加或減少。將其視為一個閾值,幫助感知器理解線需要向上調整10個單位。

在我們的f函數中,我們接受一個x坐標并返回一個y坐標。根據x坐標在線上找到點,這將在下一個函數中派上用場。

Trainer類的這個訓練函數是所有魔法發生的地方,我們實際上是訓練我們的感知器。我們開始循環100萬次。還記得我們的感知器學習速度嗎?我們訓練感知器的次數越多(在這種情況下,100萬次),即使學習速度很低,它也會越準確。

在循環的每次迭代中,我們創建一個點,確定它是否在線的上方或下方,然后將這些輸入饋送到感知器的訓練函數中。首先,在-250和250之間隨機生成x和y坐標。接下來,我們找到y坐標在該x行的線上的位置,以查看我們的點是否在線上方。例如,如果我們在(1,3)處選擇一個點,那么我們應該獲得x值為3的線上的點的y坐標。我們使用f函數執行此操作。如果我們的隨機y坐標值高于線上對應的y坐標值,我們知道隨機坐標在線上方。

這就是我們在if ... else語句中所做的。如果點在線上方,我們設置預期輸出,存儲在answer中為1.如果點低于該線,則我們的預期輸出為-1。然后根據x,y坐標和我們的預期輸出訓練我們的感知器。整個循環完成后,返回新訓練的感知器對象。

運行程序

為了運行程序,我們創建一個training對象,并調用它的.train()方法。

  trainer = Trainer()
  p = trainer.train()

現在是榮耀的時刻;我們運行該程序。讓我們選擇兩點,( - 7,9)和(3,1)。第一個點在線上方,所以它應該返回1,第二個點在線下面,所以它應該返回-1。讓我們看看我們如何運行我們的感知器:

  print "(-7, 9): " + p.feed_forward([-7,9,1])
  print "(3, 1): " + p.feed_forward([3,1,1])

如果我們運行它會輸出:

(-7, 9): 1
(3, 1): -1

成功! 我們的程序檢測到每個點是在線之上還是之下。 您可以嘗試更多的點來自己測試程序是否正常運行。

小結

本文旨在幫助您了解機器學習的一些基礎知識; 具體而言,神經網絡。 如果您想深入研究這個主題,請查看以下鏈接:

神經網絡簡介
斯坦福大學的免費機器學習課程
納米級機器學習

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42525.html

相關文章

  • 你必須得知道的人工智能領域的大師與大事

    摘要:沒有過年,年后在年后的年打敗了圍棋高手李世石,這下人工智能引起了全世界的關注。隨后的十多年,人工智能轉入第一次低潮,而也在他生日時,因海事喪生,遺憾未能見到神經網絡后期的復興。算力的進步再次加速了人工智能的快速發展。 showImg(https://segmentfault.com/img/remote/1460000019409315); 小西:小迪小迪,我發現人工智能發展史上很多事...

    LeoHsiun 評論0 收藏0
  • 機器學習機器學習簡介

    摘要:二十世紀八十年代是機器學習成為一個獨立的學科領域各種機器學習技術百花初綻的時期。這時候,人們把機器學習劃分為機械學習,示教學習,類比學習,歸納學習。三機器學習的分類機器學習中,有個定理叫沒有免費午餐定理,簡稱定理。 一、人工智能與機器學習 說到人工智能,就不得不提圖靈測試。圖靈測試是阿蘭圖靈在1950年提出的一個關于機器是否能夠思考的著名實驗,測試某機器是否能表現出與人等價或無法區分的...

    developerworks 評論0 收藏0

發表評論

0條評論

Null

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<