机器学习系统设计-读书笔记3
继续第二篇笔记中的例子。
3.不断的迭代与探索的过程
从上篇的图看到,直线并不能很好的代表week4以后的趋势。既然一阶函数不行,我们试试二阶函数?
f(x)= ax**2 + bx + c
继续使用polyfit这个函数来确定a,b,c的值:
f2p =sp.polyfit(x,y,2) print f2p
上述代码得到了一个数组
[ 1.05322215e-02 -5.26545650e+00 1.97476082e+03],这就是a,b,c分别的值。
f2 = sp.poly1d(f2p) print(error(f2,x,y))
继续计算一下残差平方和是:179983507.878 ,显然要比1次的好。如果阶数越高,效果就越好,我们为什么不进一步增加阶数?
try一下阶数为3,10,100的情况
f3 = sp.poly1d(sp.polyfit(x, y, 3)) f10 = sp.poly1d(sp.polyfit(x, y, 10)) f100 = sp.poly1d(sp.polyfit(x, y, 100)) print 'd3=' ,(error(f3,x,y)) print 'd10=' ,(error(f10,x,y)) print 'd100=' , (error(f100,x,y))
残差平方和结果为:
d3= 139350144.032
d10= 121942326.364
d100= 109452403.459
结果是越来越好了,但是100项式的模型是否真的代表了用户真实行为呢?我们继续把图画出来。
紫色的曲线代表了100阶多项式。看出它的问题了么?抖动的太厉害了!响应了所有数据的要求,但是,里边其实有不少数据算是噪声数据,比如偏离太远的点,没有代表性。这样的拟合被叫做 过度拟合(overfitting),10阶也同样类似的问题(如果数据更多,效果会更加明显)。所以,一味的提高模型的复杂度并不是一个好办法。
问题在哪里?从建模角度似乎遇上了一些瓶颈。我们返回来看数据,我们真的的理解数据了么?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义