我试图通过使用具有逻辑激活功能的delta学习规则来实现单个神经元。我的代码如下。
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或其子类,否则与其输入相同。
我知道之前已经回答了一个问题(Numpy __array_prepare__ error),但这对我没什么帮助。我非常感谢任何帮助。谢谢
答案 0 :(得分:0)
我调试了你的代码,但有几个错误:
1)而不是使用:
y = [x / norm_fac for x in g]
您可以直接计算y:
y_in = g_in / norm_fac
这可以在您计算y - output
2)现在,这一行导致了一个问题:
self.w_[1:] += self.eta * X[0:].T.dot(errors)
由于您要访问w_
的第一个元素,因此您必须使用w_[1]
。您使用的内容从第1个元素开始获取w_
的所有元素。
同样X[0:]
是不必要的,因为它返回X
的所有元素。只需使用X
代替:
self.w_[1] += self.eta * X.T.dot(errors)
3)你不应该使用
(errors\*\*2).sum()
计算误差平方和。 errors**2
尝试将错误与自身相乘,并且由于错误是向量而导致错误。相反,你必须使用numpy.power来获得元素明智的力量:
np.power(errors, 2)
同样为了更好的练习:
1)将主代码放到最后并重命名变量。你有一个全局变量(在顶部定义)和输入变量,这会导致阴影。
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_
我不确定这段代码是否符合您的要求。你必须逐步控制逻辑。
P.S。:我建议使用PyCharm在Python中进行开发。