簡體   English   中英

感知器 - AND 運算符

[英]Perceptron - AND operator

我使用此代碼來實現 AND 運算符,但沒有正確計算分隔區域的行。 它經過點 [1, 0] 和 [0, 1]。 怎么做才能正確區分區域?

from sklearn.linear_model import Perceptron
import matplotlib.pyplot as plt
import numpy as np
from itertools import product

data = [[0,0],[1,0],[0,1],[1,1]]
labels_and = [0, 0, 0, 1]

x = [points[0] for points in data]
y = [points[1] for points in data]

plt.scatter(x, y, c = labels_and)
plt.show()

classifier = Perceptron()
classifier.fit(data, labels_and)

print(classifier.score(data, labels_and))

result = classifier.decision_function([[0, 0], [1, 1], [0.5, 0.5]])
print(result)

x_values = y_values = np.linspace(0, 1, 100)
point_grid = list(product(x_values, y_values))
distances = classifier.decision_function(point_grid)
abs_distance = [abs(x) for x in distances]

distance_matrix = np.reshape(abs_distance, (100, 100))

heatmap = plt.pcolormesh(x_values, y_values, distance_matrix)
plt.colorbar(heatmap)
plt.show()

截圖在這里

決策邊界是正確的,因為所有>都被歸類為 class 1,而所有<=都被歸類為 class 0。但是,您將分類器預測結果的絕對值可視化的方式可能會產生誤導?


sklearn 文檔參考英文 wiki 文章,該文章使用以下感知器定義:

在此處輸入圖像描述

由於只有 class 1 label 是點(1,1) ,所以右上角我們可以選擇 ie w = [2,2]b=-2來正確分類(1,1) as 1(0,0), (0,1), (1,0) as 0

由於2*0+2*1-2 =0 ,點 (1,0) 和 (0,1) 將位於決策邊界上。 然而,我們也可以選擇b=-3 ,我們的分類問題仍然可以正確解決。 不同之處在於點 (1,0) 和 (0,1) 不再直接位於邊界處,因為2*0+2*1-3 <0

讓我們看看我們訓練有素的感知器學習了哪些參數! 要訪問它們,您可以從sklearn 文檔中看到

w = classifier.coef_[0]  
b = classifier.intercept_   

如果您打印它們,您可能會獲得w=[2,2]b=-2 要導出代表相應決策邊界的線,您可以考慮w0*x + w1*y + b == 0的邊緣情況並求解 x。 您將獲得:

在此處輸入圖像描述

所以繪制這將導致這樣的事情:

m = -weight[0]/weight[1]   
n = -b/weight[1]    
plt.plot(x_values, m*x_values+n)   

在此處輸入圖像描述

這是您在圖片中看到的深藍色山谷。 我們的點 (1,0) 和 (0,1) 也位於邊界上。 您可以使用b=-3來獲得一條您可能期望的具有更高 y 截距的線?

決策邊界計算正確,但我預計它會有所不同。 這在@v.tralala 對這個問題的回答中得到了徹底的解釋。 同時我發現,如果random_state被賦予非零值(例如random_state = 100 ),將計算不同的截距和權重值,因此決策邊界將更接近點 (1,1)。 在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM