当前位置: 代码迷 >> 综合 >> AC dream 1730 Use Machine Learning to Find GF 【简单模拟】
  详细解决方案

AC dream 1730 Use Machine Learning to Find GF 【简单模拟】

热度:8   发布时间:2023-11-11 11:39:33.0

Use Machine Learning to Find GF

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 262144/131072KB (Java/Others)

Problem Description

众所周知,朴素贝叶斯分类是机器学习中一种经典而有效的算法。 小Xu是一个对机器学习充满兴趣的ACMer,每天沉浸在各种算法中,乐此不疲。 然而有一天,他喜欢上了系里的某一个漂亮女学霸,然而他却不敢跟她表白,更不知道是否能够追到她。经过一番痛苦的纠结,与学长的敦敦教导之后,小Xu,决定通过男人的方法——机器学习中朴素贝叶斯分类的方法来预测一下自己能否追得上自己的心上人。。。。

小Xu将以(财富a,长相b,知识c)3个维度作为特征,学长们的经历作为训练数据,自身情况作为测试数据,来进行训练和分类和预测。其中 0<=a,b,c<=1,小Xu通过朴素贝叶斯算法将结果分为两类即0(没追到)或1(追到)。E表示训练数据的全集数量(即作为训练数据的学长经历数),0<E<=100

根据朴素贝叶斯算法:

X = P(abc)P(0|abc) = P(a|0) P(b|0) P(c|0) P(0)

Y = P(abc)P(1|abc) = P(a|1) P(b|1) P(c|1) P(1)

其中P(x|0) 表示没有成功的人中具有x特征的概率。

P(x|1) 表示成功的人中具有x特征的概率。

P(0)表示训练数据中没有成功的概率,即没有成功的经历所占总数的比例。

P(1)表示训练数据中成功的概率,即成功的经历所占总数的比例。

首先用学长们的经历作为训练数据,算出各个情况的P(x|0)和 P(x|1),以及P(0)和P(1),紧接着输入测试数据(a,b,c),通过训练数据中已经得到的结果算出X,Y。

当X<=Y时,认为这是属于1,即成功这个类别的,输出”Come on guys,you can do it!”。

当X>Y时,认为这是属于0,即失败这个类别的,输出”Poor guys,you can go back to sleep now..”

Input

输入的第一行,有1个数E分别表示训练数据和测试数据的行数。

接下来的E行,每行包括a,b,c,g4个整数。其中a,b,c如上文所述,g为0,或 1 ,即是否追到。

最后一行,包括三个值,即小Xu的财富值,长相值,知识值。

Output

输出结果只有一行,当小Xu能够成功时输出”Come on guys,you can do it!”,当失败时输出” Poor guys,you can go back to sleep now..”

Sample Input

5
1 1 1 1
0 0 0 0
1 0 0 1
0 0 1 1
1 1 0 0
1 0 1

Sample Output

Come on guys,you can do it!

Source

第九届北京化工大学程序设计竞赛

Manager

rihkddd



本题如题意可以直接按照题意套公式。刚开始自己觉得要用分数表示概率,然后列了一大堆变量来当分母分子。后来想到了可以用二维数组来计数。并直接用小数来表示概率,最后比较时,只要在一定误差范围内,就可以认为X==Y。。。这样这题就很简单了。。。

分别设立四个二维数组,比如设立a【2】【2】数组。则a【1】【0】:代表失败并且具有a品质的人数。a【0】【0】:代表失败并且不具有a品质的人数。

这样就可以很方便的记录人数。


记录完毕后,直接套用题目所给的公式即可。不需要用分数,直接乘除。最后若Y-X>1e-6 则认为Y>=X.

上代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;int a[2][2], b[2][2], c[2][2], g[2];///用数组来记录数量,十分方便。int main()
{int n;while(cin>>n){memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));memset(g,0,sizeof(g));///把数组清空int x,y,z,f;for(int i=0; i<n; i++){scanf("%d %d %d %d",&x,&y,&z,&f);a[x][f]++;///记录数量b[y][f]++;c[z][f]++;g[f]++;}scanf("%d %d %d",&x,&y,&z);double X,Y;X=1.0*(a[x][0]*b[y][0]*c[z][0])/(g[0]*g[0]*n);///直接套用公式Y=1.0*(a[x][1]*b[y][1]*c[z][1])/(g[1]*g[1]*n);if(Y-X>1e-6){puts("Come on guys,you can do it!");///此处没有换行}else{puts("Poor guys,you can go back to sleep now..");}}return 0;
}

ps:本题输出无需换行。。。。




  相关解决方案