1.什么是机器学习

机器学习是为了应对系统程序设计,属于计算机科学类的学科,它能根据经验进行自动学习和提高。例如:一个由程序操纵的机器人,它能根据从传感器搜集到的数据,完成一系列的任务和工作。它能根据数据自动地学习应用程序。

2.机器学习与数据挖掘的区别

机器语言是指在没有明确的程序指令的情况下,给予计算机学习能力,使它能自主的学习、设计和扩展相关算法。数据挖掘则是一种从非结构化数据里面提取知识或者未知的、人们感兴趣的图片。在这个过程中应用了机器学习算法。

3.什么是机器学习的过度拟合现象

在机器学习中,当一个统计模型首先描述随机误差或噪声,而不是自身的基本关系时,过度拟合就会出现。当一个模型是过于复杂,过拟合通常容易被发现,因为相对于训练数据类型的数量,参数的数量过于五花八门。那么这个模型由于过度拟合而效果不佳。

4.过度拟合产生的原因

由于用于训练模型的标准并不等同于判断模型效率的标准,这导致了产生过度拟合的可能性。

5.如何避免过度拟合

当你使用较小的数据集进行机器学习时,容易产生过度拟合,因此使用较大的数据量能避免过度拟合现象。但是,当你不得不使用小型数据集进行建模时,可以使用被称为交叉验证的技术。在这种方法中数据集被分成两节,测试和训练数据集,测试数据集只测试模型,而在训练数据集中,数据点被用来建模。

在该技术中,一个模型通常是被给定有先验知识的数据集(训练数据集)进行训练,没有先验知识的数据集进行测试。交叉验证的思想是:在训练阶段,定义一个数据集用来测试模型。
Continue reading

一、简答题
1.深度神经网络目前有哪些成功的应用?简述原因。(10分)

2 列举不同进程共享数据的方式(至少三种)。
管道(pipe)、命名管道(named pipe)、信号(signal)、信号量(semaphore)、套接字(socket)、消息队列(message queue)、共享内存和内存映射(mapped memeory)。

3 对于N个样本,每个样本为D维向量,采用欧式距离使用KNN做类预测。(10分)

1).给出预测时间复杂度。
2).当N很大时,有哪些方法可以降低复杂度?
3).k取值的大小对预测方差和偏差有何影响?
现在看来N应该是训练集的样本数,时间复杂度是指的分类一个样本需要的时间。

(1)KNN分类的的思想是,计算待分类样本与训练集中所有样本的距离,找出距离最小的k个,计算那个标签出现的次数最多,将出现最多的标签作为样本的标签。计算距离的复杂度是O(M*D),排序最快得是O(M*log(M)),找出现最多的标签的复杂度是K。因此总的时间复杂度是O(N*D+N*log(N)+K))。

(2)KNN比较费时的步骤在于要计算与训练集中每一个样本的距离,为了减少计算量,可以每次从训练集中随机地选取一部分样本进行,作为分类的依据。假设每次取T个点,则时间复杂度变为O((T*D+T*log(T)+K))。当N很大时,选取的T可以远远小于N。
(3)记样本的真实标签为Y,分类结果记为X,X是随机变量,可以取训练集中所有出现的类标签。

如果K=N,则任意Y,X|Y=训练集中包含样本数最多的类的标签。

如果K=1,则分类结果是离待分类样本最近的训练集中的样本的类的标签。

现在,仍然没有梳理出这里的方差和偏差指的是什么?

Continue reading

谈一下我今天参加完后的感受吧,首先神经网络很重要,他们也很关注这个方面的应用。还有就是很深厚的数学背景,对矩阵,线代,和概率论等知识考察的比较多。

一、简答题

1、目前深度神经网络有哪些成功的应用,简述其适用原因。
看图识别花朵 植物,机器翻译

2、不同进程之间进行通信的方式有哪些?(至少列出三种)

管道(pipe)、命名管道(named pipe)、信号(signal)、信号量(semaphore)、套接字(socket)、消息队列(message queue)、共享内存和内存映射(mapped memeory)。

3、有N个样本,每个样本都是D维的,使用KNN分类算法,采用欧式距离,(1)其时间复杂度为多少?(2)当N很大时,可以使用什么方法进行优化?(3)K的值对预测的方差和偏差的影响是什么?

现在看来N应该是训练集的样本数,时间复杂度是指的分类一个样本需要的时间。

(1)KNN分类的的思想是,计算待分类样本与训练集中所有样本的距离,找出距离最小的k个,计算那个标签出现的次数最多,将出现最多的标签作为样本的标签。计算距离的复杂度是O(M*D),排序最快得是O(M*log(M)),找出现最多的标签的复杂度是K。因此总的时间复杂度是O(N*D+N*log(N)+K))。

(2)KNN比较费时的步骤在于要计算与训练集中每一个样本的距离,为了减少计算量,可以每次从训练集中随机地选取一部分样本进行,作为分类的依据。假设每次取T个点,则时间复杂度变为O((T*D+T*log(T)+K))。当N很大时,选取的T可以远远小于N。

(3)记样本的真实标签为Y,分类结果记为X,X是随机变量,可以取训练集中所有出现的类标签。

如果K=N,则任意Y,X|Y=训练集中包含样本数最多的类的标签。

如果K=1,则分类结果是离待分类样本最近的训练集中的样本的类的标签。

现在,仍然没有梳理出这里的方差和偏差指的是什么?
Continue reading

  1. BP算法中,输出层节点的误差计算与隐层节点的误差计算是不同的,输出层节点的误差计算公式为 1,隐层节点的误差计算公式为 2 。

 

2.   学校图书馆共有300万册图书,想统计其中Computer,Science,计算机,科学这几个词出现的次数,并按照自然年度分类,如2016年出版的书籍中这几个词各自出现的次数,2015年······依次类推。

将每本书都存在hdfs里作为一个文件,文件名为 时间(4位年份)+书的id+书的名称。
使用mapreduce进行运算,map输出为<日期,computer次数;science次数;计算机次数;科学次数>,reduce输出同样,不过作为value的字符串中的次数为总次数。代码如下:
    public static class MyMapper extends Mapper<LongWritable,Text,Text,Text>{       
        
        private static Text outputKey = new Text();
        private static Text outputValue = new Text();
   
        @Override
        protected void map(LongWritable key, Text value, Context context)
                throws IOException, InterruptedException { 
        //得到hdfs文件名
        String filename = ((FileSplit) context.getInputSplit()).getPath().getName();
        String date = filename.substring(0, 4);
       
        //分别统计computer,science,计算机,科学出现的次数
        int computer = 0;
        int science = 0;
        int jisuanji = 0;
        int kexue = 0;
       
        String line = value.toString();
        String[] words = line.split(" ");
        for(String s:words){
        if(s.equals("computer")) computer++;
        if(s.equals("science")) science++;
        if(s.equals("计算机")) jisuanji++;
        if(s.equals("科学")) kexue++;
        }
       
        String outputVal = "" + computer + ";" + science + ";" + jisuanji + ";" + kexue;
        outputKey.set(date);
        outputValue.set(outputVal);
        context.write(outputKey, outputValue);
                             
        }
  }
    
    public static class MyReducer extends Reducer<Text, Text, Text, Text> {

    @Override
protected void reduce(Text key, Iterable<Text> values,Context context)
throws IOException, InterruptedException {
    int allComputer = 0;
    int allScience = 0;
    int allJisuanji = 0;
    int allKexue = 0;
   
    for(Text value:values){
    String val = value.toString();
    String[] str = val.split(";");
    allComputer += Integer.parseInt(str[0]);
    allScience += Integer.parseInt(str[1]);
    allJisuanji += Integer.parseInt(str[2]);
    allKexue += Integer.parseInt(str[3]);
    }
   
    String finalVal = "" + allComputer + ";" + allScience + ";" + allJisuanji + ";" + allKexue;
    context.write(key, new Text(finalVal));    
    } 
  }

Continue reading

排序算法:
1.插入排序—直接插入排序(Straight Insertion Sort)

void print(int a[], int n ,int i){  
    cout<<i <<":";  
    for(int j= 0; j<8; j++){  
        cout<<a[j] <<" ";  
    }  
    cout<<endl;  
}  
  
  
void InsertSort(int a[], int n)  
{  
    for(int i= 1; i<n; i++){  
        if(a[i] < a[i-1]){               //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入  
            int j= i-1;   
            int x = a[i];        //复制为哨兵,即存储待排序元素  
            a[i] = a[i-1];           //先后移一个元素  
            while(x < a[j]){  //查找在有序表的插入位置  
                a[j+1] = a[j];  
                j--;         //元素后移  
            }  
            a[j+1] = x;      //插入到正确位置  
        }  
        print(a,n,i);           //打印每趟排序的结果  
    }  
      
}  
  
int main(){  
    int a[8] = {3,1,5,7,2,4,9,6};  
    InsertSort(a,8);  
    print(a,8,8);  
}

 

2. 插入排序—希尔排序(Shell`s Sort)

3. 选择排序—简单选择排序(Simple Selection Sort)

void print(int a[], int n ,int i){  
    cout<<"第"<<i+1 <<"趟 : ";  
    for(int j= 0; j<8; j++){  
        cout<<a[j] <<"  ";  
    }  
    cout<<endl;  
}  
/** 
 * 数组的最小值 
 * 
 * @return int 数组的键值 
 */  
int SelectMinKey(int a[], int n, int i)  
{  
    int k = i;  
    for(int j=i+1 ;j< n; ++j) {  
        if(a[k] > a[j]) k = j;  
    }  
    return k;  
}  
  
/** 
 * 选择排序 
 * 
 */  
void selectSort(int a[], int n){  
    int key, tmp;  
    for(int i = 0; i< n; ++i) {  
        key = SelectMinKey(a, n,i);           //选择最小的元素  
        if(key != i){  
            tmp = a[i];  a[i] = a[key]; a[key] = tmp; //最小元素与第i位置元素互换  
        }  
        print(a,  n , i);  
    }  
}  
int main(){  
    int a[8] = {3,1,5,7,2,4,9,6};  
    cout<<"初始值:";  
    for(int j= 0; j<8; j++){  
        cout<<a[j] <<"  ";  
    }  
    cout<<endl<<endl;  
    selectSort(a, 8);  
    print(a,8,8);  
}

 

4. 选择排序—堆排序(Heap Sort)

5. 交换排序—冒泡排序(Bubble Sort)

6. 交换排序—快速排序(Quick Sort)

7. 归并排序(Merge Sort)

8. 桶排序/基数排序(Radix Sort)
Continue reading