算法介绍 这里简要介绍下各算法和他们之间的关系,详细理解请百度一下 基本算法 最小二乘法是众多机器学习算法中极为重要的一种基础算法 单纯的最小二乘法对于包含噪声的学习过程经常有过拟合的弱点,这往往是由于学习模型对于训练样本而言过于复杂 l2 约束 由此,引入带有约束条件的最小二乘法 —- Ridge 回归 带有约束条件的最小二乘法和交叉验证法的组合,在实际应用中是非常有效的回归方法 然而,当参数特别多的时候,求解各参数以及学习得到的函数的输出值的过程,都需要耗费大量的时间 l1 约束 由此,引入可以吧大部分参数都置为0的稀疏学习算法 因为大部分参数都变成了0,所以就可以快速地求解各参数以及学习得到的函数的输出值 l1 + l2 约束 虽然 l1 约束的最小二乘学习法是非常有用的学习方法,但是在实际应用中,经常会遇到些许限制 在 Lasso 回归求解路径中,对于 N×P 的设计矩阵来说,最多只能选出 min(N,p) 个变量 当 p>N 的时候,最多只能选出N个预测变量.因此,对于 p∼N 的情况,Lasso方法不能够很好的选出真实的模型. 如果预测变量具有群组效应,则用Lasso回 归时,只能选出其中的一个预测变量 对于通常的 N>P 的情形,如果预测变量中 存在很强的共线性,Lasso的预测表现受控于岭回归 基于以上几点Lasso回归的局限性,Zou和 Hastie在2005年提出了弹性网回归方法,回归系 数表达式为 \(\hat \beta^{ridge} =\mathop{\arg\min}_{\beta} \{\sum \limits _{i=1}^{N}(y_i-\beta_0-\sum\limits_{j=1}^px_{ij}\beta_j)^2+\lambda\sum \limits_{j=1}^{p}|\beta_{j}|+\lambda\sum \limits_{j=1}^{p}\beta_{j}^2\}\) MLJLinearModels 使用 Ridge \(J = \frac{1}{n}\sum_{i = 1}^n (f( x_i) - y_i)^2 + \lambda \|w\|_2^2\tag{1}\) RidgeRegressor RidgeRegression() RidgeRegression(λ; lambda, fit_intercept, penalize_intercept, scale_penalty_with_samples) Lasso \(J = \frac{1}{n}\sum_{i = 1}^n (f( x_i) - y_i)^2 + \lambda \|w\|_1\tag{2}\) LassoRegressor LassoRegression() LassoRegression(λ; lambda, fit_intercept, penalize_intercept, scale_penalty_with_samples) Elastic-Net \(\smash{\min_{w}}\sum_{i=1}^m(y_i-\sum_{j=1}^dx_{ij}w_j)^2 + \lambda\sum_{j=1}^d|w_j|+\lambda \sum_{j=1}^dw_j^2 \tag{3}\) ElasticNetRegression ElasticNetRegression() ElasticNetRegression(λ) ElasticNetRegression(λ, γ; lambda, gamma, fit_intercept, penalize_intercept, scale_penalty_with_samples) 说明 其实可以不用管 fit_intercept penalize_intercept 我也不知道这两个是干什么的,就先别管他们了 总之,只用设置 lambda 就行了 实例 波士顿房价预测 数据准备 竞赛数据来自 https://www.
介绍 JuliaMath 下有一个微积分包,闲得没事看看文档,给大家简要整理了一下 derivative 求导 second_derivative 求二阶导 然而关于积分,文档里说 The Calculus package no longer provides routines for univariate numerical integration. Use QuadGK.jl instead. 他说单变量的积分在这个包中不再支持,可以去使用 QuadGK.jl 包中 我又尝试了下 Calculus 包中的 integrate 函数 f((x, y)) = sin(x) + cos(y) 我发现,这个错误中的 quadgk 和 QuadGk 中的 quadgk 不是同一个函数,他指的是 Calculus.quadgk 这个函数不存在 另外我去谷歌了一下,发现 Quadgk 不支持多重积分,所以我推荐使用同在 JuliaMath 仓库下的 Cubature.jl 包 既可以做单变量积分,又可以做多变量积分 使用 导数 using Calculus derivative derivative(sin, 0) == cos(0) derivative(sin, 1) == cos(1) derivative(sin, float(pi)) = cos(float(pi)) 多元导数 using Calculus derivative julia> derivative(f, [1, 1]) 2-element Vector{Float64}: 0.
简单的爬虫流程 一般的,程序向网站请求网页 程序 =========> 网站 而后,网站返回网页与程序 程序 <========= 网站 接着程序负责解析得到的 HTML 数据即可 Scrapy 如何扩展这一流程 程序请求网页时, scrapy 添加了中间件在双方之间 程序 =====> 中间件 ======> 网站 网站返回数据时,也需要通过中间件 程序 <===== 中间件 <====== 网站 程序解析完数据后,不会马上处理数据,而是把一个网页的数据打包成一个 Item 数据,传递给 pipeline 处理 pipeline <==== item <==== 程序 Scrapy 简单示例 这里以爬取美图录的图片为例(注意,我不打算用默认的 start_urls 数据) 首先我们到一个模特的主页上,比如 接下来我们要从这个 指定模特页面 上的每一个专辑上爬取图片 准备项目 安装 scrapy sudo pip3 install scrapy 创建新项目 scrapy startproject meitulu 基础设定 在 meitulu/spiders/ 下我们新建一个爬虫文件 evelyn.py class Spider(scrapy.Spider): name = 'evelyn' 其中的 name 属性是为了调用的时候能找到爬虫位置,比如调用这个爬虫的时候,我们指定 name scrapy crawl evelyn 添加命令行参数 def __init__(self, albumUrl=None, *args, **kwargs): if albumUrl == None: raise Exception('usage: -a albumUrl=.
Symbolics.jl 简单使用 由于文档太难看懂,我这里简单地介绍下这个包的用法 变量符号 生成变量符号,只需要 @variables x y 这样,我们就有两个符号为 x , y 的变量 变量表达式 用表达式生成符号变量 如同写一个算数表达式 1+1 一样,Julia 为符号变量类型重载了运算符,这里创建一个变量 p, 用其来代表 p = -16x^2 + 100 注意, p 也是一个符号变量 用函数生成符号变量 或者我们还可以这样声明 p f(x) = -16x^2 + 100 p = f(x) 替换表达式 写好了表达式还不够,有时候我们将其中一个函数看作另一个函数的参数,比如 f(g(x)) substitude(p, x => x^2) 得到结果为 -16x^4 + 100 如果是多元函数,替换的部分用字典来替代 简化/展开表达式 简化表达式,使用 simplify 函数,但是这个包里没有提供单独的 展开 函数,还好 simplify 有一个 expand 参数,为 true 时展开表达式,来看一个例子 @variables a b c x quad = a*x^2 + b*x + c quad + quad^2 - quad^3 simpify(quad, expand=true) # julia> simplify(ans,expand=true) # c + b*x + c^2 + (a + b^2)*(x^2) + (a^2)*(x^4) + 2a*c*(x^2) + 2b*c*x + 2a*b*(x^3) - (c^3) - (a^3)*(x^6) - (b^3)*(x^3) - 3a*(c^2)*(x^2) - 3a*(b^2)*(x^4) - 3b*x*(c^2) - 3c*(b^2)*(x^2) - 3c*(a^2)*(x^4) - 3b*(a^2)*(x^5) - 6a*b*c*(x^3) 求导表达式 与求导相关的函数是 Differential ,中文意思 微分 @variables t D = Differential(t) 声明一个变量符号 t, 再声明一个变量 D 代表有关 t 的微分 接着,声明有关 t 的表达式,调用 D(z) 得到导数表达式 z = t + t^2 D(z) 然而求导部分是惰性的,怕消耗太多时间,需要调用 expand_derivatives 来获取表达式 expand_derivatives(D(z)) # 1 + 2t 生成 Julia 函数 表达式可以看作函数的简化版本,比如 p = -16x^2 + 100 我们直接调用 p(1) 是会报错的,我们需要根据他来生成一个函数调用 f_expr = build_function(p, x) f_func = eval(f_expr) f_func(1) # 84 build_function 需要一个表达式,和其参数变量表 如果是 f(x, y) ,应该输入 build_function(f, x, y) 如果是 f([x, y]) , 应该输入 build_function(f, [x, y]) build_function 返回的是 Julia 函数的 Expr 类型, eval 他即可获得函数 疑问 怎么没有积分啊 这个包里确实没有写积分的函数,不过我已经提了个 Issue 给作者 https://github.
程序设计说明 本来想用 lisp 程序来写,他的写法是 (function arg1 arg2 ...) S表达式不需要考虑优先级顺序,写起来比较简单 但是在这里有太多运算符,写成 lisp 很不方便 p∧¬(q→p (p ↔ q) → r p → (p ∨ ¬q ∨ r) 还好有 Julia ,他可以自定义运算符 首先将运算符作为一个函数定义(以下例子这样写是因为 + 在程序中是特殊符号,需要加一个 : 前缀来标识, Julia 语言的一个 feature) function Base.:+(arg1::SomeType, arg2::SomeType) return arg1 * arg2 end 解释器就可以把以下语句 arg1 + arg2 解析为 Base:+(arg1, arg2) 如果是调用多次 arg1 + arg2 + arg3 可以看作先对前两个进行求值,得出结果,与第三个参数求值 实现细节 演示说明 这里给出一个演示的例子 print(TruthTable("(p ↔ q) → r", [:p, :q, :r], (p, q, r) -> (p ↔ q) → r)) 需要自定义真值表的 标题 参数表 生成真值的逻辑函数 运算符定义 ¬(p::Bool) = !
项目介绍 这次的大作业用的 Flutter 框架,虽然构建 UI 界面很容易,难的是各个组件之间的通信,以及对 async/await 的异步操作 这个应用由于时间原因选择了 Flutter 来开发,只实现了登录界面,笔记界面,通知界面 由于还没有对应用进行优化,解耦,数据库的操作只有应用开启时的读取数据,删除,添加,修改操作都没有实现 功能结构 登录界面 这里只提供了登录界面,没有提供登录的相关操作,不过表单还是有的 笔记界面 笔记界面的每一项由一个 NoteCard 组件构成,只提供了编辑功能,路由切换后会重置 需要编辑时点击右边的三点按钮,扩展的编辑面板显示 编辑完成后,点击 Save 保存之后 消息界面 消息界面完全仿照 原来的应用,没有什么稀奇的 设计类 这里介绍下这个项目的结构,重点不是代码,从入口讲起 入口类 void main() => runApp(App()); class App extends StatelessWidget { final title = 'HomeApp'; @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( title: title, home: Home(), ); } } 主页的设计 主页中由三个页面,需要引入一个 TabView 组件来进行路由切换 其中主页为 class Home extends StatefulWidget { @override HomeState createState() => HomeState(); } 主页的构建由另一个类 HomeState 来实现,在其中使用 TabView class HomeState extends State<Home> with SingleTickerProviderStateMixin{ late final TabController controller = TabController(length: 3, vsync: this); @override void dispose() { // TODO: implement dispose controller.