从了解机器学习开始

一、初识机器学习

一、什么是机器学习

  1、简单的说,机器学习就是把无序的数据转换成有用的信息

  机器学习横跨计算机科学,工程技术和统计学等多个学科,需要多学科的专业知识,它可以作为实际工具应用于从政治到地质学的多个领域,解决其中的很多问题,甚至可以说,机器学习对于任何需要解释并操作数据的领域有所作为。

二、传感器和海量数据

  1、虽然我们已经从互联网上获取了大量的人为数据,但最近却涌现出了更多的非人数据,比如传感器技术

  2、智能手机的普及,智能手机上封装了很多的传感器,如偏航率陀螺仪,三轴加速计,温度传感器,GPS接收器等,使得我们能得到更多的海量数据

  3、移动计算和传感器产生的海量数据意味着未来我们将面临着越来越多的数据,如何从海量数据中抽取到有价值的信息将是一个非常重要的课题

三、机器学习的重要性

  1、虽然我们可以从互联网上获取到海量的数据,但这并没有简化知识工人的工作难度,针对具体任务搞懂所有相关数据的意义所在,这正成为基本的技能要求。

  2、大量的经济活动都依赖于信息,我们不能在海量的数据中迷失,机器学习将有助于我们穿越数据雾霭,从中抽取出有用的信息

四、关键术语

  1、在开始研究机器学习算法之前,必须掌握一些基本的术语。

  2、机器学习的主要任务就是分类:

    例如:构建鸟类分类系统,开发出能够识别鸟类的计算机软件,鸟类学者就可以退休了,因为鸟类学者是研究鸟类的专家,因此 我们说创建的是一个专家系统

  3、如何学习分类:

    通常我们为算法输入大量已经分类的数据作为算法的训练集,训练集是用于训练机器学习算法的数据样本集合

    目标变量是机器学习算法的预测结果,在分类算法中目标变量的类型通常是标称型的,而在回归算法中通常是连续型的

    训练样本集必须确认知道目标变量的值,以便机器学习算法可以发现特征和目标变量之间的关系

    为了测试机器学习算法的效果,通常使用两套独立的样本集:训练数据和测试数据

  4、知识表示:

    假设鸟类分类程序,经过测试满足精确度要求,是否我们就可以看到机器已经学会了如何区分不同的鸟类呢?这部分工作称之为知识表示

    知识表示可以采用规则集的形式,也可以采用概率分布的形式,甚至可以是训练样本集中的一个实例

    

五、机器学习的主要任务

  1、机器学习的主要任务就是分类,而分类的主要任务是将实例数据划分到合适的分类中

  2、机器学习的另外一项任务时回归:它主要用于预测数值型数据

    例如:数据拟合曲线:通过给点数据点的最优拟合曲线

  分类和回归属于监督学习,之所以称监督学习,是因为这类算法必须知道预测什么,即目标变量的分类信息

  与监督学习相对应的是无监督学习,此时数据没有类别信息,也不会给定目标,在无监督学习中,将数据集合分成由类似的对象组成的多个类的过程被称之为聚类,将寻找描述数据统计值的过程称之为密度估计,此外,无监督学习还可以减少数据特征的维度,以便我们可以使用二维或三维图形更加直观地展示数据信息

  监督学习的主要用途:

  1.k-近邻算法

  2.朴素贝叶斯算法

  3.支持向量机

  4.决策树

  5.线性回归

  6.局部加权线性回归

  7.ridge回归

  8.lasso最小回归系数估计

  无监督学习的主要用途:

  1.k-均值

  2.DBSCAN

  3.最大期望算法

  4.parzen窗设计

六、选择合适的算法

1、选择合适算法需要考虑2个问题:

  1.使用机器学习算法的目的,想要算法完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分类

  2.需要分析或收集的数据是什么

  最终我们要能在一定程度上缩小算法的选择范围,一般并不存在最好的算法或者可以给出最好结果的算法,同时还要尝试不同算法的执行结果

七、开发机器学习应用程序的步骤

通常遵循以下步骤:

  1.收集数据:我们可以使用很多方法收集样本数据,比如制作网络爬虫

  2.准备输入数据:得到数据之后,还必须确保数据格式符合要求,主要采用python语言的list

  3.分析输入数据:此步骤主要是人工分析以前得到的数据,为了确保前两步有效,最简单的方法是使用文本编辑器打开数据文件,查看得到的数据是否为空。

    这步的主要作用是确保数据集中没有垃圾数据

  4.训练算法:机器学习算法从这一步才 真正开始学习,我们将前两步得到的格式化数据输入到算法中,从中抽取知识或信息。

    如果使用无监督学习算法,由于不存在目标变量值,故而也不需要训练算法,所有与算法相关的内容都集中在第5步

  5.测试算法:这一步将实际使用第4步机器学习得到的知识信息,为了评估算法,必须测试算法工作的效果,对于监督学习,必须已知用于评估算法的目标变量值,对于无监督学习,也必须用其他的评测手段来检测算法的成功率,无论哪种情形,如果不满意算法的输出结果,则可以回到第4步,改正并加以测试,问题常常会跟数据的收集和准备有关,这时你就必须跳回第1步重新开始

  6.使用算法:将机器学习算法转换为应用程序,执行实际任务,以检验上述步骤是否可以在实际环境中正常工作

二、算法:

  1、k-近邻算法

    1、什么是k-邻近算法:

    简单地说,k-邻近算法采用测量不同特征值之间的距离方法进行分类

    优点:精度高,对异常值不敏感,无数据输入假定

    缺点:计算复杂度高,空间复杂度高

    适用数据范围:数值型和标称型

    2、k-近邻算法的工作原理:

    它的工作原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系,输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签,一般来说,我们只选择数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数,最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类

    k-近邻算法的一般流程:

    1.收集数据:可以使用任何方法

    2.准备数据:距离计算所需要的数值,最好是结构化的数据格式

    3.分析数据:可以使用任何方法

    4.训练算法:此步骤不适用于k-近邻算法

    5.测试算法:计算错误率

    6.使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理

    3、实施knn分类算法:

    对未知类别属性的数据集中的每个点 依次执行以下操作:

      1.计算已知类别数据集中的点与当前点之间的距离

      2.按照距离递增次序排序

      3.选取与当前点距离最小的k个点

      4.确定前k个点所在类别的出现频率

      5.返回前k个点出现频率最高的类别作为当前点的预测分类

    

 1 #导入科学计算模块
 2 from numpy import *
 3 #导入运算符模块
 4 import operator
 5 
 6 def createdataset():
 7     group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
 8     labels=['A','A','B','B']
 9     return group,labels
10 
11 #inx分类的输入向量,dataset输入的训练样本集,;labels标签向量,
12 # k表示选择最近邻的数目,其中标签向量的元素数目和矩阵dataset的行数相同
13 def classify0(inx,dataset,labels,k):
14     #欧氏距离计算
15     #查看多维数组,取出行数
16     datasetsize=dataset.shape[0]
17     #二维重复输出,输出后与原训练样本集相减
18     diffimat=tile(inx,(datasetsize,1))-dataset
19     #相减后再取平方
20     sqdiffmat=diffimat**2
21     #如果axis=1那么就是对所有在同一行的元素求和
22     sqdistances=sqdiffmat.sum(axis=1)
23     #开根号
24     distances=sqdistances**0.5
25     #返回数组值从小到大的索引值
26     sortedistindicies=distances.argsort()
27     classcount={}
28     #选择距离最小的点
29     for i in range(k):
30         voteilabel=labels[sortedistindicies[i]]
31         classcount[voteilabel]=classcount.get(voteilabel,0)+1
32     #排序
33     sortedclasscount=sorted(classcount.items(),key=operator.itemgetter(1),reverse=True)
34     return sortedclasscount[0][0]
35 
36 group,labels=createdataset()
37 res=classify0([0,0],group,labels,3)
38 print(res)

输出结果应该是B,我们可以改变输入[0,0]为其他值,测试程序运行结果

此时我们已经构造了一个分类器,使用这个分类器可以完成很多分类的任务

 

 

  

  

posted @ 2018-11-16 21:29  Maple_feng  阅读(327)  评论(0编辑  收藏  举报