网站首页 > 技术教程 正文
线性回归—寻找练习时长与成绩之间的关系
你刻意练习了么?
在刻意练习这本书里,作者用大量的数据和例子来阐述这么一个观点:任何人利用正确的方法进行刻苦的练习,都可以在某个领域做到卓越。其中一个例子就是对小提琴学生做的调研。他把学生分为三组(即优秀,优异和最杰出三个小组),他发现他们之间最重要的差别是练习的时长,天生的天赋虽然刻意在刚开始能让人学习的更快,但是从长期来说,并没有起到决定性的作用。在18岁之前,优秀的学生平均训练时长是3420小时,优异的学生是5301小时,而最杰出的学生练习时长达到了7401小时。作者以此来证明任何人经过刻苦练习便可以达到杰出的水平。
线性回归
那么我们假设刻意练习里的结论是正确的,我们假设有一组练习时长与数学成绩的数据。 练习时长(h/w)|成绩
那我们该如何去寻找练习时长与成绩之间的关系呢?如果找到了这个关系,在知道一个学生的练习时长的情况下,便可以预测出他的成绩。我们来假定练习时长与成绩是一个线性的关系,那么一个假设的关系函数可以用如下式子表示:
如果样本的数量为m, 那么我们可以求得相对于这个关系的方差
取其平均值,则可以表示为
J(θ) 越小,说明我们的预测将会越准确。所以问题求解转换成了求使得J(θ)最小的θ值,即minJ(θ)
我们可以随便给定一个θ值,然后在逐步缩小范围,当θ值稳定在一个数值的时候,说明找到了一个值是可以另θ最小的。逐步缩小范围的步骤可以用如下操作:
通过这个方法得出了θ值后,便确定了刚开始定义的h(θ), 利用这个函数便可以预测出练习时长和成绩之间的关系。而这种方法便是机器学习中的线性回归。而求解θ的过程便是梯度下降算法。
求出θ后,便可以将θ代入h(θ)从而得到成绩和练习时长的关系。
线性回归Python实现
首先我们来实现$J(\theta)$, 笔者使用Numpy做数值计算的库,使用matplotlib做数据的可视化。
代价函数
根据上面提到的
我们来定义compute_cost函数,只需要按照公式转化为矩阵运算即可。
def compute_cost(X, y, theta): m = y.size prediction = X.dot(theta) - y sqr = np.power(prediction, 2) cost = (1 / (2 * m)) * np.sum(sqr) return cost 复制代码
我们可以将代价函数与theta的关系可视化出来:
def plot_J_history(X, y): theta0_vals = np.linspace(-10, 10, 100) theta1_vals = np.linspace(-1, 4, 100) J_vals = np.zeros((theta0_vals.size, theta1_vals.size)) for i in range(theta0_vals.size): for j in range(theta1_vals.size): theta = np.array([theta0_vals[i], theta1_vals[j]]) t = compute_cost(X, y, theta) J_vals[i, j] = t theta_x, theta_y = np.meshgrid(theta0_vals, theta1_vals) fig = plt.figure() ax = fig.gca(projection='3d') ax.plot_surface(theta_x, theta_y, J_vals) ax.set_xlabel(r'$\theta$0') ax.set_ylabel(r'$\theta$1') plt.show() plotData.plot_J_history(X, y) 复制代码
得出的图像大概是:
而这个图像最低的点,就是需要通过递归下降算法求出的点。
递归下降
上述的递归下降的微分表达式可以转化为数值表达式
用python则可以表示为:
def gradient_descent(X, y, theta, alpha, num_iters): m = y.size J_history = np.zeros((num_iters)) for i in range(0, num_iters): prediction = X.dot(theta) - y delta = prediction.dot(X) theta = theta - alpha * (1 / m) * delta J_history[i] = compute_cost(X, y, theta) return theta, J_history 复制代码
我们可以调用该函数求解$\theta$
theta = np.zeros((2,)) iterations = 1500 alpha = 0.01 theta, J_history = gradient_descent(X, y, theta, alpha, iterations) 复制代码
求出$\theta$后代入$h(\theta)$就可以得出成绩与练习时长的关系。
最后
其实,看起来很麻烦,但是利用sklearn分装好的算法,只需要几行就可以搞定线性回归
from sklearn.linear_model import LinearRegression ... 导入训练数据 regressor = LinearRegression() regressor = regressor.fit(X_train, Y_train) 复制代码
这样就好了,emmm...
参考文献:K码农-http://kmanong.top/kmn/qxw/form/home?top_cate=28
- 上一篇: 一文讲明白回调函数和递归函数
- 下一篇: Go 编译器内核:给 Go 新增一个语句——第一部分
猜你喜欢
- 2024-11-21 探索编程之美:揭秘LINQ、Lambda和表达式树的神奇能力
- 2024-11-21 如何在万行 JSON 中提取元素?答案是… ??
- 2024-11-21 业界首次!云天励飞提出用递归网络模型解决视频人脸关键点定位问题
- 2024-11-21 以Rspack为例,使用Xcode Instruments分析Rust应用性能
- 2024-11-21 编程语言设计与实现之路
- 2024-11-21 Java 工程师成神之路!
- 2024-11-21 前端Rust生态的背后napi-rs如何让Rust与JavaScript可以相互调用
- 2024-11-21 13.6k star,比JsonCpp快20倍,腾讯RapidJSON的用法及原理剖析
- 2024-11-21 Java教程:如何不使用递归实现文件夹的遍历?
- 2024-11-21 Python 新手的5大练手项目,你练了么?
你 发表评论:
欢迎- 最近发表
-
- 阿里P8大佬总结的Nacos入门笔记,从安装到进阶小白也能轻松学会
- Linux环境下,Jmeter压力测试的搭建及报错解决方法
- Java 在Word中合并单元格时删除重复值
- 解压缩软件哪个好用?4款大多数人常用的软件~
- Hadoop高可用集群搭建及API调用(hadoop3高可用)
- lombok注解@Data没有toString和getter、setter问题
- Apache Felix介绍(apache fineract)
- Spring Boot官方推荐的Docker镜像编译方式-分层jar包
- Gradle 使用手册(gradle详细教程)
- 字节二面:为什么SpringBoot的 jar可以直接运行?
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)