簡單感知機Python實現

2021-10-05 14:45:20 字數 2207 閱讀 7432

import numpy as np

import matplotlib.pyplot as plt

plt.rcparams['font.sans-serif'] = ['simhei'] # 用來正常顯示中文標籤

plt.rcparams['axes.unicode_minus'] = false # 用來正常顯示負號

plt.rcparams['figure.figsize'] = # 生成圖的大小

# 產生新畫布

fig = plt.figure();

figa = plt.gca()

n = 100

# 隨機產生n個 2維的0-1之間的陣列 如 [[0.2 0.4],[0.333 0.43233]]

xn = np.random.rand(n, 2)

print(xn)

# 隨機產生50個 0到1之間的陣列

x = np.linspace(0, 1)

a = np.random.rand() # 隨機生成乙個0~1之間的數字

b = np.random.rand()

# 隨機生成一條直線

f = lambda x: a * x + b

plt.plot(x, f(x), 'r')

# 線性分割前面產生的點

yn = np.zeros([n, 1]) # 生成n個1維的0陣列 (類似於定義乙個空的陣列)

for i in range(n):

if (f(xn[i, 0]) >= xn[i, 1]):

yn[i] = 1

plt.plot(xn[i, 0], xn[i, 1], 'bo', markersize=12) # 藍色圓圈標記

else:

yn[i] = -1

plt.plot(xn[i, 0], xn[i, 1], 'go', markersize=12) # 綠色圓圈標記

# 感知機

# xn 資料點 n*2的向量

# yn 分類結果 n*1的向量

# maxiter 訓練次數

# 輸出 超平面引數y = ax + b最好的分割平面

def perceptron(xn, yn, maxiter=1000, a=0.01, w=np.zeros(3)):

# n表示xn有多少個變數

n = xn.shape[0]

f = lambda x: np.sign(w[0] * 1 + w[1] * x[0] + w[2] * x[1])

for _ in range(maxiter):

i = np.random.randint(n)

if (yn[i] != f(xn[i, :])):

w[0] = w[0] + yn[i] * 1 * a

w[1] = w[1] + yn[i] * xn[i, 0] * a

w[2] = w[2] + yn[i] * xn[i, 1] * a

# print(w)

return w

w = perceptron(xn, yn)

print("last ***** ")

print(w)

print(a)

print(b)

bnew = -w[0] / w[2]

anew = -w[1] / w[2]

y = lambda x: anew * x + bnew

# 分割顏色

sep_color = (yn) / 2.0

plt.figure()

figa = plt.gca()

plt.scatter(xn[:, 0], xn[:, 1], c=sep_color.flatten(), s=50)

plt.plot(x, y(x), 'b--', label='感知機分類結果')

plt.plot(x, f(x), 'g', label='原始分類曲線')

plt.title('原始曲線與感知機近似結果比較')

plt.legend()

plt.show()

其中

w[0]是偏置的權重值,w[1]是x的權重值,w[2]是y的權重值

由 x[2]*y + w[1]*x + w[0] = 0

a = -w[0] / w[2]

b = -w[1] / w[2]

即調整後的斜率和偏置

感知機(Python實現,簡單)

usr bin python coding utf 8 importrandom fromnumpyimport importnumpyasnp deftraining train data1 3,3,1 4,3,1 正樣本 train data2 1,1,1 負樣本 train datas tra...

Python 實現簡單的感知機演算法

隨機生成一些點和一條原始直線,然後用感知機演算法來生成一條直線進行分類,比較差別 import numpy as np import matplotlib.pyplot as plt matplotlib inline plt.rcparams font.sans serif simhei 用來正常...

python實現感知機

import numpy as np 定義啟用函式 def acti fun x return 1 if x 0 else 0 建立感知器類 class perception object 初始化權重 def init self self.weights 0 self.bias 1 定義訓練函式,包...