当前位置:   article > 正文

【项目记录】【Python】多元线性回归和数据可视化(模糊化热力图heatmap、等高线contour)_pandas多元回归和可视化

pandas多元回归和可视化

项目描述:

给定数据库(dataframe格式),目标:

  1. 根据数据库中特定字段(var1,var2)筛选出所需样本;
  2. 对样本中特定维度(x)进行归一化;
  3. 自定义坐标轴标签;
  4. 绘制模糊处理的热力图;
  5. 进行多元线性回归;
  6. 绘制等高线。
步骤:
导入第三方库
  1. # IMPORT
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. import math
  5. import pyodbc
  6. import pandas as pd
  7. from matplotlib import ticker
  8. from sklearn.linear_model import LinearRegression
导入数据并筛选

        这里我们自己生成一组数据,共100*100个点。

  1. # 构造数据
  2. a = 0.5
  3. b = 0.8
  4. c = 1
  5. x = np.linspace(0,5,100)
  6. y = np.linspace(0,1,100)
  7. z = a*x*x + b*y*y + c #热力图的第三个维度
  8. var1 = 'var1'
  9. var2 = 'var2'
  10. data = {'x':x,'y':y,'z':z,'var1':var1,'var2':var2}
  11. df0 = pd.DataFrame(data)
  12. df1 = df0[(df0.var1 == var1) & (df0.var2 == var2)]
  13. x=np.array((df1.x-df1.x.min())/(df1.x.max()-df1.x.min())) #归一化
  14. y=np.array(df1.y)
  15. X,Y=np.meshgrid(x,y)
  16. z=[]
  17. for j in range(len(x)):
  18. z_row=[]
  19. for k in range(len(y)):
  20. z_value=a*X[j][k]*X[j][k] + b*Y[j][k]*Y[j][k] + c
  21. z_row.append(z_value)
  22. z.append(z_row)
  23. #导出热力图看效果
  24. plt.pcolormesh(x,y,z)
  25. plt.colorbar()

效果图: 

由于这里样本量足够多,且数量关系十分明确,所以效果看起来还挺理想。

绘制热力图

在实际中画热力图时,为了让原本数量关系没那么明确、样本量也不一定够多的数据展现出一定的规律性,我们采用方格模糊化的做法。

  • 构建方格

        自定义方格的尺寸,以及模糊半径,绘制热力图。热力图展示出方格对应的中心点(xc,yc)以h为半径的圆内所有点的z的平均值大小。

  1. #定义方格的尺寸大小以及模糊半径(h)
  2. grid_size=0.05
  3. h=0.05
  4. #创建方格,方格边框坐标(x_grid,y_grid)
  5. x_min=min(x)
  6. x_max=max(x)
  7. y_min=min(y)
  8. y_max=max(y)
  9. x_grid=np.arange(x_min-h,x_max+h,grid_size)
  10. y_grid=np.arange(y_min-h,y_max+h,grid_size)
  11. x_mesh,y_mesh=np.meshgrid(x_grid,y_grid)
  12. #方格中心点坐标(xc,yc)
  13. xc=x_mesh+(grid_size/2)
  14. yc=y_mesh+(grid_size/2)
  15. cround=(xc+h)*(xc+h)+(yc+h)*(yc+h)
  16. #输出方格边框点以及方格中心点,选一个方格中心点画出模糊半径
  17. plt.grid(False)
  18. plt.scatter(x_mesh, y_mesh) # the boundary of grid
  19. plt.show
  20. fig = plt.figure()
  21. ax = plt.subplot(111)
  22. ax.scatter(xc,yc) # the center of grid
  23. cir = plt.Circle((pd.DataFrame(xc)[10][10],pd.DataFrame(yc)[10][10]),h, color='r',fill=False)
  24. ax.add_patch(cir)
  25. plt.show()
  26. plt.show()

效果图: 

  • 计算每个方格中心模糊半径内的z的平均值intensity,生成intensity_list
  1. intensity_list=[]
  2. for j in range(len(xc)):
  3. intensity_row=[]
  4. for k in range(len(xc[0])):
  5. z_list=[]
  6. n=0
  7. for i in range(len(x)):
  8. for l in range(len(y)):
  9. #CALCULATE DISTANCE
  10. d=math.sqrt((xc[j][k]-x[i])**2+(yc[j][k]-y[l])**2)
  11. if d<=h:
  12. z_value=z[i][l]
  13. n=n+1
  14. else:
  15. z_value=0
  16. z_list.append(z_value)
  17. if sum(z_list) != 0:
  18. z_mean=sum(z_list)/n
  19. else:
  20. z_mean=np.nan
  21. intensity_row.append(z_mean)
  22. intensity_list.append(intensity_row)
  23. print(pd.DataFrame(intensity_list)) #22*22 matrix, 484 points
  •  绘制热力图
  1. intensity=np.array(intensity_list)
  2. cm=plt.cm.get_cmap('Blues')
  3. cm.set_bad(color='whitesmoke',alpha=0) #设置“坏值”(Nan)的颜色,这里设置为透明
  4. plt.pcolormesh(x_mesh,y_mesh,intensity,cmap=cm)
  5. plt.xlim((0.00,1.00)) #限制x轴范围(0.00,1.00)
  6. plt.xticks([])
  7. plt.colorbar()

效果图:

 

这里可以看到因为模糊处理,效果一般,但是如果修改gridsize和模糊半径的话,可能会得到更好的结果。

多元线性回归
  • 生成point list

       首先生成point list,每一行表示一个点

  1. # 计算point list
  2. point_list=[]
  3. for j in range(len(xc)):
  4. for k in range(len(xc[0])):
  5. point_row=[]
  6. point_row.append(xc[j][k])
  7. point_row.append(yc[j][k])
  8. point_row.append(intensity_list[j][k])
  9. point_list.append(point_row)
  10. #print(point_list)
  11. print(pd.DataFrame(point_list)) # 484*3 matrix, 484=22*22
  • 生成多元线性回归中的解释变量和被解释变量

       通过对point list切片,切出多元线性回归中的y(被解释变量,在这里为z)、x1、x2(x1和x2一起组成解释变量)。

  1. #剔除缺失值
  2. point_list = pd.DataFrame(point_list)
  3. point_list = point_list.dropna()
  4. #切出x_regression和y_regression
  5. x1=point_list.iloc[:,0]
  6. x1=np.array(x1).reshape(-1,1)
  7. x1_2=x1*x1
  8. x2=point_list.iloc[:,1]
  9. x2=np.array(x2).reshape(-1,1)
  10. x2_2=x2*x2
  11. x_regression=np.concatenate([x1_2,x2_2],axis=1)
  12. y_regression=np.array(point_list.iloc[:,2])
  • 进行多元线性回归,导出拟合优度、系数以及截距
  1. #多元线性回归
  2. model = LinearRegression()
  3. model = LinearRegression().fit(x_regression, y_regression)
  4. epsilon=model.intercept_
  5. alpha=model.coef_
  6. R2=model.score(x_regression, y_regression)
  7. print('coefficient of determination:', R2)
  8. print('intercept:', epsilon)
  9. print('slope:', alpha)
  • 绘制等高线
  1. n=100 #取足够多的点来平滑曲线
  2. x_plot=np.linspace(x_min,x_max,n)
  3. y_plot=np.linspace(y_min,y_max,n)
  4. X_plot, Y_plot = np.meshgrid(x_plot,y_plot)
  5. z_plot=(alpha[0]*X_plot*X_plot+alpha[1]*Y_plot*Y_plot+epsilon)*100 #赋z的值
  6. plt.contourf(X_plot,Y_plot,z_plot,alpha=0)
  7. C=plt.contour(X_plot,Y_plot,z_plot,8,linewidths=1,colors='black') #8:等高线数量
  8. plt.clabel(C,inline=True,fmt='%1.0f %%') #小数转为百分比
  9. plt.show()

效果图:

 

 PS 这里同样用真实值(a,b,c)绘制了一个等高线图,效果图和代码为:

  1. n=100 #take enough points to make the contour smooth
  2. x_plot=np.linspace(x_min,x_max,n)
  3. y_plot=np.linspace(y_min,y_max,n)
  4. X_plot, Y_plot = np.meshgrid(x_plot,y_plot) #generate a grid matrix
  5. z_plot=(a*X_plot*X_plot+b*Y_plot*Y_plot+c)*100 #generate the value of z
  6. plt.contourf(X_plot,Y_plot,z_plot,alpha=0)
  7. C=plt.contour(X_plot,Y_plot,z_plot,8,linewidths=1,colors='black') #8:the number of contours
  8. plt.clabel(C,inline=True,fmt='%1.0f %%') #transfer decimals to percentages
  9. plt.show()

 

 其实相差也没那么大。

将等高线和热力图放在一起,并自定义坐标轴标签
  1. (偷懒不改成中文了,原本是用英文写的注释)
  2. #set the theme and background
  3. plt.grid(True)
  4. plt.style.use('seaborn-darkgrid')
  5. #construct axis ,ticks and labels
  6. plt.ylim((-0.025,1.00)) #limit the y-axis to range(-0.025,1.00)
  7. plt.xlim((0.00,1.00)) #limit the x-axis to range(0.00,1.00)
  8. plt.gca().yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=0)) #transfer decimals to percentages,decimals: the number after the decimal point
  9. my_label = ['a','b','c', 'd', 'e', 'f']
  10. plt.xticks(ticks=[0.0,0.2,0.4,0.6,0.8,1.0],labels=my_label)
  11. plt.plot(x, y, alpha=0) #alpha: transparency
  12. plt.ylabel(''r'$\Delta$ Competitiveness')
  13. plt.xlabel('ASP')
  14. plt.twiny()
  15. #construct heatmap
  16. intensity=np.array(intensity_list)
  17. cm=plt.cm.get_cmap('Blues')
  18. cm.set_bad(color='whitesmoke',alpha=0) #define the color of Nan
  19. plt.pcolormesh(x_mesh,y_mesh,intensity,cmap=cm)
  20. plt.title(var2 + '+' + var1)
  21. plt.xlim((0.00,1.00)) #limit the x-axis to range(0.00,1.00)
  22. plt.xticks([])
  23. plt.colorbar()
  24. #construct contours
  25. n=100 #take enough points to make the contour smooth
  26. x_plot=np.linspace(x_min,x_max,n)
  27. y_plot=np.linspace(y_min,y_max,n)
  28. X_plot, Y_plot = np.meshgrid(x_plot,y_plot) #generate a grid matrix
  29. z_plot=(alpha[0]*X_plot*X_plot+alpha[1]*Y_plot*Y_plot+epsilon)*100 #generate the value of z
  30. plt.contourf(X_plot,Y_plot,z_plot,alpha=0)
  31. C=plt.contour(X_plot,Y_plot,z_plot,8,linewidths=1,colors='black') #8:the number of contours
  32. plt.clabel(C,inline=True,fmt='%1.0f %%') #transfer decimals to percentages
  33. plt.show()

效果图:

 
OVER

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号