algorithm-in-python/math/numericalAnalysis/least_square.py

110 lines
2.8 KiB
Python
Raw Normal View History

2018-10-02 21:24:06 +08:00
''' mbinary
#########################################################################
# File : least_square.py
# Author: mbinary
# Mail: zhuheqin1@gmail.com
2019-01-31 12:09:46 +08:00
# Blog: https://mbinary.xyz
2018-10-02 21:24:06 +08:00
# Github: https://github.com/mbinary
# Created Time: 2018-10-02 21:14
# Description:
#########################################################################
'''
'''*************************************************************************
> File Name: least-square.py
> Author: mbinary
> Mail: zhuheqin1@gmail.com
> Created Time: Sat 07 Apr 2018 09:55:25 PM DST
2019-01-31 12:09:46 +08:00
> Blog: https://mbinary.xyz
2018-10-02 21:24:06 +08:00
> Description: 最小二乘法解线性方程组, 解矛盾方程组
************************************************************************'''
2020-04-15 12:28:20 +08:00
import re
import numpy as np
def solveConflitEqualtion(A, y):
2018-10-02 21:24:06 +08:00
'''solve equation like this: Av = y,
A:m*n v:n*1 y:m*1
return vector v
'''
A = np.matrix(A)
y = np.array(y)
ata = A.T*A
print('AtA')
print(ata)
2020-04-15 12:28:20 +08:00
return np.linalg.solve(ata, A.T*y) # note that is numpy.linalg.solve
2018-10-02 21:24:06 +08:00
2020-04-15 12:28:20 +08:00
def solveLinear(point, index):
2018-10-02 21:24:06 +08:00
y = [[i[1]] for i in point]
x = [[i[0]] for i in point]
A = []
for i in x:
A.append([i[0]**j for j in index])
2020-04-15 12:28:20 +08:00
res = solveConflitEqualtion(A, y)
print('the solution is : \n', res)
2018-10-02 21:24:06 +08:00
print('namely: ')
2020-04-15 12:28:20 +08:00
items = ['{:.4f}x^{}'.format(res[i, 0], j) for i, j in enumerate(index)]
print('phi(x) = ', ' + '.join(items))
2018-10-02 21:24:06 +08:00
2020-04-15 12:28:20 +08:00
def handleInput(s=None, y=None):
2018-10-02 21:24:06 +08:00
# numPt = re.compile (r'\d*\.{0,1}\d+')
2020-04-15 12:28:20 +08:00
if not s:
s = input('input matrix A:m*n //m>=n\n')
s = s.replace(' ', '')
li = re.findall(r'(\[(\d+)(,(\d+))+\])', s)
li = [parseLst(i[0]) for i in li]
if not y:
y = input('input a vector y:n*1\n')
2018-10-02 21:24:06 +08:00
y = parseLst(y)
print('Equation: Av = y:')
2020-04-15 12:28:20 +08:00
2018-10-02 21:24:06 +08:00
print('y is as follows: ')
print(y)
print('A is as follows: ')
for i in li:
for j in i:
2020-04-15 12:28:20 +08:00
print('{}'.format(j).rjust(5), end='')
2018-10-02 21:24:06 +08:00
print('')
2020-04-15 12:28:20 +08:00
2018-10-02 21:24:06 +08:00
print('result v is as follows: ')
2020-04-15 12:28:20 +08:00
res = solveConflitEqualtion(li, y)
2018-10-02 21:24:06 +08:00
print(res)
2020-04-15 12:28:20 +08:00
2018-10-02 21:24:06 +08:00
def parseLst(s):
2020-04-15 12:28:20 +08:00
s = s.strip('[]')
2018-10-02 21:24:06 +08:00
li = s.split(',')
li = [float(j) for j in li]
return li
if __name__ == '__main__':
'''
li = '[[23,2],[2,5],[2,6]]'
y = '[1,3]'
while True:
handleInput(li,y)
s = input('input y to continue, n for exit')
if s!='y':break
'''
2020-04-15 12:28:20 +08:00
point = [(-3, 14.3), (-2, 8.3), (-1, 4.7), (2, -8.3), (4, -22.7)]
lst = [0, 3]
solveLinear(point, lst)
point = [(-3, 14.3), (-2, 8.3), (-1, 4.7), (2, 8.3), (4, 22.7)]
lst = [0, 2]
solveLinear(point, lst)
A = [[1, 2], [2, 1], [1, 1]]
y = [[5], [6], [4]]
res = solveConflitEqualtion(A, y)
2018-10-02 21:24:06 +08:00
print(res)
2020-04-15 12:28:20 +08:00
A = [[1, -2], [1, 5], [2, 1], [1, 1]]
y = [[1], [13.1], [7.9], [5.1]]
print(solveConflitEqualtion(A, y))