机器学习-实现简单神经网络(笔记和代码实现)

一、神经网络简介

       神经网络算法的发展历史

       起源:20世纪中叶,一种仿生学产品。

       兴起:环境->2进制创新;能力->软硬件;需求->人的性价比。

       主要功能:

           分类识别

           分类:图像(自动驾驶)、语音(语音助手)、文本(新闻推送)

       (1)了解神经网络的脉络

            训练学习:网络结构、激励函数、损失函数、梯度下降

            网络结构:

    这就是一个神经网络的结构,是一个单层的结构,但是具有输入层、隐含层、输出层、最终预测的值。

    逻辑回归:

        它是一种最简化的网络结构。

    激励函数:

        作用:提供规模化的非线性化能力。

    常用的神经元:

        Sigmoid,它的优点是在整个区间上都是可导,缺点是不对称:

        tanh:

        ReLU:

    目前使用的最多的神经元是ReLU。

    损失函数:

        理解神经网络的相关概念和函数。

    单次训练损失:

    全部训练损失:

    梯度下降:

         理解逻辑回归中的梯度下降。

          对w、b进行同步更新。

    网络向量化:

        理解神经网络的网络向量化。

    以上就是向量化的过程。

    网络梯度下降:

    训练过程:

        通过观察神经网络的学习过程形成较为直观的理解。

    总结:需要理解神经网络的基本结构和核心组件概念。

二、机器学习-实现简单神经网络

    (1)介绍人工智能的基本概念和逻辑体系

    (2)研究两种数据分类算法

    (3)通过python,运用分类算法,实现只有一层的神经网络

    需要构造的神经网络:

    (1)介绍分类算法的理论基础

    (2)使用Pandas,NumPy和matplotlib等python开发库去读取,加工和可视化数据集。

    (3)使用python实现两种分类算法

    分类算法:(1)感知器(2)适应性线性神经元

1. 感知器数据分类算法

    步骤:(权重向量W,训练样本X)

    ▷  把权重向量初始化为0,或把每个分量初始化为[0,1]间任意小数;

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

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

 

    步调函数也叫做激活函数。

    权重和阈值的更新如下:

    感知器算法的适用范围要满足下面第一幅图中的范围:

    感知器算法算法步骤


2. 自适应线性神经元:

    自适应神经元算法步骤


    自适应线性神经元与感知器分类算法的区别:

      第一个:自适应性神经元输入数据计算出结果,然后它会把计算的结果和输入的正确结果进行比较,如果计算的结果与正确结果不一致,它就会根据和已给定结果的差距去动态的调整参数(w0,w1,…,wn)。

      第二个:自适应性神经元使用的激活函数与感知器用的是不一样的,它不在是步调函数,而是直接把数据和神经参数相乘,所得的结果直接当成最终结果(x0*w0+x1*w1+x2*w2+…+xm*wm)。

    看一看自适应神经元时怎么通过动态调整来调整它的神经元参数,使用的是一种渐进下降的数值算法,不断缩短与正确结果的距离。


    

三、程序代码

      使用python语言进行编写,实现简单的神经网络算法,用感知器算法和自适应神经元两种分类方法对数据集进行分类。

      用到的python版本:python 3.6   

      工具包:numpy、pandas、matplotlib

(1)感知器算法

# -*_coding:utf8-*-
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.colors import ListedColormap


# 感知器算法
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

    # 神经网络输入
    def net_input(self, X):
        """
        z=W0+W1*X1+...+Xn*Xn
        """
        return np.dot(X, self.w_[1:]) + self.w_[0]
    
    def predict(self, X):
        return np.where(self.net_input(X) >= 0.0, 1, -1)
    # 训练函数
    def fit(self, X, y):
        """
        输入训练数据,培训神经元
        X:输入样本向量
        y:对应样本分类
        X:shape[n_samples,n_features]
        X:[[1,2,3],[4,5,6]]
        y:[1.-1]
        n_samples:2
        n_features:3
        初试话权重向量为0
        """
        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=η*(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)


# 绘图函数
def plot_decision_regins(X, y, classifier, resolutions=0.02):
    marker = ('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, resolutions), np.arange(x2_min, x2_max, resolutions))

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

    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=marker[idx], label=cl)


file = open("F:/=data.csv")
df = pd.read_csv(file, header=None)
print(df.head(10))

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

X = df.iloc[0:101, [0, 2]].values

plt.scatter(X[:50, 0], X[:50, 1], color='red', marker='o', label='setosa')
plt.scatter(X[50:100, 0], X[50:100, 1], color='blue', marker='x', label='versicolor')
plt.xlabel("Petal length")
plt.ylabel("Flower diameter length")
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('sum-squared-error')
plt.show()

plot_decision_regins(X, y, ppn, resolutions=0.02)
plt.xlabel("Petal length")
plt.ylabel("Flower diameter length")
plt.legend(loc="upper left")
plt.show()
(2)自适应神经元
 
 
# -*_coding:utf8-*-
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.colors import ListedColormap


# 自适应神经元
class AdalineGD(object):
    """
    eta:float
    学习率 :0~1
    n_iter:int
    对训练数据进行学习改进次数
    w_:一维向量
    存储权重数值
    error_:
    存储每次迭代改进时,网络对数据进行错误判断的次数
    """
    # 初始化
    def __init__(self, eta=0.01, n_iter=50):
        self.eta = eta
        self.n_iter = n_iter

    # 神经网络输入
    def net_input(self, X):
        """
        z=W0+W1*X1+...+Xn*Xn
        """
        return np.dot(X, self.w_[1:]) + self.w_[0]

    # 激活函数
    def activation(self, X):
        return self.net_input(X)

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

    # 训练函数
    def fit(self, X, y):
        """
        X:二维数组[n_samples,n_features]
        n_samples:表示X中含有训练数据条目数
        n_features:含有4个数据的一维向量,用于表示一条训练条目
        y:一维向量
        用于存储每一条训练条目对应的正确分类
        """
        self.w_ = np.zeros(1 + X.shape[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.dot(errors)
            self.w_[0] += self.eta * errors.sum()
            cost = (errors ** 2).sum() / 2.0
            self.cost_.append(cost)
        return self


# 绘图函数
def plot_decision_regins(X, y, classifier, resolutions=0.02):
    marker = ('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, resolutions), np.arange(x2_min, x2_max, resolutions))

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

    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=marker[idx], label=cl)


file = open("F:/data.csv")
df = pd.read_csv(file, header=None)
print(df.head(10))

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

X = df.iloc[0:101, [0, 2]].values

ada = AdalineGD(eta=0.0001, n_iter=50)
ada.fit(X, y)
plot_decision_regins(X, y, classifier=ada)
plt.title('Adaline-Gradient descent')
plt.xlabel('Petal length')
plt.ylabel('Flower diameter length')
plt.legend(loc='upper left')
plt.show()

plt.plot(range(1, len(ada.cost_) + 1), ada.cost_, marker='o')
plt.xlabel('Epochs')
plt.ylabel('sum-squared-error')
plt.show()
(3)运行结果图


样本数据图


运行错误迭代图

 

感知器算法分类图


运行错误迭代图


自适应神经元分类图

     本文中的数据集下载:data.csv

     本文代码下载:https://github.com/Messi-Q/The-neural-network/tree/master/venv/Include

猜你喜欢

转载自blog.csdn.net/qq_34611579/article/details/80832596