成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用感知器的Python機器學(xué)習(xí)簡介

Null / 2602人閱讀

摘要:發(fā)布于年月日,年月日更新作者使用感知器的機器學(xué)習(xí)簡介每個熟悉技術(shù)的人都聽說過機器學(xué)習(xí)。什么是感知器感知器是機器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)。第一個參數(shù)用于控制感知器學(xué)習(xí)的速度。請注意,我們在這里使用變量,它決定了感知器學(xué)習(xí)的速度。

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

使用感知器的Python機器學(xué)習(xí)簡介

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

什么是感知器?

感知器是機器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)。你為程序喂一堆輸入數(shù)據(jù),想個法兒把這些輸入數(shù)據(jù)變成輸出數(shù)據(jù)。通過為每個輸入數(shù)據(jù)分配權(quán)重來實現(xiàn)。每個輸入乘以該權(quán)重,并加在一起。最后,我們需要將該總和轉(zhuǎn)換為二個值之一:1或-1。在訓(xùn)練感知器時,我們會評估程序生成的輸出,并根據(jù)輸入和應(yīng)該輸出的內(nèi)容調(diào)整權(quán)重。實際上,感知器可以幫助我們對數(shù)據(jù)進行分類。如果這個解釋讓你感到困惑,請不要擔(dān)心,當(dāng)我們開始編碼時你就會明白了。

編碼感知器類

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

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

????????
第一個參數(shù)learn_speed用于控制感知器學(xué)習(xí)的速度。值越低,學(xué)習(xí)的時間越長,但每個數(shù)據(jù)對總體權(quán)重的值改變就越小。如果此參數(shù)太高,我們的程序?qū)⒑芸旄淖兤錂?quán)重,使其不準(zhǔn)確。另一方面,如果learn_speed太低,則因為精度問題永遠(yuǎn)也無法完成感知器的訓(xùn)練。該參數(shù)的值約為0.01-0.05時比較合適。

第二個參數(shù)num_weights控制感知器將具有多少個權(quán)重值。我們的感知器也將具有與權(quán)重相同的輸入數(shù)量,因為每個輸入都有自己對應(yīng)的權(quán)重值。

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

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

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

第一個函數(shù)feed_forward用于將輸入轉(zhuǎn)換為輸出。術(shù)語前饋通常用于神經(jīng)網(wǎng)絡(luò),以描述將輸入轉(zhuǎn)換為輸出的過程。該方法基于每個對應(yīng)的權(quán)重對每個輸入進行加權(quán)并求和,然后使用activate函數(shù)返回1或-1。

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

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

??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

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

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

訓(xùn)練感知器

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

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

在這個例子中,我們將繼續(xù)去識別一條線。為此,我們將創(chuàng)建一個Trainer類,用于訓(xùn)練感知器的點數(shù),以及它們是否在線上。以下是我們的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 # 返回我們訓(xùn)練有素的感知器????

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

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

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

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

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

運行程序

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

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

現(xiàn)在是榮耀的時刻;我們運行該程序。讓我們選擇兩點,( - 7,9)和(3,1)。第一個點在線上方,所以它應(yīng)該返回1,第二個點在線下面,所以它應(yīng)該返回-1。讓我們看看我們?nèi)绾芜\行我們的感知器:

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

如果我們運行它會輸出:

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

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

小結(jié)

本文旨在幫助您了解機器學(xué)習(xí)的一些基礎(chǔ)知識; 具體而言,神經(jīng)網(wǎng)絡(luò)。 如果您想深入研究這個主題,請查看以下鏈接:

神經(jīng)網(wǎng)絡(luò)簡介
斯坦福大學(xué)的免費機器學(xué)習(xí)課程
納米級機器學(xué)習(xí)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42525.html

相關(guān)文章

  • 你必須得知道的人工智能領(lǐng)域的大師與大事

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

    LeoHsiun 評論0 收藏0
  • 機器學(xué)習(xí)機器學(xué)習(xí)簡介

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

    developerworks 評論0 收藏0

發(fā)表評論

0條評論

Null

|高級講師

TA的文章

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