天岚量产机 2018-07-15
在本文中,我将向您展示如何使用numpy和pandas制作一个简单人工神经网络。我们的ANN模型将具有单个输入和输出层。
为了演示模型的工作原理,我创建了一个尺寸为12x5的小型数据集。列a,b,c,d是要素,最后一列是标签。
我们将自定义类命名为“ SimpleNeuralNetwork ”。接下来,我们将在__init __()函数下初始化权重矩阵。
import pandas as pd
import numpy as np
class SimpleNeuralNetwork(object):
def __init__(self):
np.random.seed(1)
self.synaptic_weights = []
我们模型中使用的激活函数将是sigmoid。因此,我们将创建一个名为__sigmoid()的函数。它需要两个参数:x (a list) 和deriv (default is False)。如果我们将deriv设置为True,则返回sigmoid函数的导数形式。
def __sigmoid(self, x, deriv=False):
if deriv == True:
return x * (1-x)
return 1 / (1 + np.exp(-x))
predict()函数将以数组作为输入(比如X),并返回X和权重矩阵的乘积。
def predict(self, x):
predicted = np.dot(x, self.synaptic_weights)
return self.__sigmoid(predicted)
我们将为train()函数提供4个输入:file (pandas object), X (features list), y (label array) 和迭代。这里的权重矩阵是用numpy的随机函数初始化的。权值矩阵的维数为(number_of_features, 1)。变量输出存储特征(X)的乘积,权值矩阵和误差变量存储预测输出和实际输出的差值。
def train(self, file, X, y, iterations):
dim = file.shape #Return dimensions of the file, say (m,n)
self.synaptic_weight = 2 * np.random.random((dim[1] - 1, 1)) - 1 #shape of weight matrix is (n,1)
for i in range(iterations):
output = self.predict(X) #Product of training_inputs and weight matrix
error = y - output
adjustment = np.dot(X.T, error * self.__sigmoid(output, deriv=True))
self.synaptic_weight += adjustment
对权重矩阵反复使用相同的值不会让我们的模型学习!因此,我们将使用反向传播的概念。误差变量与sigmoid导数输出相乘,其与X的点积存储在调整变量中,并添加到权值矩阵中以更新值。
在pandas的帮助下,我们将加载数据集并将其划分为特征和标签。创建我们类的对象,并使用train()函数提供训练数据。我们现在可以给出任何不属于数据集的输入值,我们的模型将输出0到1之间的值。因为,我们希望输出为0或1,设置阈值为0.5,输出为1以上,否则为0。
import pandas as pd
import numpy as np
class SimpleNeuralNetwork(object):
def __init__(self):
np.random.seed(1)
self.synaptic_weights = []
def __sigmoid(self, x, deriv=False):
if deriv == True:
return x * (1-x)
return 1 / (1 + np.exp(-x))
def predict(self, x):
predicted = np.dot(x, self.synaptic_weights)
return self.__sigmoid(predicted)
def train(self, file, X, y, iterations):
dim = file.shape #Return dimensions of the file, say (m,n)
self.synaptic_weight = 2 * np.random.random((dim[1] - 1, 1)) - 1 #shape of weight matrix is (n,1)
for i in range(iterations):
output = self.predict(X) #Product of training_inputs and weight matrix
error = y - output
adjustment = np.dot(X.T, error * self.__sigmoid(output, deriv=True))
self.synaptic_weight += adjustment
if __name__ == "__main__":
# Loading Data
data = pd.read_csv("file.csv")
display(len(data))
X = data.iloc[:, 0:4].values #features
y = data.iloc[:, [4]].values #labels
number_of_iterations = 6000
clf = SimpleNeuralNetwork()
#Training
clf.train(data, X, y, number_of_iterations)
#Testing
prediction = np.array([0,1,1,0])
res = clf.predict(prediction)[0]
#Threshold value check
if res >= 0.5:
print("Prediction:", 1)
else:
print("Prediction:", 0)