一.吴恩达深度学习第三课第一周(个人杂记) 
-  
机器学习训练时的调整策略:收集更多数据,增加数据多样性,花费更多时间来进行梯度下降,调整网络结构,dropout,L2正则化。   -  
正交化指调整策略的方式之间需要正交,例如一辆车在开,需要调整速度和调整方向,两个按钮(油门和方向盘)是正交的,它们之间不会相互影响。   -  
单一数字评估指标:在多个算法之间进行选择时,需要选取单个的评估指标来进行比较。   -  
在多个机器学习模型(算法)之间进行选择,若需要采取多个评估指标来进行选择,则可以采用满足和优化指标的原则。优化指标是唯一的,例如模型精确度越大越好。满足指标可以有多个,对于每个指标只要在一定的范围内就可以,不需要追求指标的大小。   -  
训练,开发(测试),测试集划分:在同一分布中定义开发与测试集,以及评估指标,你就可以瞄准正确的目标。设立训练集的方式,则会影响你逼近那个目标有多快。   -  
机器学习训练时,未超过人的表现之前模型准确率会上升地很快,在超过人的表现之后会进入缓慢增长期,上升地很慢,并且准确率不会超过某一个值,这个值是贝叶斯最优错误率。在未超过人类表现前,有很多的工具可以使用,可以让人帮忙标注数据,调整指标,但是在超过人的表现后,还需上升,就只能自己去学习,比较困难。   -  
可避免偏差:贝叶斯错误率(或其估计)与训练错误率之间的差值,称为可避免偏差。训练集和开发集错误率之间的差值就说明你的算法在方差问题上还有多少改善空间。     
二. CCF CSP 2020-06第一题 
1. 线性分类器 
#include <iostream>
#include <set>
# include <algorithm>
using namespace std;
const int N = 1010;
int n,m;
int theta0[25],theta1[25],theta2[25];
string out[25];
set<int> A_set,B_set;
struct Dot{
    int x;
    int y;
    char type;
}dot[N];
int flag1,flag2;
int isrightA = 1,isrightB =1,isright = 1;
int main(){
    scanf("%d%d",&n,&m);
    char a;
    for(int i = 1; i <= n ; i++){
        scanf("%d%d",&dot[i].x,&dot[i].y);
        scanf("%c%c",&a,&dot[i].type);
        if(dot[i].type == 'A') A_set.insert(i);
        else B_set.insert(i);
    }
    for(int i = 1 ; i <= m; i++){
        scanf("%d%d%d",&theta0[i],&theta1[i],&theta2[i]);
    }
    for(int i = 1 ; i <= m; i++){
        
        isrightA = 1;
        isrightB = 1;
        set<int>::iterator temp = A_set.begin();
        int sum = theta0[i]+theta1[i] * dot[*temp].x+ theta2[i] * dot[*temp].y;
        if(sum > 0) flag1 = 1;
        else flag1 = 0;
        for(set<int>::iterator it = A_set.begin();it != A_set.end();it++){
            sum = theta0[i]+theta1[i] * dot[*it].x+ theta2[i] * dot[*it].y;
            if(flag1){
                if(sum < 0) {
                    isrightA = 0;
                    break;
                }
            }else{
                if(sum > 0){
                    isrightA = 0;
                    break;
                }
            }
        }
        
        for(set<int>::iterator it = B_set.begin();it != B_set.end();it++){
            sum = theta0[i]+theta1[i] * dot[*it].x+ theta2[i] * dot[*it].y;
            if(flag1){
                if(sum > 0) {
                    isrightB = 0;
                    break;
                }
            }else{
                if(sum < 0){
                    isrightB = 0;
                    break;
                }
            }
        }
        if(isrightA && isrightB) out[i].assign("Yes");
        else out[i].assign("No");
    }
    for(int i = 1; i <= m - 1; i++)printf("%s\n",out[i].c_str());
    printf("%s",out[m].c_str());
    return 0;
}
 
                
                
                
        
    
 
 |