首页 > 解决方案 > 感知器算法没有按我的意愿工作

问题描述

我最近尝试实现感知器算法,但没有得到想要的输出。
这是代码:

import numpy as np
import pandas as pd

with open("D:/data.txt",'r') as data:  #importing the data
    column = data.read()
split = np.array(column.split('\n'))

final =[]
for string in split:
    final.append(string.split(','))
df = pd.DataFrame(final,columns=['x','y','response'])
df['x'] = df['x'].astype(float)
df['y'] = df['y'].astype(float)
df['response'] = df['response'].astype(int)

X = np.array(df[['x','y']])
y = np.array(df['response'])

def perceptron_algorithm(x,y,learning_rate=0.01,num_epoch=25):
    np.random.seed(2)
    
    x_min, x_max = min(x.T[0]), max(x.T[0])
    y_min, y_max = min(x.T[1]), max(x.T[0])
    
    w = np.array(np.random.rand(2,1))
    b = np.random.rand(1)[0] + x_max
    
    print(w,b)
    
    for i in range(num_epoch):
        w,b = perceptronstep(x,y,w,b,learning_rate)
        print(w,b)
    return w,b

def perceptronstep(x,y,w,b,learning_rate):
    
    for i in range(len(x)):
        y_hat = prediction(x[i],w,b)
        
        if y_hat-y[i] == 1:
            for j in range(len(w)):
                w[j] += x[i][j]*learning_rate
            b += learning_rate
        elif y_hat-y[i] == -1:
            for j in range(len(w)):
                w[j] -= x[i][j]*learning_rate
            b -= learning_rate
    return w,b

def prediction(x,w,b):
    return step(np.matmul(x,w)+b)

def step(t):
    if t >=0:
        return 1
    else:
        return 0

w,b = perceptron_algorithm(X,y)

这是结果行:

带有预测线的散点图

这是数据的外观:

数据

我的代码有问题吗?

这是数据文件的链接:

https://drive.google.com/drive/folders/1TSug9tE6bljyBFv-u3mIGWW6F_3ZY2oa?usp=sharing

编辑:我已经添加了代码的初始部分,所以很清楚我想要做什么。
编辑 2:我添加了数据文件和“import pandas as pd”代码行

标签: machine-learningdata-sciencedata-analysisperceptron

解决方案


推荐阅读