单层感知机实现或运算

慢慢发现,百度上很多东西都没有,还是得自己去写,代码很简单,慢慢看就容易看懂,建议看之前,先看这篇文章

转载请注明:http://www.cnblogs.com/gambler/p/9039607.html

#include<bits/stdc++.h>
using namespace std;
#define MAX_SIZE 1000000

//或运算结果图
//0 0 0
//1 0 1
//0 1 0
//1 1 0
//
int expdata[MAX_SIZE][2];//训练数据
double w[2];//权值
double jud;//阈值
double spe;//训练速率
int    Y=0;//实际输出值
int    M;//理论输出值
int    N;//表示有多少组数据
void init(void){//初始化数据
    cout<<"请输入初始权值:"<<endl;
    cin>>w[0]>>w[1];
    cout<<"请输入初始阈值和训练速率:"<<endl;
    cin>>jud>>spe;
    cout<<"开始训练!"<<endl;
    freopen("input.txt","r",stdin);
    cin>>N;
    int j;
    for(j=0;j<N;j++){
        cin>>expdata[j][0]>>expdata[j][1];
    }
}

int T(int a,int b){
    if(a==1||b==1){
            return 1;
    }else{
        return 0;
    }
}

//加权修正公式为:w[i]=w[i]+spe*(T-Y)*x
void weighteinterpolation(int a,int b){
    w[0]=w[0]+spe*(M-Y)*a;
    w[1]=w[1]+spe*(M-Y)*b;
}

void display(int a){
    cout<<"第"<<a+1<<"次训练:"<<endl;
    cout<<"输入:  X0="<<expdata[a][0]<<"\tX1="<<expdata[a][1]<<endl;
    cout<<"权值:  w[0]="<<w[0]<<"\tw[1]="<<w[1]<<endl;
    cout<<"理论值:M="<<M<<"\ts实际值="<<Y<<endl;

}

void trainperceptron(){//进行训练
    int result=0;
    int i;
    for(i=0;i<N;i++){
        result=w[0]*expdata[i][0]+w[1]*expdata[i][1]-jud;
        if(result<=0){
            Y=0;
        }else{
            Y=1;
        }
        M=T(expdata[i][0],expdata[i][1]);
        if(T(expdata[i][0],expdata[i][1])!=Y){
        weighteinterpolation(expdata[i][0],expdata[i][1]);
        }
        display(i);
    }

}

void show(){
    cout<<"训练结束!!!"<<endl;
    cout<<"训练后的权值是:"<<endl;
    cout<<"w[0]:"<<w[0]<<"\tw[1]:"<<w[1]<<endl;
}

int main(){
    init();
    trainperceptron();
    show();
}

原文链接: https://www.cnblogs.com/gambler/p/9039607.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/273983

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 上午12:01
下一篇 2023年2月15日 上午12:03

相关推荐