matlab回归分析sst_机器学习—回归分析
⼀、概念
回归分析(regression analysis)是确定两种或两种以上变量间相互依赖的定量关系的⼀种统计分析⽅法。运⽤⼗分⼴泛,回归分析按照涉及的⾃变量的多少,分为回归和多重回归分析;按照⾃变量的多少,可分为⼀元回归分析和多元回归分析;按照⾃变量和因变量之间的关系类型,可分为线性回归分析和⾮线性回归分析。如果在回归分析中,只包括⼀个⾃变量和⼀个因变量,且⼆者的关系可⽤⼀条直线近似表⽰,这种回归分析称为⼀元线性回归分析。如果回归分析中包括两个或两个以上的⾃变量,且因变量和⾃变量之间是线性关系,则称为多重线性回归分析。    回归分析是对具有因果关系的影响因素(⾃变量)和预测对象(因变量)所进⾏的数理统计分析处理。只有当变量与因变量确实存在某种关系时,建⽴的回归⽅程才有意义。因此,作为⾃变量的因素与作为因变量的预测对象是否有关,相关程度如何,以及判断这种相关程度的把握性多⼤,就成为进⾏回归分析必须要解决的问题。进⾏相关分析,⼀般要求出相关关系,以相关系数的⼤⼩来判断⾃变量和因变量的相关的程度。
⼆、⽬的
回归分析的⽬的⼤致可分为两种: 第⼀,“预测”。预测⽬标变量,求解⽬标变量y和说明变量(x1,x2,…)的⽅程。
y=a0+b1x1+b2x2+…+bkxk+误差(⽅程A) 把⽅程A叫做(多元)回归⽅程或者(多元)回归模型。a0是y截距,b1,b2,…,bk是回归系数。当k=l时,只有1个说明变量,叫做⼀元回归⽅程。根据最⼩平⽅法求解最⼩误差平⽅和,⾮求出y截距和回归系数。若求解回归⽅程.分別代⼊x1,x2,…xk的数值,预测y的值。 第⼆,“因⼦分析”。因⼦分析是根据回归分析结果,得出各个⾃变量对⽬标变量产⽣的影响,因此,需要求出各个⾃变量的影响程度。
三、求解
根据最⼩⼆乘法求解y=a+bx中的a和b。那么什么是最⼩⼆乘法?分别从散点图的各个数据标记点,做⼀条平⾏于y轴的平⾏线,相交于图中直线(如下图)
平⾏线的长度在统计学中叫做“误差”或者‘残差”。误差(残差)是指分析结果的运算值和实际值之间的差。
为了避免正负误差抵消,求平⾏线长度曲平⽅值。可以把平⽅值看做边长等于平⾏线长度的正⽅形⾯积(如下图)
最后,求解所有正⽅形⾯积之和。确定使⾯积之和最⼩的a(截距)和b(回归系数)的值(如下图)。
四、步骤
线性回归的步骤不论是⼀元还是多元相同,步骤如下: 1、散点图判断变量关系(简单线性); 2、求相关系数及线性验证; 3、求回归系数,建⽴回归⽅程; 4、回归⽅程检验; 5、参数的区间估计; 6、预测;
五、评价
我们画出的拟合直线只是⼀个近似,因为肯定很多的点都没有落在直线上,那么我们的直线拟合程度到底怎么样呢?在统计学中有⼀个术语叫做R^2(coefficient ofdetermination,中⽂叫判定系数、拟合优度,决定系数( R^2是“R的平⽅”),⽤来判断回归⽅程的拟合程度。 总偏差平⽅和(⼜称总平⽅和,SST,Sum of Squaresfor Total):是每个因变量的实际值(给定点的所有Y)与因变量平均值(给定点的所有Y的平均)的差的平⽅和,即,反映了因变量取值的总体波动情况。如下:      回归平⽅和(SSR,Sum of Squares for Regression):因变量的回归值(直线上的Y值)与其均值(给定点的Y值平均)的差的平⽅和,即,它是由于⾃变量x的变化引起的y的变化,反映了y的总偏差中由于x与y之间的线性关系引起的y的变化部分,是可以由回归直线来解释的。
残差平⽅和(⼜称误差平⽅和,SSE,Sum of Squaresfor Error):因变量的各实际观测值(给定点的Y值)与回归值(回归直线上的Y值)的差的平⽅和,它是除了x对y的线性影响之外的其他因素对y变化的作⽤,是不能由回
归直线来解释的。因此SST(总偏差)=SSR(回归线可以解释的偏差)+SSE(回归线不能解释的偏差)    那么所画回归直线的拟合程度的好坏,其实就是看看这条直线(及X和Y的这个线性关系)能够多⼤程度上反映(或者说解释)Y值的变化,定义 R^2=SSR/SST 或 R^2=1-
SSE/SST, R^2的取值在0,1之间,越接近1说明拟合程度越好    假如所有的点都在回归线上,说明SS
E为0,则R^2=1,意味着Y的变化100%由X的变化引起,没有其他因素会影响Y,回归线能够完全解释Y的变化。如果R^2很低,说明X和Y之间可能不存在线性关系 还是回到最开始的⼴告费和销售额的例⼦,这个回归线的R^2为0.73,说明拟合程度还凑合。    在数学上可以证明,相关系数R的平⽅就是判定系数。
六、变量的显著性检验
变量的显著性检验的⽬的:剔除回归系数中不显著的解释变量(也就是X),使得模型更简洁。在⼀元线性模型中,我们只有⼀个⾃变量X,就是要判断X对Y是否有显著性的影响;多元线性回归中,验证每个Xi⾃⾝是否真的对Y有显著的影响,不显著的就应该从模型去掉。
变量的显著性检验的思想:⽤的是纯数理统计中的假设检验的思想。对Xi参数的实际值做⼀个假设,然后在这个假设成⽴的情况下,利⽤已知的样本信息构造⼀个符合⼀定分布的(如正态分布、T分布和F分布)的统计量,然后从理论上计算得到这个统计量的概率,如果概率很低(5%以下),根据“⼩概率事件在⼀次实验中不可能发⽣”的统计学基本原理,现在居然发⽣了!(因为我们的统计量就是根据已知的样本算出来的,这些已知样本就是⼀次实验)肯定是最开始的假设有问题,所以就可以拒绝最开始的假设,如果概率不低,那就说明假设没问题。    T检验⽤于对某⼀个⾃变量Xi对于Y的线性显著性,如果某⼀个Xi不显著,意味着可以从模型中剔除这个变量,使得模型更简洁。    F检验⽤于对所有的⾃变量
X在整体上看对于Y的线性显著性    T检验的结果看P-value,F检验看Significant F值,⼀般要⼩于0.05,越⼩越显著(这个0.05其实是显著性⽔平,是⼈为设定的,如果⽐较严格,可以定成0.01或0.1)
七、代码
Python版本(预测为例)
Step 1: Data Preprocessing
Importing the libraries
importpandasaspd
importnumpyasnp
Importing the dataset
ad_csv('50_Startups.csv') #CSV⽂件,修改成⾃⼰要⽤的⽂件名
X=dataset.iloc[ : , :-1].values    #读取⾃变量数据
Y=dataset.iloc[ : ,  4 ].values  #读取因变量数据
以下两步,部分问题不涉及编码不需要
Encoding Categorical data
fromsklearn.preprocessingimportLabelEncoder, OneHotEncodermatlab学好了有什么用
labelencoder=LabelEncoder()
X[: , 3] =labelencoder.fit_transform(X[ : , 3])
onehotencoder=OneHotEncoder(categorical_features= [3])
X=onehotencoder.fit_transform(X).toarray()
Avoiding Dummy Variable Trap
X=X[: , 1:]
Splitting the dataset into the Training set and Test set
X_train, X_test, Y_train, Y_test=train_test_split(X, Y, test_size=0.2, random_state=0)#分训练集和测试集,测试集⽐例根据需要修改,⼀般为0.2-0.3 Step 2: Fitting Multiple Linear Regression to the Training set
fromsklearn.linear_modelimportLinearRegression
regressor=LinearRegression()#导⼊线性回归
regressor.fit(X_train, Y_train)#训练集拟合
Step 3: Predicting the Test set results
y_pred=regressor.predict(X_test)#拟合好的模型⽤于预测
Step 4: Test
ics import r2_score
score = r2_score(y_test,y_pred)#拟合优度检验
y_mean = np.mean(y_test)
n = len(y_test)
k = np.size(X_test,1)
TSS = sum((y_test-y_mean)**2)#总离差平⽅和
ESS = sum((y_pred-y_mean)**2) #回归平⽅和
RSS = sum((y_pred-y_test)**2) #残差平⽅和
R2 = 1-RSS/TSS
Adjust_R2 = 1-(1-R2)*(n)/(n-k)#调整R2
alpha = 0.05
#回归⽅程显著性检验 F检验检验不通过原因有2:1、重要⾃变量遗漏;2、关系⾮线性F = ESS/k/(RSS/(n-k))
critical2 = f.ppf(1-alpha,k,n-k) #双尾临界值
#输出检验结果
if F>critical2:
print ('the linear regression between x and y is significant')
else:
print('the linear regression between x and y is not significant')
#复相关检验
MC_R2 = np.sqrt(RSS/TSS)#越接近于1越好
#回归系数显著性检验
Cij = np.anspose(X_test),X_test)
Cjj = []
t_statistic = []
for i in range(k):
Cjj.append(Cij[i][i])
t_statistic.append(para[i]/(np.sqrt(Cjj[i]*RSS/(n-k))))
# 已知临界值求p值
p = []
for i in range(k):
p.append(t.sf(t_statistic[i], n-k))
for i in range(k):
if p[i]<0.05:
print ('the linear regression between x and y is significant')
else:
print('the linear regression between x and y is not significant')
Step 5: Visualization
Visualising the Training results
plt.scatter(X_train , Y_train, color = 'red')
plt.plot(X_train , regressor.predict(X_train), color ='blue') Visualizing the test results

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。