Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类型错误:\数组\准备___Python_Numpy_Neural Network - Fatal编程技术网

Python 类型错误:\数组\准备__

Python 类型错误:\数组\准备__,python,numpy,neural-network,Python,Numpy,Neural Network,我试图通过使用逻辑激活函数的增量学习规则来实现单个神经元。我的代码如下 import numpy as np X = np.matrix('2; 4; 6; 8; 10; 15; 20; 25; 30; 40; 50; 60') g = np.matrix('4.32323; 4.96276; 5.45565; 6.27151; 6.8552; 8.64987; 10.32581; 12.21393; 14.45659; 15.87602; 15.82488; 16.19419') norm_

我试图通过使用逻辑激活函数的增量学习规则来实现单个神经元。我的代码如下

import numpy as np
X = np.matrix('2; 4; 6; 8; 10; 15; 20; 25; 30; 40; 50; 60')
g = np.matrix('4.32323; 4.96276; 5.45565; 6.27151; 6.8552; 8.64987; 10.32581; 12.21393; 14.45659; 15.87602; 15.82488; 16.19419') 
norm_fac=16.19419
y =  [x / norm_fac for x in g]

class SingleNeuron (object):

    def __init__(self, eta=0.01, n_iter=10):
        self.eta=eta
        self.n_iter=n_iter

    def fit (self, X, y):
        self.w_ = np.zeros (X.shape[1]+1)
        self.cost_ = []

        for i in range (self.n_iter):
            output = self.net_input(X)
            errors = (y - output)
            self.w_[1:] += self.eta * X[0:].T.dot(errors)
            self.w_[0] += self.eta * errors.sum ()
            cost = (errors**2).sum() / 2.0
            self.cost_.append(cost)
        return self

      def net_input(self, X):
          return 1/(1+ np.exp (-(np.dot(X, self.w_[1]) + self.w_[0])))

      def predict(self, X):
          return self.net_input(X)

SN = SingleNeuron (eta = 0.1, n_iter = 10)
SN.fit (X, y)
但是,当我运行代码时,我遇到了错误: 数组\u prepare必须返回与其输入相同的数据数组或其子类


我知道在()之前有一个问题得到了回答,但这对我帮助不大。我非常感谢任何帮助。谢谢你

我已经调试了你的代码,有几个错误:

1) 而不是使用:

y =  [x / norm_fac for x in g]  
您可以直接计算y:

y_in = g_in / norm_fac    
这解决了计算
y-输出时出现的错误

2) 现在,这一行导致了一个问题:

self.w_[1:] += self.eta * X[0:].T.dot(errors)   
由于要访问
w_
的第一个元素,必须使用
w_[1]
。您使用的是从第1个元素开始的
w
的所有元素

类似地,
X[0://code>是不必要的,因为它返回
X
的所有元素。只需使用
X
即可:

self.w_[1] += self.eta * X.T.dot(errors)
3) 你不应该使用

(errors\*\*2).sum()  
计算误差平方和<代码>错误**2
尝试将错误与自身相乘,并给出一个错误,因为错误是一个向量。相反,您必须使用numpy.power来获得元素级权限:

np.power(errors, 2)  
为了更好地练习:
1) 将主代码放在末尾并重命名变量。将y作为全局变量(在顶部定义)和输入变量,这会导致阴影

2) 在初始化中定义所有与类相关的变量

3) 使用小写的变量名

4) 您可以使用x*y而不是x.dot(y),因为您使用的是numpy,所以操作相同

5) 最后打印一些结果

考虑到这些以及以下Python PEP8格式指南,我将您的代码更改如下:

import numpy as np

class SingleNeuron (object):

    def __init__(self, eta=0.01, n_iter=10):
        self.eta = eta
        self.n_iter = n_iter
        self.w_ = []
        self.cost_ = []

    def fit(self, x, y):
        self.w_ = np.zeros(x.shape[1]+1)
        self.cost_ = []

        for i in range(self.n_iter):
            output = self.net_input(x)
            errors = (y - output)
            self.w_[1] += self.eta * x.T * errors
            self.w_[0] += self.eta * errors.sum()
            cost = np.power(errors, 2).sum() / 2
            self.cost_.append(cost)
        return self

    def net_input(self, x):
        return 1 / (1 + np.exp(-((x * self.w_[1]) + self.w_[0])))

    def predict(self, x):
        return self.net_input(x)


norm_fac = 16.19419
x_in = np.matrix('2; 4; 6; 8; 10; 15; 20; 25; 30; 40; 50; 60')
g_in = np.matrix('4.32323; 4.96276; 5.45565; 6.27151; 6.8552; 8.64987;     10.32581; 12.21393; 14.45659; 15.87602; '
             '15.82488; 16.19419')
y_in = g_in / norm_fac

SN = SingleNeuron(eta=0.1, n_iter=10)
SN = SN.fit(x_in, y_in)
print SN.w_
print SN.cost_
我不确定这段代码是否符合你的要求。你必须一步一步地控制逻辑


附言:我建议在Python中使用PyCharm进行开发。

尝试在第四行之后打印
y
。这是你期望的吗?谢谢你的评论。我期望的是使用y值来计算错误,然后修改ws,直到y和输出之间的错误最小化。我指的是
y
的格式。它不返回一个列表,而是一个矩阵列表,比如:
[matrix([[0.26696179]])、matrix([[0.30645312]])、…
。这就是您想要它做的吗?噢……很抱歉误解了。不,这不是我想要做的,我通过更改第4行y=g/norm\u fac来更正该部分。但是,现在我在第29行遇到了一个新错误(ValueError:形状为(1,)的不可广播输出操作数与广播形状(1,1)不匹配。我不确定是否需要将此作为另一个问题发布。再次感谢您的帮助。我将尝试通过打印中间输出来解决此问题,包括查看类型<代码>打印y,类型(y)
等。很明显,
=
左右两侧的类型应该是可组合的。您可以编辑您的问题。本节中的注释旨在细化问题,直到其定义非常明确,并且问答对其他人有用为止。