机器学习能让咱们自数据集中受到启发,换句话说,咱们会利用计算机来彰显数据背后的真实含义,这才是机器学习的真实含义。它既不是只会徒然模仿的机器人,也不是具备人类感情的仿生人。html
机器学习就是把无序的数据转换成有用的信息。正则表达式
机器学习横跨计算机科学、工程技术和统计学等多个学科,须要多个学科的专业知识。算法
1.1.1 传感器和海量数据shell
地震预测中,传感器收集了海量的数据,如何从这些数据中抽取出有价值的信息是一个很是值得研究的课题。编程
1.1.2 机器学习很是重要数组
大量的经济活动都依赖于信息,咱们不能在海量的数据中迷失,机器学习将有助于咱们穿越数据雾霭,从中抽取出有用的信息。网络
专家系统dom
机器学习的一项任务就是分类。机器学习
咱们决定使用某个机器学习算法进行分类,首先须要作的是算法训练,即学习如何分类。编辑器
一般咱们为算法输入大量已分类数据做为算法的训练集。训练集是用于机器学习算法的数据样本集合。
目标变量是机器学习算法的预测结果,在分类算法中目标变量的类型一般是离散型的,而在回归算法中一般是连续型的。训练样本集是必须肯定知道目标变量的值,以便机器学习算法能够发现特征和目标变量之间的关系。
咱们一般将分类问题中的目标变量称为类别,并假定分类问题只存在有限个数的类别。
特征或者属性一般是训练样本集的列,它们一般是独立测量获得的结果,多个特征联系在一块儿共同组成一个训练样本。
为了测试机器学习算法的效果,一般使用两套独立的样本集:训练数据和测试数据。当机器学习程序开始运行时,使用训练样本集做为算法的输入,训练完成以后属于哪一个样本。输入测序样本时并不提供测试样本的目标变量,由程序决定样本属于哪一个类别。比较测试样本预测的目标变量值与实际样本类别之间的差异,就能够得出算法的实际精确度。
知识表示,某些算法能够产生很容易理解的知识表示,而某些算法的知识表示也许只能为计算机所理解。知识表示能够采用规则集的形式,也能够采用几率分布的形式,甚至能够时训练样本集的一个实例。
1、分类,主要任务是将实例数据划分到合适的分类中。
2、回归,主要用于预测数值型数据。
数据拟合曲线:经过给定数据点的最优拟合曲线。
分类和回归属于监督学习,这类算法必须知道预测什么,即目标变量的分类信息。
与监督学习相对应的是非监督学习,此时数据没有类别信息,也不会给定目标值。在非监督学习中,将数据集合分红由相似的对象组成的多个类的过程被称为聚类;将寻找描述数据统计值的过程称之为密度估计。此时,非监督学习还能够减小数据特征的维度,以便咱们可使用二维或三维图形更加直观地展现数据信息。
选择实际可用的算法,必须考虑下面两个问题:
1、使用机器学习算法的目的,想要算法完成何种任务,好比,是预测明天下雨的几率仍是岁投票者按照兴趣分组;
2、须要分析或收集的数据是什么?
首先考虑使用机器学习算法的目的。若是想要预测目标变量的值,则能够选择监督学习算法,不然选择非监督学习算法。肯定选择监督算法以后,须要进一步肯定目标变量类型,若是目标变量是离散型,如是/否、1/2/三、A/B/C或者红/黄/黑等,则能够选择分类算法;若是目标变量是连续性的数值,如0.0~100.00、-999~999或者-∞~+∞,则须要选择回归算法。
若是不想预测目标变量的值,则能够选择非监督学习算法。进一步分析是否须要将数据划分为离散的组。若是这是惟一的需求,则使用积累算法;若是还须要估计与每一个分组的类似程度,则须要使用密度估计算法。
在大多数状况下,上面给出的选择方法都能帮助读者选择恰当的机器学习算法,但这也并不是一成不变。
其次须要考虑的是数据问题。咱们应该充分了解数据,对实际数据了解得越充分,也容易建立符合实际需求的应用程序。主要应该了解数据的如下特征:特征值是离散型仍是连续性变量,特征值中是否存在缺失的值,何种缘由形成缺失值,数据中是否存在异常值,某个特征发生的频率如何(是否罕见得如同海底捞月),等等。充分了解上面提到的这些数据能够缩短选择机器学习算法的时间。
咱们只能在必定程度上缩小算法的选择范围,通常并不存在最好的算法或者能够给出最好结果的算法,同时还要尝试不一样算法的效果。对于所选的每种算法,均可以使用其余的机器学习技术来改进其性能。在处理输入数据以后,两个算法的相对性能也可能会发生变化。
机器学习算法虽然各不相同,可是使用算法建立应用程序的步骤却基本相似。
(1)收集数据。咱们可使用不少方法收集样本数据。如:制做网络爬虫从网站上抽取数据、从RSS反馈或者API中获得信息、设备发送过来的实测数据(风速、血糖等)。
(2)准备输入数据。获得数据以后,必须确保数据格式符合要求,这里采用的是Python的List。使用这种标准格式能够融合算法和数据源,方便匹配操做。使用Python语言构造算法应用,参照这里。
此外还须要为机器学习算法准备特定的数据格式,如某些算法要求特征值使用特定的格式,一些算法要求目标变量和特征值是字符串类型,而另外一些算法则可能要求是整数类型。与收集数据的格式相比,处理特殊算法要求的格式相对简单得多。
(3)分析输入数据。此步骤主要是人工分析之前的数据。为了确保前两步有效,最简单的方法是用文本编辑器打开数据文件,查看获得的数据是否为空值。此外,还能够进一步浏览数据,分析是否能够识别出模式;数据中是否存在明显的异常值,如某些数据点与数据集中的其余值存在明显的差别。经过一维、二维或三维图形展现数据也是不错的方法,然而大多数时候咱们获得的数据的特征值都不会低于三个,没法一次图形化展现全部特征。提炼数据,使得多为数据能够压缩到二维或三维,方便咱们图形化展现数据。
这一步的主要做用是确保数据集中没有垃圾数据。若是是在产品化系统中使用机器学习算法而且算法能够处理系统产生的数据格式,或者咱们信任数据来源,能够直接跳过第3步。此步骤须要人工干预,若是在自动化系统中还须要人工干预,显然就下降了系统的价值。
(4)训练算法。机器学习算法从这一步才真正开始学习。根据算法的不一样,第4步和第5步是机器学习算法的核心。咱们将前两步获得的格式化数据输入到算法,从中抽取知识或信息。这里获得的知识须要存储为计算机能够处理的格式,方便后续步骤使用。
若是使用无监督学习算法,因为不存在目标变量值,故而也不须要训练suan'fa,全部与算法相关的内容都集中在第5步。
(5)测试算法。这一步将实际使用第4步机器学习获得的知识信息。为了评估算法,必须测试算法工做的效果。对于监督学习,必须已知用于评估算法的目标变量值;对于无监督学习,也必须用其余的评测手段来检验算法的成功率。不管哪一种情形,若是不满意算法的输出结果,则能够回到第4步,改正并加以测试。问题经常会跟数据的收集和准备有关,这时你就必须跳回第1步从新开始。
(6)使用算法。将机器学习算法转换为应用程序,执行实际任务,以检验上述步骤是否能够在实际环境中正常工做。此时若是碰到新的数据问题,一样须要重复执行上述的步骤。
(1)Python的语法清晰;
(2)易于操做纯文本文件;
(3)使用普遍,存在大量的开发文档。
1.6.1 可执行伪代码
Python具备清晰的语法结构,也把它称做可执行伪代码(executable pseudo-code)。默认安装的Python开发环境已经附带了不少高级数据类型,如列表、元组、字典、集合、队列等,无需进一步编程就可使用这些数据类型的操做。使用这些数据类型使得实现抽象的数学概念很是简单。
Python语言处理和操做文本很是简单,很是易于处理非数值型数据。Python语言提供了丰富的正则表达式函数以及不少访问Web页面的函数库,使得从HTML中提取数据变得很是简单直观。
1.6.2 Python比较流行
Python语言使用普遍,代码范例也不少,便于读者快速学习和掌握。此外,在开发实际应用程序时,也能够利用丰富的模块库缩短开发周期。
在科学和金融领域,Python语言获得了普遍应用。SciPy和Numpy等许多科学函数库都实现了向量和矩阵操做,这些函数库增长了代码的可读性,学过线性代数的人均可以看懂代码的实际功能。另外,科学函数库SciPy和NumPy使用底层(C和Fortran)编写,提升了相关应用程序的计算性能。
Python的科学工具能够与绘图工具Matplotlib能够绘制2D、3D图形,也能够处理科学研究中常用到的图形。
Python开发环境还提供了交互式shell环境,容许用户开发程序时查看和检测程序内容。
Pylab模块
1.6.3 Python语言的特点
对于大多数人来讲,编程仅仅是完成其余任务的工具而已。咱们能够花费更多的时间处理数据的内在含义,而无须花费太多精力解决计算机如何获得数据结果。Python语言使得咱们很容易表达本身的目的。
1.6.4 Python语言的缺点
性能问题。
机器学习算法涉及到不少线性代数知识,这里用到线性代数只是为了简化不一样的数据点上执行的相同数学运算。将数据表示为矩阵形式,只须要执行简单的矩阵运算而不须要复杂的循环操做。这里使用PyChram的Python console,输入如下命令:
from numpy import*
上述命令将NumPy函数库中的全部模块引入到当前的命名空间。
而后输入下列命令:
random.rand(4,4)
上述命令构造了一个4×4的随机数组,由于产生的是随机数组,不一样计算机的输出结果可能与上述结果彻底不一样。
Numpy矩阵与数组的区别:NumPy函数库中存在两种不一样的数据类型(矩阵matrix和数组array),均可以用于处理行列表示的数字元素。虽然它们看起来很类似,可是在这两个数据类型上执行相同的数学运算可能获得不一样的结果,其中NumPy函数库中的matrix与MATLAB中的matrix等价。
调用mat()函数能够将数组转化为矩阵,输入如下命令:
randMat = mat(random.rand(4,4)) randMat.I
因为使用随机函数产生矩阵,不一样计算机上输出的值可能略有不一样:
.I操做符实现了矩阵求逆的运算。
执行下面的命令存储逆矩阵:
invRandMat = randMat.I
接着执行矩阵乘法,获得矩阵与其逆矩阵相乘的结果:
randMat*invRandMat
结果应该是单位矩阵,除了对角线元素是1,4×4矩阵的其余元素应该是全是0。实际输出结果略有不一样,矩阵中还留下许多微小的元素,这是计算机处理的结果。输入下述命令,获得偏差值:
myEye = randMat*invRandMat myEye - eye(4)
函数eye(4)建立4×4的单位矩阵。