<jupyter_start><jupyter_text>단순한 논리 회로- AND 게이트 : 두 입력값이 모두 1인 경우 1을 출력, 그외에는 0- NAND 게이트 : Not AND를 의미하며, AND게이트의 동작을 뒤집는다. 입력값 둘 다 1인 경우 0, 그외에는 1- OR 게이트 : 입력 신호 중 하나이상이 1이면 출력이 1이 된다.  퍼셉트론(Perceptron)?: 다수의 신호(0 또는 1)를 입력받아 하나의 신호(0 또는 1)를 출력한다. **퍼셉트론 구조는 AND, NAND, OR 게이트 모두에서 똑같다.(가중치(weights)와 임계값(theta)만 조절해주면 다른 논리회로로 바뀐다.)**<jupyter_code># AND 구현
def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = w1*x1 + w2*x2
    if tmp <= theta:
        return 0
    else:
        return 1
AND(0,0),AND(1,0),AND(0,1),AND(1,1)
# weights and bias 도입
x = np.array([0,1])
w = np.array([0.5, 0.5])
b = -0.7

print(w*x, np.sum(w*x))
print(np.sum(w*x) + b)
def AND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
AND(0,0),AND(1,0),AND(0,1),AND(1,1)
# NAND 구현
def NAND(x1, x2):
    """
    AND와 weights와 bias만 다르다
    """
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5])
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
NAND(0,0),NAND(1,0),NAND(0,1),NAND(1,1)
# OR 구현
def OR(x1, x2):
    """
    AND와 weights와 bias만 다르다
    """
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1    
OR(0,0),OR(1,0),OR(0,1),OR(1,1)<jupyter_output><empty_output><jupyter_text>퍼셉트론의 한계 : XOR 게이트: 직선하나로 영역을 구분하기 불가능하다.<jupyter_code>np.random.seed(0)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0, X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)
plt.scatter(X_xor[y_xor==1, 0], X_xor[y_xor==1, 1], c='b', marker='o', label='1', s=100)
plt.scatter(X_xor[y_xor==-1, 0], X_xor[y_xor==-1, 1], c='r', marker='s', label='-1', s=100)
plt.ylim(-3.0)
plt.legend()
plt.title("XOR problem")
plt.show()
def plot_xor(X, y, model, title, xmin=-3, xmax=3, ymin=-3, ymax=3):
    XX, YY = np.meshgrid(np.arange(xmin, xmax, (xmax-xmin)/1000), np.arange(ymin, ymax, (ymax-ymin)/1000))
    ZZ = np.reshape(model.predict(np.array([XX.ravel(), YY.ravel()]).T), XX.shape)
    plt.contourf(XX, YY, ZZ, cmap=mpl.cm.Paired_r, alpha=0.5)
    plt.scatter(X[y== 1, 0], X[y== 1, 1], c='b', marker='o', label='+1', s=100)
    plt.scatter(X[y==-1, 0], X[y==-1, 1], c='r', marker='s', label='-1', s=100)
    plt.xlim(xmin, xmax)
    plt.ylim(ymin, ymax)
    plt.title(title)
    plt.show()
from sklearn.svm import SVC

svc = SVC(kernel="linear").fit(X_xor, y_xor)
plot_xor(X_xor, y_xor, svc, "Linear SVC")
# XOR 구현
# AND, NAND, OR 조합하여 구현하기
def XOR(x1, x2):
    """
    다층 구조를 가진 다층 퍼셉트론 
    """
    s1 = NAND(x1,x2) # 1층
    s2 = OR(x1,x2) # 1층
    y = AND(s1,s2) # 2층
    return y
XOR(0,0),XOR(1,0),XOR(0,1),XOR(1,1)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.2146167557932264, 'fraction_numerical': 0.06666666666666667, 'mean_word_length': 2.963276836158192, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '337654', 'license': 'MIT', 'n_tokens_mistral': 1692, 'n_tokens_neox': 1742, 'n_words': 314, 'path': 'DeepLearning_from_the_bottom/1.Perceptron.ipynb', 'repo_name': 'Junhojuno/DeepLearning-Beginning', 'size': '2805'}