質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1077閲覧

Excelのグラフが描く三次近似式を表現したい!!

NS78

総合スコア11

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/25 05:02

解決したいこと

Excelのグラフで算出される三次近似式と同等の結果を算出したいです。これまでPythonのnumpyやR言語のライブラリで算出してみたのですが、データのコンディションの問題等でエラーで返されてしまい、上手く算出できませんでした。

Pythonの方では二次近似ではExcelのグラフとほぼ同等の結果を得ることができたのですが、三次近似式になると上手く算出できませんでした。

同じくPythonのnumpyにて下記のような行列計算を行い、三次近似式の最小二乗法を行ってみたのですが、上手く算出できず。整数部が同じ値なので、小数部のみで計算を行ってみても上手く算出できずでした。

イメージ説明

該当するソースコード

Python

1from django.shortcuts import render 2from django.http import HttpResponse 3from django.db.models import Max 4from io import TextIOWrapper, BytesIO 5import csv, base64, math, logging 6import pandas as pd, numpy as np, matplotlib.pyplot as plt, japanize_matplotlib 7from sklearn.metrics import r2_score 8from statistics import mean 9import warnings 10import scipy as sp 11from scipy import optimize 12import math 13from scipy import interpolate 14import decimal 15# warnings.simplefilter('ignore', np.RankWarning) 16 17""" 18検証 19""" 20pd.options.display.float_format = '{:.30f}'.format 21np.set_printoptions(suppress=True) 22 23a = [34.786724,34.786701,34.786678,34.786656,34.786633,34.786611,34.786588,34.786566,34.786543,34.786521,34.786498,34.786476,34.786453,34.78643,34.786408,34.786387,34.786365,34.786344,34.786323,34.786306,34.786289,34.786272,34.786255,34.786238,34.786221,34.786207,34.786196,34.786185,34.786174,34.786163,34.786151,34.78614,34.786129,34.786123,34.786117,34.786111,34.786105] 24b = [133.875015,133.874911,133.874807,133.874704,133.874600,133.874496,133.874392,133.874288,133.874184,133.874080,133.873976,133.873872,133.873768,133.873664,133.873560,133.873455,133.873351,133.873246,133.873142,133.873037,133.872931,133.872826,133.872720,133.872614,133.872509,133.872403,133.872296,133.872190,133.872083,133.871977,133.871870,133.871763,133.871657,133.871550,133.871443,133.871336,133.871229] 25 26""" 27二次近似(polyfit) 28""" 29print("\n>>>>>>>>>>polyfitによる回帰分析") 30p_1 = np.polyfit(a, b, 2) 31p_2 = np.polyfit(b, a, 2) 32print("3次近似式係数(経度/緯度) : %s"%(p_1)) 33print("3次近似式係数(緯度/経度) : %s"%(p_2)) 34 35yfit_1 = np.polyval(p_1, a) 36r2_1 = r2_score(b, yfit_1) 37r2_1 = round(r2_1, 5) 38print("決定係数(経度/緯度) : %s"%(r2_1)) 39 40yfit_2 = np.polyval(p_2, b) 41r2_2 = r2_score(a, yfit_2) 42r2_2 = round(r2_2, 5) 43print("決定係数(緯度/経度) : %s"%(r2_2)) 44 45""" 46三次近似(polyfit) 47""" 48print("\n>>>>>>>>>>polyfitによる回帰分析") 49p_1 = np.polyfit(a, b, 3) 50p_2 = np.polyfit(b, a, 3) 51print("3次近似式係数(経度/緯度) : %s"%(p_1)) 52print("3次近似式係数(緯度/経度) : %s"%(p_2)) 53 54yfit_1 = np.polyval(p_1, a) 55r2_1 = r2_score(b, yfit_1) 56r2_1 = round(r2_1, 5) 57print("決定係数(経度/緯度) : %s"%(r2_1)) 58 59yfit_2 = np.polyval(p_2, b) 60r2_2 = r2_score(a, yfit_2) 61r2_2 = round(r2_2, 5) 62print("決定係数(緯度/経度) : %s"%(r2_2)) 63 64""" 65三次近似(curve_fit) 66""" 67def func(x, a, b, c, d): 68 return a * pow(x, 3) + b * pow(x, 2) + c * x + d 69 70print("\n>>>>>>>>>>curve_fitによる回帰分析") 71# 近似式の作成 72popt_1, pcov_1 = optimize.curve_fit(func, a, b) 73popt_2, pcov_2 = optimize.curve_fit(func, b, a) 74print("3次近似式係数(経度/緯度) : %s"%(popt_1)) 75print("3次近似式係数(緯度/経度) : %s"%(popt_2)) 76 77df_a = pd.DataFrame(a) 78df_b = pd.DataFrame(b) 79 80r2_5 = r2_score(df_b[0], func(df_a[0], *popt_1)) 81r2_5 = round(r2_5, 5) 82print("決定係数(経度/緯度) : %s"%(r2_5)) 83 84r2_6 = r2_score(df_a[0], func(df_b[0], *popt_2)) 85r2_6 = round(r2_6, 5) 86print("決定係数(緯度/経度) : %s"%(r2_6))

上記の結果

Python

1>>>>>>>>>>polyfitによる回帰分析 23次近似式係数(経度/緯度) : [ -4910.5526179 341646.57037832 -5942291.96429974] 33次近似式係数(緯度/経度) : [ 25.91131111 -6937.48621553 464394.87552564] 4決定係数(経度/緯度) : 0.99421 5決定係数(緯度/経度) : 0.9989 6 7>>>>>>>>>>polyfitによる回帰分析 8C:\Users\nishi\anaconda3\lib\runpy.py:87: RankWarning: Polyfit may be poorly conditioned 9 exec(code, run_globals) 10C:\Users\nishi\anaconda3\lib\runpy.py:87: RankWarning: Polyfit may be poorly conditioned 11 exec(code, run_globals) 123次近似式係数(経度/緯度) : [ -70.58284125 2455.38573984 85413.15287949 -2971158.21083739] 133次近似式係数(緯度/経度) : [ 0.09677439 -12.95517485 -1734.30636101 232206.14080975] 14決定係数(経度/緯度) : 0.99421 15決定係数(緯度/経度) : 0.9989 16 17>>>>>>>>>>curve_fitによる回帰分析 183次近似式係数(経度/緯度) : [ 0.081146 -3.83261409 -22.20142109 2128.17822341] 193次近似式係数(緯度/経度) : [ -0.00623885 1.24087537 3.36861239 -7686.44757283] 20決定係数(経度/緯度) : 0.97607 21決定係数(緯度/経度) : 0.97383

###Excelグラフの算出結果
下記がExcelの算出結果です。下のグラフの方が二次近似式で表現されており、値は"y = -4,910.5671997070 x2 + 341,647.5848742150 x - 5,942,309.6096078100"と、Pythonのpolyfitの二次近似で算出した値とほぼ同等の結果が得られますが、上のグラフの方の三次近似式で表現したグラフの近似式は同等の結果を得られません。Excelの三次近似式の値は”y = 15,771,219.9687500000 x3 - 1,645,876,935.7577200000 x2 + 57,254,308,654.6703000000 x - 663,892,459,167.0570000000”です。

Excelのグラフの結果

Ptyhon(numpy)で発生している問題・エラー

また、polyfitで三次近似式を算出すると下記のようなエラーが表示されてしまいます。データのコンディションが不適切だとされてしまいます。

RankWarning: Polyfit may be poorly conditioned exec(code, run_globals)

何とかExcelのグラフの三次近似式と同等の結果を得られるようにしたく、皆様のお知恵をお借りしたいです。お忙しいところ申し訳ありませんが何卒宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python

1from numpy.polynomial import Polynomial as P 2p3 = P.fit(a, b, 3) 3print(p3.convert().coef[::-1]) 4print(r2_score(b, p3(np.array(a)))) 5 6aa = np.linspace(np.min(a), np.max(a), 100) 7plt.scatter(a, b) 8plt.plot(aa, p3(aa), 'r-') 9plt.show()

投稿2021/05/25 06:53

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NS78

2021/05/25 07:20

ご回答、誠にありがとうございます。 おぉ! 回答いただいたコードで上手くいきました! 自分なりに色々本も読んで調べたつもりだったのですが、このような関数がnumpyにあったとは知らず、長い間迷走しておりました。 jbpb0様、本当に助かりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問