实现简单神经网络

最近开始进军人工智能,但是对于其基础还是要打牢固的!

对于神经网络,其原型及人体神经元,通过信息数据的输入交给神经元判断,再尤其将计算后的结果(高低电平)发送给下一个。

本手记记录了感知器分类算法的python实现

——实现感知器对象

——数据解析和可视化

——神经网络对数据实现分类

以上是其算法流程图,权重向量W,训练样本X

1、把权重向量初始化为0,或把每个分量初始化为【0,1】间任意小数

2、把训练样本输入感知器,得到分类结果(-1或1)

3、根据分类结果更新权重向量

以下给出部分代码

import numpy as np
class Perceptron(object):

   """
   eta:学习率
   n_iter:权重向量的训练次数
   w_:神经分叉权重向量
   errors:用于记录神经元判断出错次数
   """
   def __init__(self, eta=0.01, n_iter=10):
       self.eta = eta
       self.n_iter = n_iter
       pass

   def net_input(self, x):
       """
       z = w0*1 + w1*x1 + ... + wn*xn
       :param x:
       :return:
       """

       return np.dot(x, self.w_[1:] + self.w_[0])
       pass

   def predict(self, x):
       return np.where(self.net_input(x) >= 0.0, 1, -1)
       pass

   def fit(self, x, y):
       """
       输入训练数据,培训神经元
       :param x: 输入样本向量
       :param y: 对应样本分类
       :return:

       x:shape[n_samples, n_features]
       x:[[1,2,3],[4,5,6]]
       n_samples: 2
       n_features: 3

       y:[1,-1]
       """

       """
       初始化权重向量为0
       加一是因为前面算法提到的w0,也就是步调函数阈值
       """
       self.w_ = np.zeros(1 + x.shape[1])
       self.errors_ = []

       for _ in range(self.n_iter):
           errors = 0
           """
           x:[[1,2,3],[4,5,6]]
           y:[1,-1]
           zip(x,y) = [[1,2,3,1],[4,5,6,-1]]
           """
           for xi, target in zip(x,y):
               """
               update = n * (y - y')
               """
               update = self.eta * (target - self.predict(xi))

               """
               xi 是一个向量
               update * xi 等价:
               w(1)=x[1]*update,w(2)=x[2]*update,w(3)=x[3]*update
               """
               self.w_[1:] += update * xi
               self.w_[0] += update

               errors += int(update != 0.0)
               self.errors_.append(errors)
               pass
           pass
       pass

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

from matplotlib.colors import ListedColormap

from marget.Rerceptron import Perceptron

dataset = pd.read_csv('datassex.csv', header=None)

# print(dataset)

y = dataset.loc[0:36, 4].values
y = np.where(y == 'Iris-setosa', -1, 1)


X = dataset.loc[0:36, [0, 2]].values

# plt.scatter(X[:18,0],X[:18,1],color='red',marker='o',label='setosa')
# plt.scatter(X[18:36,0],X[18:36,1],color='blue',marker='x',label='versicolor')
# plt.xlabel('花瓣长度')
# plt.ylabel('花径长度')
# plt.legend(loc='upper left')
# plt.show()

ppn = Perceptron(eta=0.1, n_iter=10)
ppn.fit(X, y)
# plt.plot(range(1,len(ppn.errors_)+1),ppn.errors_,marker='o')
# plt.xlabel('Epochs')
# plt.ylabel('错误分类次数')
# plt.show()

def polt_decision_regions(X,y,classifier,resolution=0.02):
   markers = ('s', 'x', 'o', 'v')
   colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
   cmap = ListedColormap(colors[:len(np.unique(y))])

   x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max()
   x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max()

   # print(x1_min,x1_max)
   # print(x2_min,x2_max)

   xx1, xx2 = np.meshgrid(np.arange(x1_min,x1_max,resolution),
                          np.arange(x2_min,x2_max,resolution))

   z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
   print(xx1.ravel())
   print(xx2.ravel())
   print(z)
   z = z.reshape(xx1.shape)
   plt.xlim(xx1.min(), xx1.max())
   plt.ylim(xx2.min(), xx2.max())
   plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap)

   for idx, cl in enumerate(np.unique(y)):
       plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], alpha=0.8, c=cmap(idx),
                   marker=markers[idx], label=cl)
       pass
   pass

 polt_decision_regions(X, y, ppn, resolution=0.02)

 plt.xlabel('flower length')
 plt.ylabel('tree length')
 plt.legend(loc='upper left')
 plt.show()

    

猜你喜欢

转载自www.cnblogs.com/UncleCatMySelf/p/9250938.html
今日推荐