人为智能通识

欢迎关注我的专栏つ

①假设函数(hypothesis function)

接着前一篇文章房屋建议租金机器学习算法思路继续分析,这次我们着重思考怎么评估我们的算法。

在给定一些样本数据(training set)后,采用某种学习算法(learning algorithm)对样本数据进行训练,得到了一个模型或者说是假设函数。

上一篇我们用随机暴力试探得到图片 1图片 2的值,大约是34,但是这个暴力随机的方法好不好?评估一个算法可以从几个方面考虑:

当需要预测新数据的结果时,将新数据作为假设函数的输入,假设函数计算后得到结果,这个结果就作为预测值。

  1. 算法的结果准不准,不管白猫黑猫,抓到老鼠就好猫。
  2. 算法的训练train的速度快不快,性能好不好,一年只抓到一只老鼠的也不是好猫。
  3. 算法是不是可以被理解,如果自家的猫只要一念咒语就会出现一只死老鼠,这样的猫也太恐怖了。

 

图片 3

假设函数的表示形式一般如下:θ 称为模型的参数(或者是:权重weights),x就是输入变量(input variables or feature variables)

第2点性能评估容易,只要在train函数加入时间输出就可以了,如果进一步考虑的话可以跟踪输出cost值的下降曲线,看它是否能比较快的到达最终结果,毕竟最后那些+0.1又-0.1来回震荡的时间没啥意义。

图片 4

第3点可理解性也不难,毕竟算法是我们自己写的,绝大多数时候我们自己还是可以解释清楚猫是怎么抓老鼠的,比如我们这个暴力靠近的方法中间没有任何魔法。

 

第1点稍微麻烦些,怎么知道34这个结果是不是足够好?很简单,用用就知道,我们用这个34来预测些未知的房屋面积,看看是不是靠谱,有多靠谱就好了。

可以看出,假设函数h(x)是关于x的函数,只要确定了 θ ,就求得了假设函数 (θ 也可视为一个向量)。那么对于新的输入样本x,就可以预测该样本的结果y了。

我们准备用plotly把100次循环中cost下降的情况绘制出来,下面的代码执行绘图:

上面假设函数是从0到n求和,也就是说:对于每个输入样本x,将它看成一个向量,每个x中有n+1个 features。比如预测房价,那输入的样本 x(房子的大小,房子所在的城市,卫生间个数,阳台个数.....一系列的特征)

import plotly.offline as pyimport plotly.graph_objs as gopy.init_notebook_mode()costData=go.Scatter( x=[n for n in range], y=[0 for n in rangecostLayout = go.Layout( title='Cost下降曲线', autosize=False, width=500, height=500, xaxis=dict( autorange=False, range=, dtick=10, showline=True, mirror='ticks', title='Loops', rangemode='tozero' ), yaxis=dict( autorange=True, showline=True, mirror='ticks', title='Costs', rangemode='tozero' ),)costFig = go.FigureWidget([costData],costLayout)costFigtrain()

 

如果执行这个代码会出现一个图:

关于分类问题和回归问题:假设函数的输出结果y(predicted y)有两种表示形式:离散的值和连续的值。比如本文中讲到的预测利润,这个结果就是属于连续的值;再比如说根据历史的天气情况预测明天的天气(下雨 or 不下雨),那预测的结果就是离散的值(discrete values)

图片 5

因此,若hypothesis function输出是连续的值,则称这类学习问题为回归问题(regression problem),若输出是离散的值,则称为分类问题(classification problem)

这是因为我们没有在train函数中更新绘图数据。修改上面的train函数:

 

import timedef train(): start = time.time() lastA = 1 lastCost = 0 learnRate = 1 for i in range: newA = lastA + learnRate newCost = getCost if newCost > lastCost: learnRate = learnRate *  lastCost = newCost lastA = newA #更新costFig dataY = list(costFig.data[0]['y']) dataY[i] = newCost costFig.data[0]['y'] = dataY end = time.time() print('>耗时:{}毫秒 '.format(end - start)) return newA

②代价函数(cost function)

运行得到:

学习过程就是确定假设函数的过程,或者说是:求出 θ 的过程。

图片 6

现在先假设 θ 已经求出来了,就需要判断求得的这个假设函数到底好不好?它与实际值的偏差是多少?因此,就用代价函数来评估。

可以从图中看到33次左右之后cost价值就不再降低,也就是已经达到最优值34左右了,整个耗时4.34秒,但其中大部分时间纯粹是在做无意义的震荡。

图片 7

没有对比就没有伤害,初来乍到的我们目前还不好说这个算法的性能是否够好,但是,可以把这个作为一个参考,在此基础上进行优化。

 

我们的模型图片 8是否好用?我们需要用事实来检测,我们的模型只使用了100个样本进行训练,我们可以拿另外100个样本让它来评估一下,给出推荐租金,然后我们再对比这个推荐租金和真实租金之间的差距,可以把它作为模型的精准度。

向量化后的代价函数:

评估函数及执行评估图片 9代码:

图片 10

def evaluate: cost_li=[] for n in range: item=df.loc[n] area=float(item['area']) predict=a*area offset=float(item['money'])-predict cost_li.append return cost_lievalLi=evaluate

 

对评估结果绘图。

 

import randomimport plotly.offline as pyimport plotly.graph_objs as gopy.init_notebook_mode()evalData=go.Scatter( x=[n for n in range], y=[evalLi[i] for i in range(len],)evalLayout = go.Layout( title='预测评估', autosize=False, width=500, height=500, xaxis=dict( autorange=False, range=, dtick=10, showline=True, mirror='ticks', title='Loops', rangemode='tozero' ), yaxis=dict( autorange=False, range=(-10000, 10000), showline=True, mirror='ticks', title='Offsets', ),)evalFig = go.FigureWidget([evalData],evalLayout)evalFigprint('平均偏差:{}'.format(sum/len

一般地,用 m 来表示训练样本的数目(size of training set),x(i) 表示第 i 个样本,y(i) 表示第i个样本的预测结果。

对于100~200之间的样本预测,得到很大的偏差-512,差距很大。而且分布非常不均匀,很多偏差都超过正负1000,就是说预测租金和实际租金相差超过1000元,这个还是很糟糕的。

从上图可看出:代价函数与“最小均方差”的理念非常相似。J(θ)是 θ 函数。

图片 11

显然,“代价函数越小,模型就越好”。因此,目标就是:找到一组合适的 θ ,使得代价函数取最小值。

如果我们改为预测0~100个样本(就是train也使用的这个样本范围),那么平均偏差只有-300左右,还是可以的。

如果我们找到了 θ ,那不就求得了 假设函数了?也就求得一个模型--linear regression model.

你可以尝试调整更多参数,不同的样本范围、不同的a值进行测试。更多的进一步修正我们后续慢慢改进。

那如何找 θ 呢?就是下面提到的梯度下降算法(gradient descent algorithm)

恭祝各位除夕快乐!预祝大家新的一年,万事如意,训练速度越来越快,模型精度越来越高ヽノ!!

 

欢迎关注我的专栏つ

 

每个人的智能新时代

如果您发现文章错误,请不吝留言指正;如果您觉得有用,请点喜欢;如果您觉得很有用,欢迎转载~

END

③梯度下降算法(Gradient descent algorithm)

 

梯度下降算法的本质就是求偏导数,令偏导数等于0,解出 θ

 

图片 12

 

 

首先从一个初始 θ 开始,然后 for 循环执行上面公式,当偏导数等于0时,θj 就不会再更新了,此时就得到一个最终θj 值。

 

整个偏导数的运算过程如下:

 

图片 13

 

 

④假设函数、代价函数和梯度下降算法的向量表示

 

假设函数的向量表示如下:

图片 14

 

 

代价函数的表示如下:

图片 15

 

 

使用梯度下降算法求解 θ 的向量化表示如下:

图片 16

(原文上图的式子有一处错误,第一个等号后的式子不应除以m,这里加以更正了)

 

证明过程如下:

 

图片 17

 

图片 18

 

 

 

 

补充:

θ的闭式解(close-form solution)

图片 19

θ的闭式解也就是它的解析解,就是使得代价函数J(θ)取得最小值的解;

使用闭式解的优点是一步得到精确解,避免了“loop until converge”;

缺点是当特征数量较多时,X的维度较大,而求解的复杂度为O(n^3),时间代价较高。(特征数量一般以10^4为分界点,高于这个值一般考虑用梯度下降)

 

引用原文:

本文由365bet体育在线官网发布于网络工程,转载请注明出处:人为智能通识

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。