机器学习笔记--实现简单的神经网络

编译环境使用的是anaconda,应用的是python语言

软件包的下载:https://mirrors.tuna.tsinghua.edu.cn/

安装后进入:

Environment-->root-->open with Jupyter NoteBook-->弹出网页-->new-->python

然后进行代码编写(代码是根据教学视频中的代码给出的)

import numpy as np
class Perceptron(object): 
        """
            实现感知器的类
            eta:学习率
            n_iter:权重向量的训练次数
            w_:神经分叉权重向量
            errors_:用于记录神经元判断出错次数
            def _int:为初始化函数
        """
    def _int_(self, eta = 0.01, n_iter=10):
        self.eta=eta;
        self.n_iter=n_iter
        pass
    def fit(self,X,y):
            """
               1.fit方法是为输入训练数据,培训神经元
               2.其中X是电信号向量,即输入样本向量
               3.y:每一个样本所属于的分类
               4.每一个X都有一个shape属性,是对X向量的描述
                 X:shape(n_samples,n_features)
                 其中n_samples是指X中有多少个输入的样本量
                 n_features这个分叉输入的电信号有多少个,比如神经元有三个分叉,则这个神经元
                 可以接受三个输入电信号
                 eg:x:[[1,2,3],[4,5,6]]
                  n_samples:2
                  n_features:3
                  y:[1,-1]表示[1,2,3]属于分类1,[4,5,6]属于分类-1
                1.初始化权重向量为0
                2.np.zero:数学库,初始化分量全是0的一个向量
                3.其中X.shape[1]为X.shape中的n_samples的值即为2
                4.为什么np.zero中要+1,是对应阈值中的对应的w0,(步调函数的阈值)
                5.self.errors_表示记录错误的次数
            """
        self.w_=np.zero(1+X.shape[1]);
        self.errors_=[]
        
                """
                    进入训练的过程,训练n_iter,如果尝试了n_iter次都是错误的,则终止训练
                """
        for _ in range(self.n_iter):
            errors=0
                """
                    1. X:[[1,2,3],[4,5,6]] y:[1,-1]
                    2.zip(X,y) = [[1,2,3,1],[4,5,6,-1]]
                    3.for中运用权值更新算法
                      update=η*(y-y'),η是学习率,y是电信号的向量分类,y'是计算出来的分类
                      y'是对应predict所调用出来的结果
                """
            for xi,target in zip(X,y):
                update = self.eta * (target - self.predict(xi))
                
                    """
                        1.xi是向量,update是常量
                          update * xi等价于:
                          ▽w(1)=X[1]*update,▽w(2)=X[2]*update,▽w(3)=X[3]*update
                          self.w[1:] +=等价于:
                          把原来的权重分量全部加上增加的分量▽w(1),▽w(2),▽w(3)
                          self.w[1:]等价于
                          是从1开始,忽略0元素,即忽略掉0
                          这样就可以更新每一个神经分叉进行更新
                    """
                self.w[1:] += update * xi
                """
                更新阈值w0,然后统计判断错误的次数,如果错误次数越来越少,学习效果
                    越来越好,对新数据的判断越来越准确
                    如果判断正确,则y-y'=0,则target - self.predict(xi)=0
                """
                self.w_[0] += update;
                errors += int(update !=0.0)
                self.errors_.append(errors)
                 pass
            
             pass
                """
                    1.当神经元接受信号的时候会将接受的数据弱化,通过向量的点积运算来进行弱化
                    2.np.dot做点积,其中权重向量就是进行弱化的那个向量
                    3.z=w0*1+w1*x1+w2*x2+...+xn*wn
                    如果z<0则输入的x属于电信号-1
                """
    def net_input(self,X):
        
         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
    pass


附上不带注释的:

import numpy as np
class Perceptron(object): 
    def _int_(self, eta = 0.01, n_iter=10):
        self.eta=eta;
        self.n_iter=n_iter
        pass
    def fit(self,X,y):
        self.w_=np.zero(1+X.shape[1]);
        self.errors_=[]
        for _ in range(self.n_iter):
            errors=0
            for xi,target in zip(X,y):
                update = self.eta * (target - self.predict(xi))
                self.w_[1:] += update * xi
                self.w_[0] += update;
                errors += int(update !=0.0)
                self.errors_.append(errors)
                pass 
            pass
        def net_input(self,X):
            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     
        pass


以上代码是构建神经元的学习基本模型

通过将大量数据给学习模型,让学习模型通过对大量数据进行观察总结出相应规律

根据数据的特点不断的调节神经元的权重数值,当神经元的权重数值调节到合适范围之后,就可以利用训练后的模型

去对新的数据进行运算,通过运算结果就能准确对新的数据进行分类和预测

pandas是python中的提供的非常强大的数据读取类库
header=None是因为csv数据中第一行往往不是一个数据,往往是用来说明下面一些数据的信息的,但代码中file中第一行就是数据,所以设置文件头为None

file = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
import pandas as pd
df = pd.read_csv(file,header=None)
df.head(10)

运行结果:


关于CSV文件问题:(该段摘自某网友的回答)

file = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
import pandas as pd
df = pd.read_csv(file,header=None)
df.head(10)
1.网址是文件的原地址,数据是可以直接从网址上拔下来的。
2.如果运行以上代码csv的文件,网站只能下载txt需要下载txt后转化成csv。
以上运行结果一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章