机器学习:从入门到沉迷之机器的思考方式

一般情况下我们人类大脑可以在没有明确指示的情况下处理绝大部分问题。例如,你做房产经纪时间很长,你对于房产的合适定价、它的最佳营销方式以及哪些客户会感兴趣等等都会有一种本能般的“感觉”。强人工智能(Strong AI)研究的目标就是要让计算机能这样思考。

但是目前的机器学习算法还没有那么好——它们只能专注于非常特定的、有限的问题。也许在这种情况下,“机器学习”更贴切的定义是“在少量范例数据的基础上找出一个等式来解决特定的问题”。

不幸的是,“机器在少量范例数据的基础上找出一个等式来解决特定的问题”这个名字太绕口。所以最后我们用“机器学习”取而代之。

让我们开始写代码吧!

前面例子中评估房价的程序,你打算怎么写呢?可以先思考一下。

如果你对机器学习一无所知,很有可能你会尝试写出一些基本规则来评估房价,如下:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # In my area, the average house costs $200 per sqft
  price_per_sqft = 200

  if neighborhood == "hipsterton":
    # but some areas cost a bit more
    price_per_sqft = 400

  elif neighborhood == "skid row":
    # and some areas cost less
    price_per_sqft = 100

  # start with a base price estimate based on how big the place is
  price = price_per_sqft * sqft

  # now adjust our estimate based on the number of bedrooms
  if num_of_bedrooms == 0:
    # Studio apartments are cheap
    price = price?—?20000
  else:
    # places with more bedrooms are usually
    # more valuable
    price = price + (num_of_bedrooms * 1000)

 return price

假如你像这样瞎忙几个小时,也许会取得一点成效,但是你的程序永不会完美,而且当价格变化时很难维护。

如果能让计算机找出实现上述函数功能的办法,这样岂不更好?只要返回的房价数字正确,谁会在乎函数具体干了些什么呢?

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = <computer, plz do some math for me>

  return price

考虑这个问题的一种角度是将房价看做一碗美味的汤,而汤中成分就是卧室数、面积和地段。如果你能算出每种成分对最终的价格有多大影响,也许就能得到各种成分混合起来形成最终价格的具体比例。

这样可以将你最初的程序(全是疯狂的if else语句)简化成类似如下的样子:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
 price = 0

 # a little pinch of this
 price += num_of_bedrooms * .841231951398213

 # and a big pinch of that
 price += sqft * 1231.1231231

 # maybe a handful of this
 price += neighborhood * 2.3242341421

 # and finally, just a little extra salt for good measure
 price += 201.23432095

 return price

请注意那些用粗体标注的神奇数字——.841231951398213, 1231.1231231,2.3242341421, 201.23432095。它们称为权重。如果我们能找出对每栋房子都适用的完美权重,我们的函数就能预测所有的房价!

找出最佳权重的一种笨办法如下所示:

步骤1:

首先,将每个权重都设为1.0:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # a little pinch of this
  price += num_of_bedrooms * 1.0

  # and a big pinch of that
  price += sqft * 1.0

  # maybe a handful of this
  price += neighborhood * 1.0

  # and finally, just a little extra salt for good measure
  price += 1.0

  return price

步骤2:

将每栋房产带入你的函数运算,检验估算值与正确价格的偏离程度:

运用你的程序预测房屋价格。

例如:上表中第一套房产实际成交价为25万美元,你的函数估价为17.8万,这一套房产你就差了7.2万。

再将你的数据集中的每套房产估价偏离值平方后求和。假设数据集中有500套房产交易,估价偏离值平方求和总计为86,123,373美元。这就反映了你的函数现在的“正确”程度。

现在,将总计值除以500,得到每套房产的估价偏离平均值。将这个平均误差值称为你函数的代价

如果你能调整权重使得这个代价变为0,你的函数就完美了。它意味着,根据输入的数据,你的程序对每一笔房产交易的估价都是分毫不差。而这就是我们的目标——尝试不同的权重值以使代价尽可能的低。

步骤3:

不断重复步骤2,尝试所有可能的权重值组合。哪一个组合使得代价最接近于0,它就是你要使用的,你只要找到了这样的组合,问题就得到了解决!

头脑风暴时间

这太简单了,对吧?想一想刚才你做了些什么。你取得了一些数据,将它们输入至三个通用的简单步骤中,最后你得到了一个可以对你所在区域的房屋进行估价的函数。
但是下面的事实可能会扰乱你的思想:

1.过去40年来,很多领域(如语言学/翻译学)的研究表明,这种通用的权重运算方式的学习算法已经胜过了需要利用真人明确规则的方法。机器学习的“笨”办法最终打败了人类专家。

2.你最后写出的函数真是笨,它甚至不知道什么是“面积”和“卧室数”。它知道的只是搅动,改变数字来得到正确的答案。

3.很可能你都不知道为何一组特殊的权重值能起效。所以你只是写出了一个你实际上并不理解却能证明的函数。
4.试想一下,你的程序里没有类似“面积”和“卧室数”这样的参数,而是接受了一组数字。假设每个数字代表了你车顶安装的摄像头捕捉的画面中的一个像素,再将预测的输出不称为“价格”而是叫做“方向盘转动度数”,这样你就得到了一个程序可以自动操纵你的汽车了!

太疯狂了,对吧?

步骤3中的“尝试每个数字”怎么回事?

好吧,当然你不可能尝试所有可能的权重值来找到效果最好的组合。那可真要花很长时间,因为要尝试的数字可能无穷无尽。
为避免这种情况,数学家们找到了很多聪明的办法(维基百科)来快速找到优秀的权重值,而不需要尝试过多。下面是其中一种:
首先,写出一个简单的等式表示前述步骤2:

接着,让我们将这同一个等式用机器学习的数学术语(现在你可以忽略它们)进行重写:

θ表示当前的权重值。 J(θ) 意为“当前权重值对应的代价”。

这个等式表示我们的估价程序在当前权重值下偏离程度的大小。
如果将所有赋给卧室数和面积的可能权重值以图形形式显示,我们会得到类似下图的图表:

事实上这个图在以后的学习中会遇到,我们一般给它取名叫损失函数与参数之间的曲面图

图中蓝色的最低点就是代价最低的地方——即我们的程序偏离最小。最高点意味着偏离最大。所以,如果我们能找到一组权重值带领我们到达图中的最低点,我们就找到了答案!

因此,我们只需要调整权重值使我们在图上能向着最低点“走下坡路”。如果对于权重的细小调节能一直使我们保持向最低点移动,那么最终我们不用尝试太多权重值就能到达那里。

如果你还记得一点微积分的话,你也许记得如果你对一个函数求导,结果会告诉你函数在任一点的斜率。换句话说,对于图上给定一点,它告诉我们那条路是下坡路。我们可以利用这一点朝底部进发。

所以,如果我们对代价函数关于每一个权重求偏导,那么我们就可以从每一个权重中减去该值。这样可以让我们更加接近山底。一直这样做,最终我们将到达底部,得到权重的最优值。(读不懂?不用担心,接着往下读)。

这种找出最佳权重的办法被称为批量梯度下降,上面是对它的高度概括。如果想搞懂细节,不要害怕,我们在后面会继续学习。

先简单发一张损失函数的等高线图来镇楼:

当你使用机器学习算法库来解决实际问题,所有这些都已经为你准备好了。但明白一些具体细节总是有用的。

还有什么你随便就略过了?

其时上面整个内容介绍的就是机器学习中的一种思想:多元线性回归,一种深度学习算法。即根据多个数据样本生成一个问题解决方案。

这边的内容需要有一定的入门知识,我打算按照这个方向学习下去(加个好友一起学习啊)。

机器学习法力无边吗?

一旦你开始明白机器学习技术很容易应用于解决貌似很困难的问题(如手写识别),你心中会有一种感觉,只要有足够的数据,你就能够用机器学习解决任何问题。只需要将数据输入进去,就能看到计算机变戏法一样找出拟合数据的等式。

但是很重要的一点你要记住,机器学习只能对用你占有的数据实际可解的问题才适用。

例如,如果你建立了一个模型来根据每套房屋内盆栽数量来预测房价,它就永远不会成功。房屋内盆栽数量和房价之间没有任何的关系。所以,无论它怎么去尝试,计算机也推导不出两者之间的关系。

怎样深入学习机器学习

打算采用Andrew Ng的网页教程UFLDL Tutorial,据说这个教程写得浅显易懂,也不太长。不过在这这之前还是复习下machine learning的基础知识,见网页:http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=DeepLearning。内容其实很短,每小节就那么几分钟,且讲得非常棒。

入门已经结束,接下来还有好几座大山去爬。共勉!!

时间: 2024-10-18 00:22:22

机器学习:从入门到沉迷之机器的思考方式的相关文章

【机器学习快速入门】简单自学机器学习理论

[机器学习快速入门]简单自学机器学习理论 机器学习理论--part I 前言 (第II部分内容点此:第III部分内容点此) 动机 大多数人在小的时候被魔术师以及魔术技巧所迷住,并想弄明白其中的奥秘.有些人会带着这份迷恋研究到更深处并学习魔术技巧,有些人会接受专业的训练,而其他人会继续平庸下去.我在年幼时也尝试过魔术技巧并沉迷于其中,然而后来学习的是另外一种魔术,称作计算机编程. 编程确实酷似魔法, 和魔术一样,自学的现象在计算机编程世界占了上风.在过去的两年计算机开发者调查显示,超过一半的开发者

机器学习:从入门到沉迷

机器学习:从入门到沉迷 最简单的机器学习介绍 你是不是也经常听人说起机器学习但是完全不能明白到底什么才是机器学习,是不是完全厌倦了与同事点头一样的交谈,让我们通过这篇文章改变这一现状吧 这是一篇针对想知道什么是机器学习但是不知道如何入门的人的入门.我猜有很多人厌倦了通过图阅读维基百科的文章来了解机器学习,想有一篇通俗的文章来介绍什么才是机器学习,那么这篇文章就是这样的 什么是机器学习 当你要通过很多数据去发现某个问题的时候,你不用去针对特定的问题编写代码而是通过使用很多通用算法来获得获得你所需要

【转】机器学习最佳入门学习资料汇总

机器学习最佳入门学习资料汇总 专为机器学习初学者推荐的优质学习资源,帮助初学者快速入门. 这篇文章的确很难写,因为我希望它真正地对初学者有帮助.面前放着一张空白的纸,我坐下来问自己一个难题:面对一个对机器学习领域完全陌生的初学者,我该推荐哪些最适合的库,教程,论文及书籍帮助他们入门? 资源的取舍很让人纠结,我不得不努力从一个机器学习的程序员和初学者的角度去思考哪些资源才是最适合他们的. 我为每种类型的资源选出了其中最佳的学习资料.如果你是一个真正的初学者,并且有兴趣开始机器学习领域的学习,我希望

机器学习如何入门

作者:Leon链接:https://www.zhihu.com/question/20691338/answer/102249162来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 数 学 很多人翻看任何一本机器学习的书,看到一推的数学公式就开始打退堂鼓了.开始搜索,提问"机器学习需要哪些数学知识?"然后得到的结果可能会是"矩阵分析,概率论,优化设计--"而且还会有大量的人推荐一些例如"All of Statistics&qu

07_android入门_採用HttpClient的POST方式、GET方式分别实现登陆案例

1.简单介绍 HttpClient 是 Apache Jakarta Common 下的子项目,能够用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,而且它支持 HTTP 协议最新的版本号和建议. 2.功能介绍 ? ? 下面列出的是 HttpClient 提供的基本的功能,要知道很多其它具体的功能能够參见 HttpClient 的主页. (1)实现了全部 HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支持自己主动转向 (3)支持 HTTPS 协议 (4

机器学习:梯度下降法(调试、其它思考)

一.梯度下降法的调试 1)疑问 / 难点 如何确定梯度下降法的准确性? 损失函数的变量 theta 在某一点上对应的梯度是什么? 在更负责的模型中,求解梯度更加不易: 有时候,推导出公式后,并将其运用到程序中,但当程序运行时,有时对梯度的计算可能会出现错误,怎么才能发现这种错误? 2)梯度下降法的调试思路 关于导数的理解,参考:高数:关于导数: 调试思路: 如果机器学习的算法涉及到求解梯度,先使调试方式求出梯度,提前得到此机器学习算法的正确结果: 用数学推导方式(根据算法模型推导出的求解梯度的公

python机器学习《入门》

写在前面的废话: 好吧,不得不说鱼C的markdown文本编辑器挺不错的,功能齐全.再次感谢小甲鱼哥哥的python视频让我去年大三下学期的时候入门了编程,爱上了编程这门语言,由于是偏冷门的统计学,在实习以后就决定把方向放在数据挖掘方面了,越来越发现专业课的重要性.在大家都忙着参加各种培训的日子里面,我就在去年寒冷的冬天把甲鱼哥的python视频一字不落的看完了:现在,在别人拼命参加校招的日子里,我就来学习“机器学习”这里面的算法了(ps:工科学校的理科妹子表示很难找到数据分析工作,人家只要研究

机器学习最佳入门学习资料汇总(转)

这篇文章的确很难写,因为我希望它真正地对初学者有帮助.面前放着一张空白的纸,我坐下来问自己一个难题:面对一个对机器学习领域完全陌生的初学者,我该推荐哪些最适合的库,教程,论文及书籍帮助他们入门? 资源的取舍很让人纠结,我不得不努力从一个机器学习的程序员和初学者的角度去思考哪些资源才是最适合他们的. 我为每种类型的资源选出了其中最佳的学习资料.如果你是一个真正的初学者,并且有兴趣开始机器学习领域的学习,我希望你能在其中找到有用的东西.我的建议是,选取其中一项资源,一本书,或者一个库,从头到尾的读一

机器学习最佳入门学习资料汇总

来自http://article.yeeyan.org/view/22139/410514 这篇文章的确很难写,因为我希望它真正地对初学者有帮助.面前放着一张空白的纸,我坐下来问自己一个难题:面对一个对机器学习领域完全陌生的初学者,我该推荐哪些最适合的库,教程,论文及书籍帮助他们入门? 资源的取舍很让人纠结,我不得不努力从一个机器学习的程序员和初学者的角度去思考哪些资源才是最适合他们的. 我为每种类型的资源选出了其中最佳的学习资料.如果你是一个真正的初学者,并且有兴趣开始机器学习领域的学习,我希