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

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

ただいまの
回答率

88.60%

サンプルコードをどう適応していいかわかりません

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 98

kikuchiX

score 8

前提・実現したいこと

参考にしているコードの「#最小二乗法の式を解いて係数を得る」箇所が何をしているのかわかりません。
自分の持っているコードに適応する場合には、どう書いたらいいのでしょか?

参考にしているコード

# 必要なライブラリのインポート
import numpy                as     np
import matplotlib.pyplot    as     plt
from   sklearn.linear_model import LinearRegression
# 観測点の生成(等間隔のxに対して、ノイズを乗っけたyを生成)
np.random.seed(0)
x        = (np.arange(51) / 50)[:, np.newaxis]
noise    = (np.random.rand(51) / 3)[:, np.newaxis]
y        = (x * 2) + noise
y[30:38] = 3.25

# 最小二乗法の式を解いて係数を得る
x_       = np.concatenate([x, np.ones(np.shape(x))], axis=1)
w        = np.dot(np.linalg.inv(np.dot(x_.T, x_)), np.dot(x_.T, y))
y_hat_   = np.dot(x_, w)

手元にあるコード

# 実験値
x = np.array([6.26379, 8.57417, 8.66527, 8.75069, 11.6708, 12.3487, 14.5032, 15.7422, 21.7646, 23.0518, 26.5069, 26.4035, 26.321, 23.0045, 19.2654, 17.9425, 14.5669, 13.513, 10.4902, 9.95136, 9.77395])
y = np.array([3.709910308, 3.300454417, 3.219869361, 2.879991517, 2.250120678, 2.24981186, 1.859931899, 1.839996231, 1.560029151, 1.360016958, 1.210037387, 1.527926405, 1.320005022, 1.340038138, 1.618120234, 1.410033737, 1.83006856, 1.849465938, 2.141939621, 2.219958336, 2.494675074])  

# 係数見つけたい関数
def func(x, a):
    return ((-(a+(b*x))) + ((a+((b*x)**2)) - (4*b*math.log(0.1)))**0.5) / (2*b)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2020/11/22 11:35

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

checkベストアンサー

0

結局やりたいことは最小二乗法にて非線形関数の係数を求めることではないでしょうか。
であればscipy.optimize.curve_fitでできます。
参考:Pythonで非線形関数モデリング

import numpy as np
import math
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# 実験値
x = np.array([6.26379, 8.57417, 8.66527, 8.75069, 11.6708, 12.3487, 14.5032, 15.7422, 21.7646, 23.0518, 26.5069, 26.4035, 26.321, 23.0045, 19.2654, 17.9425, 14.5669, 13.513, 10.4902, 9.95136, 9.77395])
y = np.array([3.709910308, 3.300454417, 3.219869361, 2.879991517, 2.250120678, 2.24981186, 1.859931899, 1.839996231, 1.560029151, 1.360016958, 1.210037387, 1.527926405, 1.320005022, 1.340038138, 1.618120234, 1.410033737, 1.83006856, 1.849465938, 2.141939621, 2.219958336, 2.494675074])  

# 係数見つけたい関数
def func(x, a, b):
    return ((-(a+(b*x))) + ((a+((b*x)**2)) - (4*b*math.log(0.1)))**0.5) / (2*b)

param, cov = curve_fit(func, x, y)
print(f'a={param[0]},b={param[1]}')
# a=-0.0026459965628733576,b=0.07059577892650028

# 実験値
plt.scatter(x,y)

# 関数値
xs = np.linspace( min(x), max(x), 100)
plt.plot(xs,func(xs, param[0], param[1]), color='red')

plt.show()


イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/11/22 11:51

    ありがとうございます。
    #関数値のxs = np.linspace( min(x), max(x), 100)は何をしているのでしょうか?

    キャンセル

  • 2020/11/22 11:53

    グラフを書くために、xの最小から最大までの等間隔の100個の値を得ています。
    詳しくはnumpy.linspaceで調べてみてください。

    キャンセル

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

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る