主頁 > 知識庫 > Python實現(xiàn)曲線擬合的最小二乘法

Python實現(xiàn)曲線擬合的最小二乘法

熱門標簽:申請辦個400電話號碼 柳州正規(guī)電銷機器人收費 千呼ai電話機器人免費 騰訊地圖標注有什么版本 鎮(zhèn)江人工外呼系統(tǒng)供應(yīng)商 外呼系統(tǒng)前面有錄音播放嗎 高德地圖標注字母 深圳網(wǎng)絡(luò)外呼系統(tǒng)代理商 400電話辦理費用收費

本文實例為大家分享了Python曲線擬合的最小二乘法,供大家參考,具體內(nèi)容如下

模塊導(dǎo)入

import numpy as np
import gaosi as gs

代碼

"""
本函數(shù)通過創(chuàng)建增廣矩陣,并調(diào)用高斯列主元消去法模塊進行求解。

"""
import numpy as np
import gaosi as gs

shape = int(input('請輸入擬合函數(shù)的次數(shù):'))

x = np.array([0.6,1.3,1.64,1.8,2.1,2.3,2.44])
y = np.array([7.05,12.2,14.4,15.2,17.4,19.6,20.2])
data = []
for i in range(shape*2+1):
 if i != 0:
 data.append(np.sum(x**i))
 else:
 data.append(len(x))
b = []
for i in range(shape+1):
 if i != 0:
 b.append(np.sum(y*x**i))
 else:
 b.append(np.sum(y))
b = np.array(b).reshape(shape+1,1)
n = np.zeros([shape+1,shape+1])
for i in range(shape+1):
 for j in range(shape+1):
 n[i][j] = data[i+j]
result = gs.Handle(n,b)
if not result:
 print('增廣矩陣求解失??!')
 exit()
fun='f(x) = '
for i in range(len(result)):
 if type(result[i]) == type(''):
 print('存在自由變量!')
 fun = fun + str(result[i])
 elif i == 0:
 fun = fun + '{:.3f}'.format(result[i])
 else:
 fun = fun + '+{0:.3f}*x^{1}'.format(result[i],i)
print('求得{0}次擬合函數(shù)為:'.format(shape))
print(fun)

高斯模塊

# 導(dǎo)入 numpy 模塊
import numpy as np


# 行交換
def swap_row(matrix, i, j):
 m, n = matrix.shape
 if i >= m or j >= m:
 print('錯誤! : 行交換超出范圍 ...')
 else:
 matrix[i],matrix[j] = matrix[j].copy(),matrix[i].copy()
 return matrix


# 變成階梯矩陣
def matrix_change(matrix):
 m, n = matrix.shape
 main_factor = []
 main_col = main_row = 0
 while main_row  m and main_col  n:
 # 選擇進行下一次主元查找的列
 main_row = len(main_factor)
 # 尋找列中非零的元素
 not_zeros = np.where(abs(matrix[main_row:,main_col]) > 0)[0]
 # 如果該列向下全部數(shù)據(jù)為零,則直接跳過列
 if len(not_zeros) == 0:
 main_col += 1
 continue
 else:
 # 將主元列號保存在列表中
 main_factor.append(main_col)
 # 將第一個非零行交換至最前
 if not_zeros[0] != [0]:
 matrix = swap_row(matrix,main_row,main_row+not_zeros[0])
 # 將該列主元下方所有元素變?yōu)榱?
 if main_row  m-1:
 for k in range(main_row+1,m):
 a = float(matrix[k, main_col] / matrix[main_row, main_col])
 matrix[k] = matrix[k] - matrix[main_row] * matrix[k, main_col] / matrix[main_row, main_col]
 main_col += 1
 return matrix,main_factor


# 回代求解
def back_solve(matrix, main_factor):
 # 判斷是否有解
 if len(main_factor) == 0:
 print('主元錯誤,無主元! ...')
 return None
 m, n = matrix.shape
 if main_factor[-1] == n - 1:
 print('無解! ...')
 return None
 # 把所有的主元元素上方的元素變成0
 for i in range(len(main_factor) - 1, -1, -1):
 factor = matrix[i, main_factor[i]]
 matrix[i] = matrix[i] / float(factor)
 for j in range(i):
 times = matrix[j, main_factor[i]]
 matrix[j] = matrix[j] - float(times) * matrix[i]
 # 先看看結(jié)果對不對
 return matrix


# 結(jié)果打印
def print_result(matrix, main_factor):
 if matrix is None:
 print('階梯矩陣為空! ...')
 return None
 m, n = matrix.shape
 result = [''] * (n - 1)
 main_factor = list(main_factor)
 for i in range(n - 1):
 # 如果不是主元列,則為自由變量
 if i not in main_factor:
 result[i] = '(free var)'
 # 否則是主元變量,從對應(yīng)的行,將主元變量表示成非主元變量的線性組合
 else:
 # row_of_main表示該主元所在的行
 row_of_main = main_factor.index(i)
 result[i] = matrix[row_of_main, -1]
 return result


# 得到簡化的階梯矩陣和主元列
def Handle(matrix_a, matrix_b):
 # 拼接成增廣矩陣
 matrix_01 = np.hstack([matrix_a, matrix_b])
 matrix_01, main_factor = matrix_change(matrix_01)
 matrix_01 = back_solve(matrix_01, main_factor)
 result = print_result(matrix_01, main_factor)
 return result


if __name__ == '__main__':
 a = np.array([[2, 1, 1], [3, 1, 2], [1, 2, 2]],dtype=float)
 b = np.array([[4],[6],[5]],dtype=float)
 a = Handle(a, b)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • python中最小二乘法詳細講解
  • 最小二乘法及其python實現(xiàn)詳解
  • python實現(xiàn)最小二乘法線性擬合
  • Python最小二乘法矩陣
  • Python 普通最小二乘法(OLS)進行多項式擬合的方法
  • Python基于最小二乘法實現(xiàn)曲線擬合示例
  • Python中實現(xiàn)最小二乘法思路及實現(xiàn)代碼
  • python中matplotlib實現(xiàn)最小二乘法擬合的過程詳解
  • 利用Python實現(xiàn)最小二乘法與梯度下降算法

標簽:大慶 郴州 烏蘭察布 哈爾濱 平頂山 海南 合肥 烏蘭察布

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Python實現(xiàn)曲線擬合的最小二乘法》,本文關(guān)鍵詞  Python,實現(xiàn),曲線,擬合,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python實現(xiàn)曲線擬合的最小二乘法》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python實現(xiàn)曲線擬合的最小二乘法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章