A. 使用Python的线性回归问题,怎么解决
本文中,我们将进行大量的编程——但在这之前,我们先介绍一下我们今天要解决的实例问题。
1) 预测房子价格
闪电侠是一部由剧作家/制片人Greg Berlanti、Andrew Kreisberg和Geoff Johns创作,由CW电视台播放的美国电视连续剧。它基于DC漫画角色闪电侠(Barry Allen),一个具有超人速度移动能力的装扮奇特的打击犯罪的超级英雄,这个角色是由Robert Kanigher、John Broome和Carmine Infantino创作。它是绿箭侠的衍生作品,存在于同一世界。该剧集的试播篇由Berlanti、Kreisberg和Johns写作,David Nutter执导。该剧集于2014年10月7日在北美首映,成为CW电视台收视率最高的电视节目。
绿箭侠是一部由剧作家/制片人 Greg Berlanti、Marc Guggenheim和Andrew Kreisberg创作的电视连续剧。它基于DC漫画角色绿箭侠,一个由Mort Weisinger和George Papp创作的装扮奇特的犯罪打击战士。它于2012年10月10日在北美首映,与2012年末开始全球播出。主要拍摄于Vancouver、British Columbia、Canada,该系列讲述了亿万花花公子Oliver Queen,由Stephen Amell扮演,被困在敌人的岛屿上五年之后,回到家乡打击犯罪和腐败,成为一名武器是弓箭的神秘义务警员。不像漫画书中,Queen最初没有使用化名”绿箭侠“。
由于这两个节目并列为我最喜爱的电视节目头衔,我一直想知道哪个节目更受其他人欢迎——谁会最终赢得这场收视率之战。 所以让我们写一个程序来预测哪个电视节目会有更多观众。 我们需要一个数据集,给出每一集的观众。幸运地,我从维基网络上得到了这个数据,并整理成一个.csv文件。它如下所示。
闪电侠
闪电侠美国观众数
绿箭侠
绿箭侠美国观众数
1 4.83 1 2.84
2 4.27 2 2.32
3 3.59 3 2.55
4 3.53 4 2.49
5 3.46 5 2.73
6 3.73 6 2.6
7 3.47 7 2.64
8 4.34 8 3.92
9 4.66 9 3.06
观众数以百万为单位。
解决问题的步骤:
首先我们需要把数据转换为X_parameters和Y_parameters,不过这里我们有两个X_parameters和Y_parameters。因此,把他们命名为flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter吧。然后我们需要把数据拟合为两个不同的线性回归模型——先是闪电侠,然后是绿箭侠。 接着我们需要预测两个电视节目下一集的观众数量。 然后我们可以比较结果,推测哪个节目会有更多观众。
步骤1
导入我们的程序包:
Python
1
2
3
4
5
6
7
# Required Packages
import csv
import sys
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
步骤2
写一个函数,把我们的数据集作为输入,返回flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter values。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
# Function to get data
def get_data(file_name):
data = pd.read_csv(file_name)
flash_x_parameter = []
flash_y_parameter = []
arrow_x_parameter = []
arrow_y_parameter = []
for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']):
flash_x_parameter.append([float(x1)])
flash_y_parameter.append(float(y1))
arrow_x_parameter.append([float(x2)])
arrow_y_parameter.append(float(y2))
return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter
现在我们有了我们的参数,来写一个函数,用上面这些参数作为输入,给出一个输出,预测哪个节目会有更多观众。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Function to know which Tv show will have more viewers
def more_viewers(x1,y1,x2,y2):
regr1 = linear_model.LinearRegression()
regr1.fit(x1, y1)
predicted_value1 = regr1.predict(9)
print predicted_value1
regr2 = linear_model.LinearRegression()
regr2.fit(x2, y2)
predicted_value2 = regr2.predict(9)
#print predicted_value1
#print predicted_value2
if predicted_value1 > predicted_value2:
print "The Flash Tv Show will have more viewers for next week"
else:
print "Arrow Tv Show will have more viewers for next week"
把所有东西写在一个文件中。打开你的编辑器,把它命名为prediction.py,复制下面的代码到prediction.py中。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Required Packages
import csv
import sys
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
# Function to get data
def get_data(file_name):
data = pd.read_csv(file_name)
flash_x_parameter = []
flash_y_parameter = []
arrow_x_parameter = []
arrow_y_parameter = []
for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']):
flash_x_parameter.append([float(x1)])
flash_y_parameter.append(float(y1))
arrow_x_parameter.append([float(x2)])
arrow_y_parameter.append(float(y2))
return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter
# Function to know which Tv show will have more viewers
def more_viewers(x1,y1,x2,y2):
regr1 = linear_model.LinearRegression()
regr1.fit(x1, y1)
predicted_value1 = regr1.predict(9)
print predicted_value1
regr2 = linear_model.LinearRegression()
regr2.fit(x2, y2)
predicted_value2 = regr2.predict(9)
#print predicted_value1
#print predicted_value2
if predicted_value1 > predicted_value2:
print "The Flash Tv Show will have more viewers for next week"
else:
print "Arrow Tv Show will have more viewers for next week"
x1,y1,x2,y2 = get_data('input_data.csv')
#print x1,y1,x2,y2
more_viewers(x1,y1,x2,y2)
可能你能猜出哪个节目会有更多观众——但运行一下这个程序看看你猜的对不对。
3) 替换数据集中的缺失值
有时候,我们会遇到需要分析包含有缺失值的数据的情况。有些人会把这些缺失值舍去,接着分析;有些人会用最大值、最小值或平均值替换他们。平均值是三者中最好的,但可以用线性回归来有效地替换那些缺失值。
这种方法差不多像这样进行。
首先我们找到我们要替换那一列里的缺失值,并找出缺失值依赖于其他列的哪些数据。把缺失值那一列作为Y_parameters,把缺失值更依赖的那些列作为X_parameters,并把这些数据拟合为线性回归模型。现在就可以用缺失值更依赖的那些列预测缺失的那一列。
一旦这个过程完成了,我们就得到了没有任何缺失值的数据,供我们自由地分析数据。
为了练习,我会把这个问题留给你,所以请从网上获取一些缺失值数据,解决这个问题。一旦你完成了请留下你的评论。我很想看看你的结果。
个人小笔记:
我想分享我个人的数据挖掘经历。记得在我的数据挖掘引论课程上,教师开始很慢,解释了一些数据挖掘可以应用的领域以及一些基本概念。然后突然地,难度迅速上升。这令我的一些同学感到非常沮丧,被这个课程吓到,终于扼杀了他们对数据挖掘的兴趣。所以我想避免在我的博客文章中这样做。我想让事情更轻松随意。因此我尝试用有趣的例子,来使读者更舒服地学习,而不是感到无聊或被吓到。
谢谢读到这里——请在评论框里留下你的问题或建议,我很乐意回复你。
B. 下列直线回归方程中,错误的有()
这项是多选题,考卷刚做过,答案B C D
C. 回归直线法解析
读财管时很难记的一个公式是:关于企业资金需要量预测中的资金习性预测法下的回归直线法.
以前也是死记硬背,但是一会功夫就一股脑地忘到九宵云外去了.
可是,前几天,有了一个简单的公式:
该联立方程组,可以用以下方法很简便地推出:
基本公式:y=a+bx
将各期数据代入,可得:
以前这样已经很不错了.
可是.哈哈,晚上听课,
又有了一个更世俗,更简单的记法.
好像变复杂了,可是这个记忆的方法真的很管用.它的产生还是缘于一个老师的灵感:
看到路上有个结婚的车队想到了这个变形公式:
B的推导:
西格玛像一座房子,X和Y看成是两个人一女一男,两个人结婚了住在同一幢房子里,有很多人来祝贺,用网络语言说是N个人,这样就有分子的前半部分了.随着时间的流逝,就是减号,两个人感情不和了,分居了,住在不同的房子里了,当然分开来不是什么好事,然后就没有祝贺的人了,N不见了,这样分子的后半部分出来了.
接下来就是分母了,把分子的Y全变成X,好了.B的公式出来了.
A的公式就是根据推出.
这位老师笑着说,相信用这个方法可以将回归直线法的公式记上两年.
嗯.我看成!
D. 应用直线相关与回归时应注意哪些问题
1、作回归分析要有实际意义,不能把毫无关联的两种现象,随意进行回归分析,忽视事物现象间的内在联系和规律;如对儿童身高与小树的生长数据进行回归分析既无道理也无用途。另外,即使两个变量间存在回归关系时,也不一定是因果关系,必须结合专业知识作出合理解释和结论。
2、直线回归分析的资料,一般要求应变量Y是来自正态总体的随机变量,自变量X可以是正态随机变量,也可以是精确测量和严密控制的值。若稍偏离要求时,一般对回归方程中参数的估计影响不大,但可能影响到标准差的估计,也会影响假设检验时P值的真实性。
3、进行回归分析时,应先绘制散点图(scatter plot)。若提示有直线趋势存在时,可作直线回归分析;若提示无明显线性趋势,则应根据散点分布类型,选择合适的曲线模型(curvilinear modal),经数据变换后,化为线性回归来解决。一般说,不满足线性条件的情形下去计算回归方程会毫无意义,最好采用非线性回归方程的方法进行分析。
4、绘制散点图后,若出现一些特大特小的离群值(异常点),则应及时复核检查,对由于测定、记录或计算机录入的错误数据,应予以修正和剔除。否则,异常点的存在会对回归方程中的系数a、b的估计产生较大影响。
5、回归直线不要外延。直线回归的适用范围一般以自变量取值范围为限,在此范围内求出的估计值称为内插(interpolation);超过自变量取值范围所计算的称为外延(extrapolation)。若无充足理由证明,超出自变量取值范围后直线回归关系仍成立时,应该避免随意外延。
E. 这两个数控编程程序哪里出错了呀,显示起点半径和终点半径之差超过规定值
一、数控中起点半径和终点半径之差超过规定值的意思是:有某个数值给大了,超过了机床的承受极限。也就是终点坐标与前一句的终点坐标之间距离相距过大,以至于圆弧不能连接起两个点来。
如果允许的话,要不改一下两点之间的坐标,让两点之间的距离“近”一些; 要不就加大“R”值,让圆弧的半径值大一点。
二、起点半径和终点半径之差超过规定值的原因:
1、小数点问题,圆弧指令G02/G03,半径R未加小数点;
2、G02或G03格式有误,G02/G03指令中终点坐标值不正确;
3、圆弧指本身没问题,但其前后程序段有问题,G02/G03圆弧指令后一句指令,若是走直线段,未加指令G00/G01;
4、漏写了程序段。
三、解决案例
1、小数点问题
如:G03 X30. Z-10. R5
G02X55.Z-23R10
2、G02或G03格式有误:
如缺少R:G02 X20.Z-12;
3、圆弧指本身没问题,但其前后程序段有问题如下图
向左转|向右转
F. 有关线性回归方程的问题。
我们把y尖成为y_hat。同理可推a,b
现在我们有一堆观测点(xi,yi),想用一个线性方程y=bx+a来代表这堆观测点,但是b,a都是算不出来的(为什么,因为观测点根本就不在一条线上,数学告诉我们2点确定一条直线)。所以我们用b_hat,a_hat来重新构造一条新的直线,使该直线在某种意义下离所有点最近。这条线就是回归方程 y_hat=b_hat x+ a_hat
原来的观测点(xi,yi)都在这条线的周围(可能会有几个准确的在线上,但都是巧合)。这些个y_hat是在回归方程上的点。
所以(均值x,均值y)必在回归方程上是错误的。(均值x,均值y_hat)才是
G. 【数必修3】 回归直线必经过散点图的多个点 这句话对么
错,就一条,到各个点距离和最小的直线为回归直线。
H. 思考:回归直线方程一定过点(x巴,y巴)吗
对变量之间统计关系进行定量描述的一种数学表达式。 指具有相关的随机变量和固定变量之间关系的方程。 回归直线方程 若:在一组具有相关关系的变量的数据(x与Y)间,通过散点图我们可观察出所有数据点都分布在一条直线附近,这样的直线可以画出许多条,而我们希望其中的一条最好地反映x与Y之间的关系,即我们要找出一条直线,使这条直线“最贴近”已知的数据点,记此直线方程为(如右所示,记为①式) 这里在y的上方加记号“^”,是为了区分Y的实际值y,表示当x取值xi=1,2,……,6)时,Y相应的观察值为yi,而直线上对应于xi的纵坐标是 ①式叫做Y对x的 回归直线方程,相应的直线叫做回归直线,b叫做回归系数。要确定回归直线方程①,只要确定a与回归系数b。 回归直线的求法 最小二乘法: 总离差不能用n个离差之和 来表示,通常是用离差的平方和,即 作为总离差,并使之达到最小,这样回归直线就是所有直线中Q去最小值的那一条,这种使“离差平方和最小”的方法,叫做最小二乘法