python_从excel表格中读取数据并且做数据拟合

直接用python自带的函数做的拟合

import xlrd
import matplotlib.pyplot as plt
import numpy as np

t, x, y = [], [], []
data = xlrd.open_workbook('pi_digits.xlsx') # 打开xls文件
table = data.sheets()[0]  # 打开第一张表
nrows = table.nrows       # 获取表的行数
for i in range(nrows):    # 循环逐行打印
    if i == 0:  # 跳过第一行
        continue
    t.append(table.row_values(i)[1:2][0])
    x.append(table.row_values(i)[2:3][0])
    y.append(table.row_values(i)[3:4][0])

f1 = np.polyfit(t, x, 5)  # 5代表用的5次多项式,f1代表系数
p1 = np.poly1d(f1)
yvals = p1(t)  # 拟合y值

plot1 = plt.plot(t, x, 's', label='original values')
plot2 = plt.plot(t, yvals, 'r', label='polyfit values')
plt.xlabel('t')
plt.ylabel('x')
plt.legend(loc=4)  # 指定legend的位置右下角
plt.title('polyfitting')
plt.show()

python_从excel表格中读取数据并且做数据拟合
这里用了一个四次函数去拟合,效果不错
下面代码是我用梯度下降算法做出来的拟合代码及效果图

import xlrd
import matplotlib.pyplot as plt
import numpy as np

t, x, y = [], [], []
data = xlrd.open_workbook('pi_digits.xlsx') # 打开xls文件
table = data.sheets()[0]  # 打开第一张表
nrows = table.nrows       # 获取表的行数
for i in range(nrows):    # 循环逐行打印
    if i == 0:  # 跳过第一行
        continue
    t.append(table.row_values(i)[1:2][0])
    x.append(table.row_values(i)[2:3][0])
    y.append(table.row_values(i)[3:4][0])

#  a = np.random.uniform(0, 1, 2)
a = [20, 1]
y_forecost = np.zeros(len(x))
for i in range(len(x)):
    y_forecost[i] = a[0] + a[1] * x[i]
error = 0
alpha = 0.00001
y_forecost = np.array(y_forecost)
x = np.array(x)
J_cost0 = sum(y_forecost-x)
J_cost1 = sum((y_forecost-x) * x)
max_step = 100
for i in range(max_step):
    a[0] = a[0] - alpha * J_cost0 / len(x)
    a[1] = a[1] - alpha * J_cost1 / len(x)
x1 = np.linspace(1, 20, 20)
y1 = a[0] + a[1] * x1
plt.plot(x1, y1, "+-", label="改进后", color='b')
plt.scatter(t, x, s=50)
plt.show()


python_从excel表格中读取数据并且做数据拟合
效果差一点,因为要适当的选取学习因子,我试了很多,有效果很好的,没有贴图,知道拟合的好坏跟什么有关就行了。