首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >typeError:__array_prepare__

typeError:__array_prepare__
EN

Stack Overflow用户
提问于 2016-02-25 23:45:49
回答 1查看 695关注 0票数 0

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

代码语言:javascript
复制
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)

但是,当我运行代码时,我遇到了一个错误:array_prepare必须返回一个ndarray或它的子类,否则它的输入是相同的。

我知道以前有一个问题得到了回答( error),但是它对我没有多大帮助。我非常感谢你的帮助。谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-03-02 14:27:54

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

1)而不是使用:

代码语言:javascript
复制
y =  [x / norm_fac for x in g]  

你可以直接计算y:

代码语言:javascript
复制
y_in = g_in / norm_fac    

这解决了计算y - output时的错误。

2)现在,这一行引起了一个问题:

代码语言:javascript
复制
self.w_[1:] += self.eta * X[0:].T.dot(errors)   

由于您想要访问w_的第一个元素,所以必须使用w_[1]。您所使用的是从第一个元素开始的w_的所有元素。

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

代码语言:javascript
复制
self.w_[1] += self.eta * X.T.dot(errors)

3)你不应该用

代码语言:javascript
复制
(errors\*\*2).sum()  

计算平方误差之和。errors**2试图将错误与自身相乘,因为错误是一个向量,因此它会产生一个错误。相反,您必须使用numpy.power来获得元素方面的能力:

代码语言:javascript
复制
np.power(errors, 2)  

也用于更好的实践:

1)将主代码放在末尾,并重命名变量。您将y作为全局变量(在顶部定义)和作为输入变量,这将导致阴影。

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

3)使用小写变量名。

4)您可以使用x*y代替x.dot(y),这与使用numpy的操作相同。

5)最后打印一些结果。

考虑到这些,并遵循Python格式设置准则,我已经将您的代码更改如下:

代码语言:javascript
复制
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_

我不确定这段代码是否能实现你想要的。你必须一步一步地控制逻辑。

P.S.:我建议使用PyCharm开发Python。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35640684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档