相关系数| ρXY |=0时,则称X,Y不相关; | ρXY |=1时,则称X,Y完全相关,此时,X,Y之间具有线性函数关系; 当| ρXY | < 1时,X的变动引起Y的部分变动,ρXY的绝对值越大,X的变动引起Y的变动就越大, | ρXY | > 0.8时称为高度相关,当 | ρXY|< 0.3时称为低度相关,其它时候为中度相关。
from scipy import stats
import matplotlib.pyplot as plt
x=[5,7,8,7,2,17,2,9,4,11,12,9,6]
y=[99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x,y)
slope,intercept,rvalue,pvalue,stderr=stats.linregress(x,y)
print("相关系数是",rvalue)
def myfunc(x):
return slope*x+intercept
getmodel=list(map(myfunc,x)) #map()返回迭代器中参数运行函数后得到的迭代器
plt.plot(x,getmodel)
当用plt.scatter(x,y) 初步观察发现数据之间并不存在线性关系,此时我们可以选择多项式回归。接下来介绍一下多项式回归中用到的方法。
参数1:系数向量
import numpy as np
a=np.array([2,1,1])
f=np.poly1d(a)
print(f)
输出结果为:
2
2 x + 1 x + 1
参数2:bool
表示把数组中的值作为根,然后反推多项式,例如:
f=np.poly1d([2,3,5],r=True)
print(f)
#(x - 2)*(x - 3)*(x - 5) = x^3 - 10x^2 + 31x -30
#输出结果为:
3 2
1 x - 10 x + 31 x - 30
参数3:字母
variable=‘z’表示改变未知数的字母,例如:
f=np.poly1d([2,3,5],r=True,variable='z')
print(f)
#输出结果为:
3 2
1 z - 10 z + 31 z - 30
计算多项式的值:代入x
print(f([1,2,3,4]))
print(f(1))
#输出结果为:
[-8. 0. 0. -2.]
-8.0
f(0.5)表示当x = 0.5时,多项式的值为多少
f([1,2,3])表示当x = 1、2、3时,多项式的值分别为多少
f.r表示当多项式为 0 时,此等式的根root
f.c表示生成多项式的系数数组coefficients
f.order表示返回最高项的次方数
p[1]表示返回第一项的系数(次方数为1的项的系数)
p.deriv([m])表示求导derivative,参数m表示求几次导数
p.integ([m,k])表示积分,参数m表示积几次分,k表示积分后的常数项的值
两个多项式做差运算: np.polysub(a,b)
np.polyval(p,x)计算多项式的函数值。返回在x处多项式的值,p为多项式系数
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus']=False
xu=np.random.rand(50)*4*np.pi-2*np.pi
def f(x):
return np.sin(x)+0.5*x
yu=f(xu)
plt.figure(figsize=(8,6))
#得到拟合多项式系数,自由度5(最高次幂)
reg=np.polyfit(xu,yu,5)
#遍历xu的每个元素,得到多项式的值
ry=np.polyval(reg,xu)
plt.plot(xu,yu,'b^',label='f(x)')
plt.plot(xu,ry,'r.',label='regression')
plt.legend()
在下面的示例中,我们注册了18辆经过特定收费站的汽车。我们已经记录了汽车的速度和通过时间(小时)。
x轴表示一天中的小时,y轴表示速度
import matplotlib.pyplot as plt
import numpy as np
x=[1,2,3,5,6,8,9,10,12,13,14,15,16,18,19,21,22]
y=[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,100]
plt.scatter(x,y)
fit_y=np.polyval(np.polyfit(x,y,3),x)
plt.plot(x,fit_y)
print(np.poly1d(np.polyfit(x,y,3)))
得到预估模型后,我们可以用R平方判断模型的拟合程度强不强,R平方的范围是0到1,其中0表示不相关,1表示相关。
from sklearn.metrics import r2_score
getmodel=np.poly1d(np.polyfit(x,y,3))
R_square=r2_score(y,getmodel(x))
print('R_square: {:.2f}'.format(R_square))
#得到R平方接近1,该模型拟合度较强,可以用来预测
speed=getmodel(17)
print('17点过车速度: {:.2f}'.format(speed))
#输出结果为:
R_square: 0.94
17点过车速度: 83.95
多元线性回归,有多个属性,多个属性的数据具有不同的值,甚至具有不同的度量单位时,可能很难比较它们,这时我们就需要对数据进行处理,使其生成可以对比的对象;这里介绍的数据预处理方法的公式为,(X-X_mean)/X_std,这里X_mean是均值,X_std是标准差。
sklearn.preprocessing.scale()函数可以直接将给定数据进行标准。
from sklearn import preprocessing
import numpy as np
x=np.array([[1,-1,2],
[2,0,0],
[0,1,-1]])
x_scaled=preprocessing.scale(x)
print(x_scaled)
print(x_scaled.mean(axis=0))
print(x_scaled.std(axis=0))
#输出结果为:
[[ 0. -1.22474487 1.33630621]
[ 1.22474487 0. -0.26726124]
[-1.22474487 1.22474487 -1.06904497]]
[0. 0. 0.]
[1. 1. 1.]
使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。
#compute the mean and std to be used for later scalin
from sklearn import preprocessing
scaler=preprocessing.StandardScaler().fit(x)
print(scaler.mean_)
print(scaler.transform(x))
print(scaler.transform([[-1,1,0]]))
这里需要解释一下fit,fit_transform和transform:fit方法是用于从一个训练集中学习模型参数,其中就包括了归一化时用到的均值,标准偏差。transform方法就是用于将模型用于位置数据,fit_transform就很高效的将模型训练和转化合并到一起,训练样本先做fit,得到mean,standard deviation,然后将这些参数用于transform(归一化训练数据),使得到的训练数据是归一化的,而测试数据只需要在原先得到的mean,std上来做归一化就行了,所以用transform就行了。
import pandas as pf
from sklearn.preprocessing import StandardScaler
from sklearn import linear_model
from sklearn.metrics import r2_score
f=open(r'C:\Users\USER\Desktop\python慕课课程文件\数据分析数据\cars.csv')
df=pd.read_csv(f)
x=df[['Volume','Weight']]
y=df['CO2']
#对数据进行标准化处理
scaler=StandardScaler()
scaledx=scaler.fit_transform(x)
#线性回归模型
method=linear_model.LinearRegression()
getmodel_1=method.fit(scaledx,y)
coef_,intercept_=getmodel_1.coef_,getmodel_1.intercept_
print('回归模型的系数为: {},截距为: {}'.format(coef_,intercept_))
#用R平方检验该模型的拟合度
predict_y=getmodel_1.predict(scaledx)
R_square=r2_score(y,predict_y)
print('R_square is: ',R_square) #得到的值只有0.37,说明该模型不适合预估
#如果可行,就可以预估
scaled_test=scaler.transform([[1300,2300]])
predicted_co2=getmodel_1.predict(scaled_test)
print('预估的CO2: ',predicted_co2)
#输出的结果为:
回归模型的系数为: [2.99358608 1.80269333],截距为: 102.02777777777777
R_square is: 0.37655640436199866
预估的CO2: [107.2087328]
import pandas as pd
from sklearn import datasets,linear_model
from sklearn.metrics import r2_score
import numpy as np
boston=datasets.load_boston()
x=pd.DataFrame(boston.data,columns=boston.feature_names)
y=pd.DataFrame(boston.target,columns=['MEDV'])
method=linear_model.LinearRegression()
getmodel=method.fit(x,y)
py=getmodel.predict(x)
r_square=r2_score(y,py)
print('R平方: {:.2f}'.format(r_square))
x_test=np.array([[0.005,16,2,0.0,0.7,6,70,4,1.0,297,16,398,5]])
print(method.predict(x_test))
#输出结果为:
R平方: 0.74
[[24.29494346]]
import pandas as pd
from sklearn import datasets
import statsmodels.api as sm
boston=datasets.load_boston()
x=pd.DataFrame(boston.data,columns=boston.feature_names)
y=pd.DataFrame(boston.target,columns=['MEDV'])
#statsmodels中的线性回归模型没有截距项,为其添加数据为1的特征
x_add1=sm.add_constant(x)
#sm.OLS普通最小二乘法回归模型,fit()进行拟合
model_1=sm.OLS(y,x_add1).fit()
print(model_1.summary())
#从模型中可以看到INDUS、AGE的p值大于0.05,无显著性意义,我们删除这两个属性重新建模
x.drop(['INDUS','AGE'],axis=1,inplace=True)
x_add1=sm.add_constant(x)
model_2=sm.OLS(y,x_add1).fit()
print(model_2.summary())
print(model_2.params)