matlab回归分析sst_机器学习—回归分析

ba98de937549e61653b5511994ddacbb.png

一、概念

     回归分析(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轴的平行线,相交于图中直线(如下图)

1ae1daf7d4664d1654693d8b1e3514f8.png

     平行线的长度在统计学中叫做“误差”或者‘残差”。误差(残差)是指分析结果的运算值和实际值之间的差。为了避免正负误差抵消,求平行线长度曲平方值。可以把平方值看做边长等于平行线长度的正方形面积(如下图) 

9540ec424298964e4dc60c58a640f4d8.png

     最后,求解所有正方形面积之和。确定使面积之和最小的a(截距)和b(回归系数)的值(如下图)。

33eb2f607fd5fa3ff3d11467480395d1.png

四、步骤

     线性回归的步骤不论是一元还是多元相同,步骤如下: 1、散点图判断变量关系(简单线性); 2、求相关系数及线性验证; 3、求回归系数,建立回归方程; 4、回归方程检验; 5、参数的区间估计; 6、预测;

五、评价

     我们画出的拟合直线只是一个近似,因为肯定很多的点都没有落在直线上,那么我们的直线拟合程度到底怎么样呢?在统计学中有一个术语叫做R^2(coefficient ofdetermination,中文叫判定系数、拟合优度,决定系数( R^2是“R的平方”),用来判断回归方程的拟合程度。 总偏差平方和(又称总平方和,SST,Sum of Squaresfor Total):是每个因变量的实际值(给定点的所有Y)与因变量平均值(给定点的所有Y的平均)的差的平方和,即,反映了因变量取值的总体波动情况。如下: 98ffa374be0ef7b5e0bf9699d67f8d55.png     回归平方和(SSR,Sum of Squares for Regression):因变量的回归值(直线上的Y值)与其均值(给定点的Y值平均)的差的平方和,即,它是由于自变量x的变化引起的y的变化,反映了y的总偏差中由于x与y之间的线性关系引起的y的变化部分,是可以由回归直线来解释的。  c44a08b67d2e440a6252f54dac3a76f9.png     残差平方和(又称误差平方和,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说明拟合程度越好     假如所有的点都在回归线上,说明SSE为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

dataset=pd.read_csv('50_Startups.csv') #CSV文件,修改成自己要用的文件名
X=dataset.iloc[ : , :-1].values    #读取自变量数据
Y=dataset.iloc[ : ,  4 ].values   #读取因变量数据

以下两步,部分问题不涉及编码不需要

Encoding Categorical data

fromsklearn.preprocessingimportLabelEncoder, OneHotEncoder
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

fromsklearn.cross_validationimporttrain_test_split
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

from sklearn.metrics 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.dot(np.transpose(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

plt.scatter(X_test , Y_test, color = 'red')
plt.plot(X_test , regressor.predict(X_test), color ='blue')

matlab 版本             

clear;clc;
data=xlsread('jc_p133_example.xlsx','sheet1');%换成自己的数据读取xls/xlsx
xi=data(:,1:end-1);%自变量
[n,k]=size(data);
k=k-1;%自变量个数
index_of_xi_array=ones(1,k);
X=[ones(n,1) xi];%含常数项回归
Y=data(:,end);
fprintf('第1次计算结果:\r')
beta_mao=((X'*X)\X'*Y)'; %最小二乘法估计系数
fmt_str0='';
for i0=1:k+1
    fmt_str0=[fmt_str0 'β' num2str(i0-1) ' = %0.4f\r'];
end
fprintf(fmt_str0,beta_mao)
fprintf('\r')
 
%%检验回归方程的显著性
x_ba=mean(xi);
y_ba=mean(Y);
St_square=sum(Y.^2)-n*y_ba^2;
lxy=sum((xi-ones(n,1)*x_ba).*((Y-y_ba)*ones(1,k)));
Sr_square=sum(beta_mao(2:end).*lxy);
Se_square=St_square-Sr_square;
c_flag=Sr_square/Se_square;
F_alpha=input('>>>>>>请输入您要求的显著性水平(0
while ~(isscalar(F_alpha) && F_alpha<1 && F_alpha>0)
    F_alpha=input('您的输入有误,请重新输入一个大于0,小于1的数,α= ');
end
F_fenweidian=finv(1-F_alpha,k,n-k-1);
c=k/(n-k-1)*F_fenweidian;
if c_flag>c
    fprintf(['\r--------------------回归方程显著性检验(H0:β1=β2=...=βk=0)' ...
        '--------------------\r经过计算:拒绝H0,原假设不成立。'])
else
    fprintf(['\r--------------------回归方程显著性检验(H0:β1=β2=...=βk=0)' ...
        '--------------------\r经过计算:接受H0,原假设成立。'])
end
 
%%检验回归系数的显著性(循环检验,直到OK,得出最后结果)
fprintf(['\r\r-----------------回归系数显著性检验(分别对β1、β2、...、βk进行)' ...
        '------------------'])
flag_go_on=1;
num_of_loop=0;
while flag_go_on
cij=inv(X'*X);
cii=diag(cij);
F_fenweidian_1=finv(1-F_alpha,1,n-k-1);
ci=sqrt(cii(2:end)*Se_square*F_fenweidian_1/(n-k-1));
format_str='%15.4f';
for ii=1:k-1
    format_str=[format_str '%13.4f'];
end
fprintf(['\r第%d次检验:\rcii: ' format_str '%13.4f\r ci:              ' ...
    format_str '\rβi:' format_str '%13.4f'],num_of_loop+1,cii,ci,beta_mao)
if ~all(abs(beta_mao(2:end))>ci')
    flag_go_on=1;
    beta_1tok=beta_mao;
    beta_1tok(1)=[];
    fi_xin=beta_1tok.^2./cii(1:end-1)';
    min_fi=min(fi_xin);
    beta_index=find(fi_xin==min_fi)+1;
    fprintf('\rx%d对y的线性影响最不显著( |β%d|=%0.4f )。删除x%d,进行第%d次计算:',...
        beta_index-1+num_of_loop,beta_index-1+num_of_loop,...
        abs(beta_mao(beta_index)),beta_index-1+num_of_loop,...
        beta_index-1+num_of_loop+1)
else
    fmt_str2='x%d';
    index_of_xi=find(index_of_xi_array);
    for i2=1:length(find(index_of_xi))-1
        fmt_str2=[fmt_str2 '、x%d'];
    end
    fprintf(['\r\r经过检验,剩余所有变量:' ...
        fmt_str2 '对y的线性影响均显著。检验结束。\r'],index_of_xi)
    flag_go_on=0;
end
if flag_go_on
    num_of_loop=num_of_loop+1;
    k=k-1;
    if ~k
        fprintf('\r\r警告:通过一一对所有变量做显著性检验,已剔除所有变量!');
        break;
    end
    beta_mao=beta_mao-beta_mao(beta_index)/cii(beta_index)*cij(beta_index,:);
    beta_mao(beta_index)=[];
    fmt_str1='';
    for i1=2:k+1
        fmt_str1=[fmt_str1 'β' num2str(i1-1+num_of_loop) ' = %0.4f\r'];
    end
    fprintf(['\rβ0 = %0.4f\r' fmt_str1],beta_mao)
   
    X(:,beta_index)=[];
    index_of_xi_array(beta_index-1+num_of_loop-1)=0;
    xi=X(:,2:end);
    x_ba=mean(xi);
    lxy=sum((xi-ones(n,1)*x_ba).*((Y-y_ba)*ones(1,k)));
    Sr_square=sum(beta_mao(2:end).*lxy);
    Se_square=St_square-Sr_square;
end
end

  文字 | 原创     

图片 | 可商用

文字请替换

2d561dbdd3293737a43aa10fc4e6e827.png

               一个分享AI学习的公众号                  

欢迎订阅,一起学习,一起交流

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值