神经网络原理及python实现(三)

四:ANN Classifier算法实现:

import numpy as np;
from numpy import random,mat,multiply,sqrt;
import scipy.special as ss;
import random as R;
import copy;
from sklearn.neighbors import KNeighborsClassifier;
import time;
class ANNclassifier:
    __all__=['fit','predict'];
    def __init__(self,learningrate=0.5):
        self.w_input_hidden=[];
        self.w_hidden_output=[];
        self.lr=learningrate;
        self.dict_label=dict();
        self.sigmoid=lambda x:ss.expit(x);
    
    def outputlabel(self,a):
        from collections import Counter
        b=[x[0] for x in Counter(a).most_common()];
        b.sort();
        c=[];
        for i in range(len(b)):
            temp=[0.01]*len(b);
            temp[i]=0.99;
            c.append(temp);
        e=[(i,c[b.index(i)]) for i in b];
        d=dict(e);
        return d;

    def findlabel(self,diction,value):
        for key in diction:
            if diction[key]==value:
                return key;
        return 0;
    
    def rate_err_w(self,err,inp,outp):
        # print(err,outp,'-------------------------',sep='\n');
        rate=multiply(err,outp);
        # print(rate,(1-outp),'----------------------',sep='\n');
        rate=multiply(rate,(1-outp));
        # print(rate,inp.T,'---------------------',sep='\n');
        rate=np.matmul(rate,inp.T);
        # print(rate,'----------------------',sep='\n')
        return rate;

    def fit(self,data,label):
        from collections import Counter
        # n: the number of candidate of data
        # m: the number of element of each candidate
        n,m=mat(data).shape;
        label=[x[0] for x in label];
        m2=len([x[0] for x in Counter(label).most_common()]);
        self.dict_label=self.outputlabel(label);

        self.w_input_hidden=random.normal(0.0,pow(int(m/2),-0.5),(int(m/2),m));
        self.w_hidden_output=random.normal(0.0,pow(m2,-0.5),(m2,int(m/2)));
        for i in range(n):
            layer_input=mat(data[i]).T;   #input layer
            layer_hidden=self.sigmoid(np.matmul(self.w_input_hidden,layer_input));    
            # hidden layer
            layer_output=self.sigmoid(np.matmul(self.w_hidden_output,layer_hidden));  
            # output layer
            # print(label[i],self.dict_label);
            err_output=mat(self.dict_label[label[i]]).T-layer_output;
            err_hidden=mat(np.matmul(self.w_hidden_output.T,err_output));  
            #upgrade---------------------------------------------------
            # err back with weight
             
          self.w_hidden_output+=self.lr*self.rate_err_w(err_output,layer_hidden,layer_output);
            self.w_input_hidden+=self.lr*self.rate_err_w(err_hidden,layer_input,layer_hidden);

    def predict(self,data):
        y=[];
        for i in range(len(data)):
            layer_input=mat(data[i]).T;
            layer_hidden=self.sigmoid(np.matmul(self.w_input_hidden,layer_input));
            layer_ouput=self.sigmoid(np.matmul(self.w_hidden_output,layer_hidden));
            xp=[x[0] for x in layer_ouput.tolist()];

            # print(xp);
            xp=np.round(xp)*0.98+0.01;
            xp=xp.tolist();
            # print(xp);

            y.append([self.findlabel(self.dict_label,xp)]);
        return y;

五:参考文献:

【1】智能优化算法及其MATLAB实例,包子阳,余继周,电子工业出版社

【2】python神经网络编程,[英]塔里克*拉希德,人民邮电出版社

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值