zoukankan      html  css  js  c++  java
  • 实现简单神经网络

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

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

    本手记记录了感知器分类算法的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()

        

  • 相关阅读:
    最长公共上升子序列
    最长公共子序列
    3847: Mowing the Lawn (单调队列)
    A/B(扩展欧几里得)
    One Person Game(扩展欧几里得)
    Substring with Concatenation of All Words, 返回字符串中包含字符串数组所有字符串元素连接而成的字串的位置
    Divide two numbers,两数相除求商,不能用乘法,除法,取模运算
    Merge k Sorted Lists, k路归并
    二路归并排序,利用递归,时间复杂度o(nlgn)
    StrStr,判断一个字符串是不是另一个字符串的字串,并返回子串的位置
  • 原文地址:https://www.cnblogs.com/UncleCatMySelf/p/9250938.html
Copyright © 2011-2022 走看看