基於Python的Rosenblatt感知器模型

2021-09-21 06:08:22 字數 4504 閱讀 7080

rosenblatt感知器是一種最簡單的感知器模型,即輸出值為輸入與對應權值相乘後取和再累加並加上偏置後通過符號函式的結果,即:output = sgn(w0 * x0 + w1 * x1 + ... + wn * xn + bias)

訓練時,使用有監督學習,當輸出值與真實值不同時,對應的weight與該次輸入資料與真實值和學習率的乘積相加,或可以描述為weight += input * (d - o) * n其中,input為輸入值,d為真實值,o為輸出值,n為學習率

通過rosenblatt感知器的數學模型,可以很簡單的使用numpy庫實現感知機功能

import numpy as np

class rosenblatt(object):

"""docstring for rosenblatt"""

def __init__(self, inputnum):

super(rosenblatt, self).__init__()

self.weight = np.zeros([inputnum + 1, 1])

self.trainraito = 1

//啟用函式(符號函式)

def activitionfunction(self, inputdata):

# print(inputdata, np.zeros(inputdata.shape))

# print((inputdata > np.zeros(inputdata.shape)).all())

if (inputdata > np.zeros(inputdata.shape)).all() == true:

# print("1")

return 1

else:

# print("-1")

return -1

//前饋傳播

def feedforward(self, inputdata):

return self.activitionfunction(

np.matmul(self.weight.t, np.hstack((np.ones([1, 1]), inputdata)).t))

//訓練

def trainonestep(self, inputdata, rightresult):

result = self.feedforward(inputdata)

if result != rightresult:

self.changeweight(inputdata, rightresult, result)

//修改權值

def changeweight(self, inputdata, rightresult, result):

# print(self.trainraito *

# (rightresult - result))

self.weight += self.trainraito * \

(rightresult - result) * np.hstack((np.ones([1, 1]), inputdata)).t

//設定學習率

def settrainratio(self, ratio):

self.trainraito = ratio

本次測試使用的是雙月資料集,如下圖所示:

雙月資料集

該資料集是乙個線性不可分的資料集,上方的半月的真實值為1,下方的半月真實值為-1,該資料集生成**如下

import matplotlib.pyplot as plt

import numpy as np

import random

import math

class semicirclegenerator(object):

"""docstring for semicirclegenerator"""

def __init__(self, startlocation, radiuslist, orientation):

super(semicirclegenerator, self).__init__()

self.startlocation = startlocation

self.maxradius = max(radiuslist)

self.minradius = min(radiuslist)

self.orientation = orientation

建構函式確定了單月的資訊:

def gen_semicircledata(self, batchsize):

for _ in range(batchsize):

radius = random.uniform(self.minradius, self.maxradius)

biasx = random.uniform(- radius, radius)

biasy = math.sqrt(radius * radius - biasx * biasx)

if self.orientation == "+":

yield [biasx + self.startlocation[0], biasy

+ self.startlocation[1]]

else:

yield [self.startlocation[0] - biasx,

self.startlocation[1] - biasy]

gen_semicircledata()是乙個生成器,用於生成指定數量的單月形狀內的點,過程是首先使用random.uniform()生成乙個半徑範圍內的隨機半徑,再生成乙個正負半徑內的隨機x偏移量,通過勾股定理計算出y的偏移量,即可以生成乙個落在單月形狀內的隨機點,再根據朝向生成這個點的絕對座標使用yield返回

通過呼叫rosenblatt和資料集**生成訓練和測試環境,並使用matplotlib繪圖實現視覺化

from rosenblatt import rosenblatt

from semicirclegenerator import semicirclegenerator

import numpy as np

import matplotlib.pyplot as plt

neural = rosenblatt(2)

dataset1 = semicirclegenerator([0, 0], [4, 6], "+")

dataset2 = semicirclegenerator([7, -2], [4, 6], "-")

testdata_x, testdata_y = ,

首先建立神經元和資料集

for data in dataset1.gen_semicircledata(1000):

neural.trainonestep(np.array([data]), 1)

for data in dataset2.gen_semicircledata(1000):

neural.trainonestep(np.array([data]), -1)

再分別使用資料集進行訓練,並儲存訓練資料

print(neural.weight)

x_data, y_data = [-6, 13],

print(neural.weight[1][0])

for i in x_data:

neural.weight[1][0]) / (neural.weight[2][0]))

通過訓練得到的資料得出結果直線

plt.plot(x_data, y_data, color="red")

plt.scatter(testdata_x, testdata_y)

plt.show()

使用matplotlib繪圖,plt.plot()用於繪製折線圖,顏色配置可以參考這裡,plt.scatter()用於繪製散點圖,plt.show()顯示已經繪製的影象,更多matplotlib繪圖可以參考這裡和這裡

生成的影象如下:

結果

紅線代表感知器的學習結果,可以看到很好的劃分出了兩個半月之間的界限

基於python的爬蟲

本次初學,參考的資料見 功能主要是抓取韓寒的部落格內容,以及儲存 到 hanhan的資料夾中,執行環境實在linux下的。見 具體 如何 usr bin env python coding utf 8 import urllib import time url 60 con urllib.urlop...

基於python的opencv教程

第一次寫部落格,學習是要有輸入與輸出的,所謂教學相長。所以我想試著自己寫乙份教程,算是對自己的學習總結吧,部落格的排版比較直男,請湊合看吧。首先建議的ide是pycharm,opencv的庫直接pip安裝就好,最好大家有一定的python基礎。第一部分是關於圖象讀取和儲存。import cv2imp...

基於python的基本函式

什麼是函式?函式就是將一段 寫在一起,如果需要使用,直接呼叫即可 就是封裝一段功能 的 塊,這段 可以被多次使用 def define 定義 函式名稱命名規範 單詞全部小寫,多個單詞之間用 連線,函式名要和實現 的功能有關係,做到見名知意 def 函式名 引數列表 函式功能 def eat prin...