在很多情况下,大家的工作会遇到y数据与x数据存在相关性,但无法知道y与x是那种相关,需要具体知道两者关系,我们可以用拟合模型来完成这个事情。
1:随机源数据
很多初学者想动手尝试的时候,苦于无源数据,就此放弃。今天小编教大家一个生成随机数据的方法。
用到numpy,pandas 两个python库。
Numpy:是python科学计算的基础包。它提供以下功能(不限于此):快速高效的多维数组对象ndarry
用于对数组执行元素级计算以及直接对数组执行数学运算的函数
用于快速读写硬盘上基于数组的数据集工具
线性代数运算,傅里叶变换,以及随机数生成
Pandas:提供了快速便捷处理结构化数据的大量数据结构和函数。
代码:
import numpy as np
import pandas as pd
array=np.random.rand(20,20) #随机生成20*20数据数据
data_df = pd.DataFrame(array)
print data_df
writer = pd.ExcelWriter('Save_Excela.xlsx')
data_df.to_excel(writer,'page_1',float_format='%.5f') # float_format 控制精度
writer.save()
如下是执行代码后,打印出来的结果。
2:刻意生成---线性关系 源数据
现在大家已经自行能够生成随机数据,显然20列数据是没有任何关系的,刚刚小编刻意保留了本地文件 Save_Excela.xlsx,代码执行完成后,各位打开excel文件,插入Y列,生成与第一列相关的数据。如下
writer = pd.ExcelFile('Save_Excela.xlsx')
table1=writer.parse('page_1')
array0 = table1.get(0) ##第一列数据
Yi= [x for x in array0] ##目的是去掉角标,只有参与模型的值
array01 = table1.get(1)
Xi= [x for x in array01]
print array0
print Yi
print Xi
如下结果分别问:array0,Yi ,Xi
3:数据模型
3.1:简单介绍
先介绍一个相关的库:Scikit—Learn
是一个强大的机器学习的库,刻意提供完整的机器学习工具箱,包括数据预处理,分类,回归,聚类,预测和模型分析。
如下,我们开头随机生成20*20数据,多了几行代码。
from pandas import Series,DataFrame ##导入数据结构(目的是转换成array识别的数组)
from sklearn import linear_model ##导入线性回归模型
import matplotlib.pyplot as plt ##导入matplotlib
假设,我们并没有from pandas import Series,DataFrame ##导入数据结构(目的是转换成array识别的数组)
那么执行模型会出现如下情况:
3.2:数据转换
转换成识别的格式
3.3:开始建模
如下结果:
1表示呈线性相关,系数为25,拟合图形如下:
如下是y与第二列的数据拟合图形:显然不成线性相关
代码:
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
from sklearn import linear_model
import matplotlib.pyplot as plt
#array=np.random.rand(20,20)
#data_df = pd.DataFrame(array)
#writer = pd.ExcelWriter('Save_Excela.xlsx')
#data_df.to_excel(writer,'page_1',float_format='%.5f') # float_format 控制精度
#writer.save()
writer = pd.ExcelFile('Save_Excela.xlsx')
table1=writer.parse('page_1')
array0 = table1.get(0)
Yi= [x for x in array0]
array01 = table1.get(1)
Xi= [x for x in array01]
s1=Series(Xi) #转为series类型
s2=Series(Yi)
corr=s1.corr(s2) #计算相关系数
print corr
Xi=np.array(Xi).reshape(-1,1)
Yi=np.array(Yi).reshape(-1,1)
# 设置模型
model = linear_model.LinearRegression()
##训练数据
model.fit(Xi, Yi)
##用训练得出的模型预测数据
y_plot = model.predict(Xi)
##打印线性方程的权重
print(model.coef_) ## 0.90045842
##绘图
plt.scatter(Xi, Yi, color='red',label="样本数据",linewidth=2)
plt.plot(Xi, y_plot, color='green',label="拟合直线",linewidth=2)
plt.legend(loc='lower right')
plt.show()
以上~