PC-類神經網路感知器學習訓練

2022.11.07 PM 02:30 by CBJ

來源 : https://drive.google.com/file/d/1CMnis82zw9hGQHW1pRv3LFXACoUGA90Y/view
出題者 : 108資訊學科能力競賽複賽-彰雲嘉
標籤 : 基本運算
難易度 : 2
解題想法 : 根據題意計算、調整即可
解題建議 : 建議 define function (題敘複雜)
//C++ language
//solution link(含註解): https://github.com/CBJ0519/CBJsProgramDiary.com/blob/main/%E8%B3%87%E8%A8%8A%E5%AD%B8%E7%A7%91%E8%83%BD%E5%8A%9B%E7%AB%B6%E8%B3%BD/108%E5%BD%B0%E9%9B%B2%E5%98%89/PC-%E9%A1%9E%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF%E6%84%9F%E7%9F%A5%E5%99%A8%E5%AD%B8%E7%BF%92%E8%A8%93%E7%B7%B4.cpp

#include<iostream>
#include<vector>
#include<tuple>
#include<iomanip>
using namespace std;
double make_net(double W1,double X1,double W2,double X2,double b){
    return W1*X1+W2*X2+b;
}
int f(double net){
    if(net>=0)return 1;
    return -1;
}
double squ_loss_f(double Yd,int Y){
    return 0.5*(Yd-Y)*(Yd-Y);
}
int main(){
    vector<tuple<double,double,double>>Cases;
    double W1,W2,b,alpha;
    int p,k;
    cin>>W1>>W2>>b>>alpha>>p>>k;
    while(k--){
        double X1,X2,Yd;
        cin>>X1>>X2>>Yd;
        Cases.push_back({X1,X2,Yd});
    }
    while(p--){
        for(auto Case:Cases){
            double X1=get<0>(Case);
            double X2=get<1>(Case);
            double Yd=get<2>(Case);
            double net=make_net(W1,X1,W2,X2,b);
            int Y=f(net);
            double ep=squ_loss_f(Yd,Y);
            W1=W1+(alpha*ep*X1);
            W2=W2+(alpha*ep*X2);
        }
    }
    cout<<fixed<<setprecision(2)<<W1<<" "<<W2<<"\n";
    return 0;
}
## Python language
## solution link(含註解): https://github.com/CBJ0519/CBJsProgramDiary.com/blob/main/%E8%B3%87%E8%A8%8A%E5%AD%B8%E7%A7%91%E8%83%BD%E5%8A%9B%E7%AB%B6%E8%B3%BD/108%E5%BD%B0%E9%9B%B2%E5%98%89/PC-%E9%A1%9E%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF%E6%84%9F%E7%9F%A5%E5%99%A8%E5%AD%B8%E7%BF%92%E8%A8%93%E7%B7%B4.py

def make_net(W1,X1,W2,X2,b): return W1*X1+W2*X2+b 
def f(net):
    if net>=0: return 1 
    return -1
def squ_loss_f(Yd,Y): return 0.5*(Yd-Y)*(Yd-Y)
Cases=[]
_input=list(map(float,input().split()))
W1=_input.pop(0); W2=_input.pop(0); b=_input.pop(0)
alpha=_input.pop(0); p=int(_input.pop(0)); k=int(_input.pop(0))
for i in range(k):
    X1=int(_input.pop(0)); X2=int(_input.pop(0)); Yd=int(_input.pop(0))
    Cases.append([X1,X2,Yd])
for i in range(p):
    for case in Cases:
        X1,X2,Yd=case 
        net=make_net(W1,X1,W2,X2,b)
        Y=f(net)
        ep=squ_loss_f(Yd,Y)
        W1+=alpha*ep*X1
        W2+=alpha*ep*X2
print(f'{W1:.2f} {W2:.2f}')

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *