Python实现线性函数的拟合算法⽂章⽬录
关于Python数据分析在数学建模中的更多相关应⽤:
(⼀)、读取数据
#从excel⽂件中读取数据
def read(file):
wb = xlrd.open_workbook(filename=file)#打开⽂件
sheet = wb.sheet_by_index(0)#通过索引获取表格
rows = ws # 获取⾏数
all_content =[]#存放读取的数据
for j in range(0,2):#取第1~第2列对的数据
temp =[]
for i in range(1,rows):
cell = ll_value(i, j)#获取数据
temp.append(cell)
all_content.append(temp)#按列添加到结果集中
temp =[]
return np.array(all_content)#返回读取的数据
(⼆)、获得拟合函数并绘制图象
#获得拟合函数并绘制图象
def temp1(datas):
x = datas[0]#获取⾃变量x
y = datas[1]#获取因变量y
n = np.size(answer1, axis =1)#获取有多少个⾃变量,axis=1代表获取矩阵的列数
#根据公式计算k
k =(n*np.sum(x*y)- np.sum(x)*np.sum(y))/(n*np.sum(np.power(x,2))- np.sum(x)* np.sum(x))
#根据公式计算b
b =(np.sum(np.power(x,2))* np.sum(y)-np.sum(x)* np.sum(x*y))/(n*np.sum(np.power(x,2))- np.sum(x)* np.sum(x))    las = k*x + b      #根据公式得到拟合函数
fig = plt.figure()#获得figure对象
ax1 = fig.add_subplot(1,1,1)#添加⼀个图纸
ax1.set_xlim([min(x)-0.5,max(x)+0.5])#设置x轴刻度
ax1.set_ylim([min(y)-0.5,max(y)+0.5])#设置y轴刻度
plt.plot(x,las,'k',label='拟合函数')#画出拟合函数
plt.plot(x,y,'o',label ='样本数据')#画出样本数据
ax1.legend(loc ='best')#设置图例的位置为最佳best
return[k,b]#返回k和b
(三)、通过计算拟合优度评价拟合函数
#通过计算拟合优度评价拟合函数
def judge(datas,k,b):
x = datas[0]#获取⾃变量x
y = datas[1]#获取⾃变量y
z = k * x + b  #得到拟合函数
SST = np.sum(np.power(y - np.average(y),2))#根据公式计算SST    SSE = np.sum(np.power(y - z,2))#根据公式计算SSE
SSR = np.sum(np.power(z - np.average(y),2))#根据公式计算SSR    R_2 = SSR / SST            #得到R_2
print('k = ',k)
print('b = ',b)
print('SST = ',SST)
print('SSE = ',SSE)
print('SSR = ',SSR)
print('R_2 = ',R_2)
(四)、综合代码
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 29 11:03:49 2019
@author: lenovo
"""
import xlrd
import numpy as np
import matplotlib.pyplot as plt
#从excel⽂件中读取数据
def read(file):
wb = xlrd.open_workbook(filename=file)#打开⽂件
sheet = wb.sheet_by_index(0)#通过索引获取表格
rows = ws # 获取⾏数
all_content =[]#存放读取的数据
for j in range(0,2):#取第1~第2列对的数据
temp =[]
for i in range(1,rows):
cell = ll_value(i, j)#获取数据
temp.append(cell)
all_content.append(temp)#按列添加到结果集中
temp =[]
return np.array(all_content)#返回读取的数据
#获得拟合函数并绘制图象
def temp1(datas):
x = datas[0]#获取⾃变量x
y = datas[1]#获取因变量y
n = np.size(answer1, axis =1)#获取有多少个⾃变量,axis=1代表获取矩阵的列数
#根据公式计算k
k =(n*np.sum(x*y)- np.sum(x)*np.sum(y))/(n*np.sum(np.power(x,2))- np.sum(x)* np.sum(x))
#根据公式计算b
b =(np.sum(np.power(x,2))* np.sum(y)-np.sum(x)* np.sum(x*y))/(n*np.sum(np.power(x,2))- np.sum(x)* np.sum(x))    las = k*x + b      #根据公式得到拟合函数
fig = plt.figure()#获得figure对象
ax1 = fig.add_subplot(1,1,1)#添加⼀个图纸
ax1.set_xlim([min(x)-0.5,max(x)+0.5])#设置x轴刻度
ax1.set_ylim([min(y)-0.5,max(y)+0.5])#设置y轴刻度
plt.plot(x,las,'k',label='拟合函数')#画出拟合函数
plt.plot(x,y,'o',label ='样本数据')#画出样本数据
ax1.legend(loc ='best')#设置图例的位置为最佳best
return[k,b]#返回k和b
#通过计算拟合优度评价拟合函数
def judge(datas,k,b):
x = datas[0]#获取⾃变量x
y = datas[1]#获取⾃变量y
z = k * x + b  #得到拟合函数
SST = np.sum(np.power(y - np.average(y),2))#根据公式计算SST
SSE = np.sum(np.power(y - z,2))#根据公式计算SSE
SSR = np.sum(np.power(z - np.average(y),2))#根据公式计算SSR
R_2 = SSR / SST            #得到R_2
print('k = ',k)
print('b = ',b)
print('SST = ',SST)
print('SSE = ',SSE)
print('SSR = ',SSR)
print('R_2 = ',R_2)
answer1 = read('C:\\Users\\lenovo\\Desktop\\数学建模\\拟合算法\\第4讲.拟合7.21\\代码和例题数据\\data1.xlsx')
answer2 = temp1(answer1)
judge(answer1,answer2[0],answer2[1])
(五)、结果输出
用subplot函数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。