机器学习到底在研究什么本教程用尽量直白的方式把「机器学习是什么」从头到尾讲清楚不需要任何前置资料。读完你就能用大白话给别人解释为什么计算机能「凭经验」做判断。目录一、先搞懂我们凭什么能「预判」二、计算机能帮我们「利用经验」吗三、给机器学习一个正式说法四、机器学习到底研究什么从数据到模型五、一句话总结六、一个小演示让程序「凭经验」判断天气一、先搞懂我们凭什么能「预判」先别急着背定义我们来回忆一个生活场景傍晚小街的路面沁出微雨后的湿润和煦的细风吹来抬头看看天边的晚霞——你心里大概会想明天又是一个好天气。走到水果摊旁你挑了个根蒂蜷缩、敲起来声音浊响的青绿西瓜一边满心期待着皮薄肉厚瓤甜的爽落感——因为你判断它是个好瓜。回头看这两件事会发现一个共同点它们都靠「经验」做出了预判。为什么看到微湿路面、感到和风、看到晚霞就认为明天是好天因为你的生活经验里已经遇见过很多类似情况头一天观察到这些特征第二天天气通常不错。为什么色泽青绿、根蒂蜷缩、敲声浊响就能判断是正熟的好瓜因为你吃过、看过很多西瓜基于「色泽、根蒂、敲声」这几个特征就能做出相当好的判断。类似的我们从以往的学习经验知道下足了工夫、弄清了概念、做好了作业自然会取得好成绩。可以看出我们之所以能做出有效的预判是因为已经积累了许多经验而通过对这些经验的利用我们就能对没见过的新情况做出有效的决策。二、计算机能帮我们「利用经验」吗上面这些对经验的利用靠的是我们人类自己的脑子。那计算机能不能帮忙答案是能而且这正是机器学习要解决的问题。我们人类「凭经验预判」这件事换成计算机的语言其实就是把过去的经验一条条「情况 → 结果」的记录交给程序让程序从中「学」出一条规律以后遇到新情况程序就能自动给出判断。比如把成千上万个「西瓜特征→ 好不好吃」的记录喂给程序它就能学会判断新西瓜把成千上万条「路面状况、风向、云彩→ 明天天气」的记录喂给程序它就能学会预报天气。关键就在于经验在计算机里是用数据的形式存下来的。所以接下来的核心问题就变成了——怎么让程序自动从数据里「学」出规律三、给机器学习一个正式说法前面都是大白话现在给出一个更形式化的定义方便你以后跟别人「专业地」讨论。一个经典的定义是假设用P PP来评估一个计算机程序在某类任务T TT上的性能。如果该程序通过利用经验E EE在任务T TT上获得了性能的改善那么我们就说关于E EE和T TT该程序对E EE进行了学习。用公式化的记号写出来就是若 P ( T ) 通过利用 E 而改善则说程序对 E 进行了学习 \text{若 } P(T) \text{ 通过利用 } E \text{ 而改善则说程序对 } E \text{ 进行了学习}若P(T)通过利用E而改善则说程序对E进行了学习T TTTask程序要做的任务比如「判断西瓜好不好吃」E EEExperience经验也就是我们喂给它的数据一堆已有的「特征 → 结果」记录P PPPerformance用来衡量干得好不好的指标比如「判断的准确率」。直觉上很好懂经验越多、数据越全程序在该任务上的表现往往越好这就像「学习了」一样。四、机器学习到底研究什么从数据到模型把上面的思想再推进一步就得到了机器学习这门学科的核心定位机器学习是一门研究「如何通过计算的手段利用经验来改善系统自身性能」的学问。在计算机系统里「经验」通常以「数据」的形式存在。因此机器学习研究的主要内容是关于在计算机上从数据中产生「模型」model的算法这种算法叫做**「学习算法」learning algorithm**。这三者的关系用一张图就能说清经验(数据) │ ▼ 学习算法 ──────► 模型(model) ▲ │ │ ▼ 训练过程 新情况 → 判断/预测你把经验数据交给学习算法学习算法基于这些数据产生一个模型以后遇到新情况比如看到一个没剖开的西瓜这个模型就会给你一个相应的判断比如「好瓜」。这里有个特别妙的类比帮你记住机器学习的学科定位如果说计算机科学是研究「算法」的学问那么类似的可以说机器学习是研究「学习算法」的学问。也就是说普通算法是你写死步骤让计算机照做而「学习算法」的特别之处在于——它自己的步骤是从数据里「长」出来的。你只管给数据它负责长出能用的模型。最后补充一个术语习惯我们平时说的「模型」是一个很宽泛的词泛指从数据中学到的任何结果。有的结果像一个「全局性的大规律」比如一整棵决策树有的结果像一个「局部性的小规则」比如某一条具体规则。本教程后续会统一用「模型」来指代学出来的东西。五、一句话总结机器学习就是让计算机「吃」下大量经验数据、自动「长」出一个模型以后遇到新情况就能像人凭经验预判那样给出判断——它研究的不是写死的算法而是「从数据里学出算法」的本事。六、一个小演示让程序「凭经验」判断天气下面这段极简 Python 代码模拟了「凭经验预判」的核心思想把过去的「天气特征 → 是否好天」记下来遇到新的一天就数一数历史上特征完全相同的日子大多是什么结果以此做判断。这正是机器学习里「基于经验做预测」最朴素的雏形。# -*- coding: utf-8 -*- 极简演示让程序「凭经验」判断明天是不是好天。 思路统计历史中「特征完全相同」的日子以多数结果做判断。 # 历史经验每一天用 (路面微湿?, 有晚霞?, 和风?) 描述结果是 好天/坏天# 1 表示「是」0 表示「否」最后一项 1好天0坏天history[(1,1,1,1),# 微湿晚霞和风 - 好天(1,1,0,1),# 微湿晚霞无风 - 好天(1,0,1,1),# 微湿无晚霞和风 - 好天(0,0,0,0),# 干无晚霞无风 - 坏天(0,1,0,0),# 干晚霞无风 - 坏天]defpredict(history,today):根据历史经验预测 today 是否好天统计特征完全匹配的日子good,bad0,0forrecinhistory:feat,labelrec[:3],rec[3]# 只统计「特征完全匹配」的历史日子iffeattoday:iflabel1:good1else:bad1ifgood0andbad0:return经验不足无法判断return好天ifgoodbadelse坏天if__name____main__:# 新的一天路面微湿、有晚霞、有和风new_day(1,1,1)print(新的一天特征(微湿,晚霞,和风):,new_day)print(程序判断明天是:,predict(history,new_day))# 再来一天路面干、无晚霞、无风another(0,0,0)print(另一天特征(干,无晚霞,无风):,another)print(程序判断明天是:,predict(history,another))把这段代码保存为intro_demo.py用python intro_demo.py运行输出大致是新的一天特征(微湿,晚霞,和风): (1, 1, 1) 程序判断明天是: 好天 另一天特征(干,无晚霞,无风): (0, 0, 0) 程序判断明天是: 坏天这说明程序并没有被写死「微湿晚霞好天」的规则而是从你给的历史数据里自己「学」出了判断。当然这个雏形还很简单只做精确匹配真正的机器学习算法要聪明得多——但「利用数据产生判断」这条主线从最简单的雏形到最复杂的深度学习始终没变。