一、用excel中数据分析功能做线性回归练习
第一步,打开下载的身高体重数据集,录入数据(以20组数据为例)。
第二步、作散点图
选中数据(包括自变量和因变量),在“插入”菜单栏中选择“插入散点图”。
第三步、回归
观察散点图,判断点列分布是否具有线性趋势。只有当数据具有线性分布特征时,才能采用线性回归分析方法。从图中可以看出,本例数据具有线性分布趋势,可以进行线性回归。打开“工具”下拉菜单,双击“数据分析”选项,选择“回归”选项。点击生成的散点图中的数据点,点击“添加趋势线”,选择“线性”,并在选择框中选中“显示公式(E)”和“显示R平方值(R)”。
200组和2000组数据操作同上
二、用jupyter编程(不借助第三方库),用最小二乘法,重做第1题
1.打开jupyter Notebook
2.新建文件,重命名文件
3.编写程序
(1)20组数据,代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
df = pd.read_excel('D:\weights_heights.xlsx')
#20组数据
d=df.head(20)
d
x=d["Height"]
y=d["Weight"]
plt.scatter(x,y)
plt.axis([65,72,0,180])
plt.show()
x_mean=np.mean(x)
y_mean=np.mean(y)
num=0.0#分子
d = 0.0#分母
m=0.0#
for x_i, y_i in zip(x,y):
num += (x_i - x_mean) * (y_i - y_mean)
d +=(x_i - x_mean) ** 2
m +=(y_i - y_mean) ** 2
a = num/d
b = y_mean - a * x_mean
y_hat=a * x +b
plt.scatter(x,y)
plt.plot(x,y_hat,color='r')
plt.axis([65,72,0,180])
plt.show()
结果显示如下:
(2)200组数据,代码如下:
d1=df.head(200)
x=d1["Height"]
y=d1["Weight"]
plt.scatter(x,y)
plt.axis([62,76,0,180])
#计算平均值
x_mean=np.mean(x)
y_mean=np.mean(y)
num=0.0
d = 0.0
m=0.0
for x_i, y_i in zip(x,y):
num += (x_i - x_mean) * (y_i - y_mean)
d +=(x_i - x_mean) ** 2
m +=(y_i - y_mean) ** 2
a1 = num/d
b1 = y_mean - a1 * x_mean
y_hat = a1 * x + b1
plt.scatter(x,y)
plt.plot(x,y_hat,color='g')
plt.axis([62,75,0,180])
plt.show()
结果显示如下图:
(3)2000组数据,代码如下:
d2=df.head(2000)
x=d2["Height"]
y=d2["Weight"]
plt.scatter(x,y)
plt.axis([0,80,0,180])
x_mean=np.mean(x)
y_mean=np.mean(y)
num=0.0
d = 0.0
m=0.0
for x_i, y_i in zip(x,y):
num += (x_i - x_mean) * (y_i - y_mean)
d +=(x_i - x_mean) ** 2
m +=(y_i - y_mean) ** 2
a2 = num/d
b2 = y_mean - a2 * x_mean
y_hat = a2 * x + b2
plt.scatter(x,y)
plt.plot(x,y_hat,color='g')
plt.axis([0,80,0,180])
plt.show()
结果显示如下图:
三、用jupyter编程,借助skleran,重做第1题
1、20组数据
代码如下:
(1)需要用到的包导入准备好,读取数据
import numpy as np
import pandas as pd
from contextlib import contextmanager as _contextmanager
import logging
from numpy import array
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import math
df=pd.read_excel('D:\weights_heights1.xlsx')
df.shape#读取数据
(2)赋值变量取20组数据
x=array(df[['Weight']].values[:20,:])
y=array(df[['Height']].values[:20,:])
(3)调用线性回归函数
model=LinearRegression(fit_intercept=True,normalize=True)
model.fit(x,y)
(4)输出斜率和截距
print(model.coef_)
print(model.intercept_)
(5)输出线性回归表达式
a=model.intercept_
b=model.coef_
y_hat=b*x+a
print("线性回归方程为:y=",b,"x",a)
(6)计算输出R^2
model.score(x,y)
(7)绘图输出
plt.figure()
plt.scatter(x,y)#散点图绘制原始数据
plt.plot(x,y_hat,color='coral')
plt.show()
2、200组数据
代码与20组类似,只需要把赋值变量取为200组数据,即将values中的20改成200即可
计算结果输出显示:
绘图显示:
3、2000组数据
代码与20组类似,只需要把赋值变量取为2000组数据,即将values中的20改为2000即可。
输出结果显示:
绘图显示:
总结
以上是线性回归的简单练习。Excel和jupyter解决线性回归问题得出的结果大致相同。Excel只需选中数据,它的数据分析功能可以自动计算出相关数据,绘出图像。不借助第三方库,使用最小二乘法来编程,要自己计算得到相关系数,斜率和截距,并以此数据来绘图。借助sklearn库编程,sklearn有提供相关的函数,只需要调用函数即能得到输出值。