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

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

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

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

Q&A

1回答

1084閲覧

【Python】2次関数に対するBiweight推定法のやり方がわかりません

shirataki_udon

総合スコア0

Python

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

0グッド

0クリップ

投稿2022/05/02 04:08

編集2022/05/02 06:53

Pythonについての質問です。
学校の課題で、2つのデータx,yの近似曲線、f(x)=a+b/x+c/(x^2)のa,b,cの値を最小二乗法とBiweight推定法(重さを追加して外れ値の影響を少なくする手法)を用いて求めるプログラムをかく課題が出されました。(x,yのデータはエクセルに用意されている)

そこで、最小二乗法でデータに沿った曲線をひくことはできたのですが、そこから重さを入れて計算をする方法がわかりません。
イメージとしては以下のサイトのような計算を2次関数でa,b,cの3つの変数を使ってやりたいと思っています。
URL:https://qiita.com/nn_tok/items/95a3baccacc492972fd4

自分なりにBiweight推定法について調べてみましたが、ネットにある記事だと1次関数を取り扱っているものしかなく、f(x)のような2次関数のものについてはどうしたらいいのかわからず、手詰まり状態です。

分かる方がいらっしゃいましたら、何卒お教えください。
※投稿主はPython初心者のため、できればわかりやすく説明していただけると助かります。

**現在のコード
**
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statistics as st

df = pd.read_excel("○○○.xlsx", sheet_name = "○○○", skiprows=9,usecols="B:C")
print(df)

#シートの最終行を取得
Sheet_Max = len(df)

#配列宣言
x_1 = df["xi"].to_list()

y_1 = df["yi"].to_list()

x = np.array(x_1)
y = np.array(y_1)

coe = np.polyfit(x,y,2)
z2 = np.poly1d(coe)(x)
print(coe)

print(coe[0])

plt.scatter(x, y, color="k")
plt.plot(x,z2)
plt.show()

**表示結果
**イメージ説明

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

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

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

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

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

fana

2022/05/02 06:17

> ※投稿主はPython初心者のため そんなことは「Biweight推定法ってどうすればいいの?」という話には関係なくないですか? 質問文から,最小二乗法の方に関してはできたのだと推測します. その最小二乗評価関数はどうなりましたか? Σ(「誤差」の2乗) という形にしたハズですが,この【「誤差」の2乗】値を評価するのが「最小二乗」ですよね. で,2乗ではない別の関数で評価するのがM推定法と呼ばれる方法であって,M推定の中で特定の関数を使う物を Biweight と呼ぶ,という話でしょうから,「誤差」をその(Biweightなる)関数で用いればよいだけの話ではないでしょうか.
guest

回答1

0

最小二乗法のロバスト推定についてまとめた
の、「最小二乗法」のa, bを求める式と、「ロバスト推定」のa', b'を求める式を見比べてください
違いは、「ロバスト推定」の式の方に「重みWi」が追加されてるだけですよね

 
【最小二乗法】二次関数/三次関数でフィッティング
の、「二次関数でフィッティング」の「Lを最小にする計算」のa, b, cを求める式を見てください
この式に、一次関数での「ロバスト推定」のa', b'を求める式と同様に、「重みWi」を追加します

また、「重みWi」の更新に使う、点と近似直線との誤差の計算は、当然二次関数で計算します

 
TukeyのBiweight推定法を使って画像中の点群から直線推定
の「ソース(python)」からの、主な変更点は下記の通りです

python

1 A = np.zeros((2,2)) 2 b = np.zeros((2)) 3 A[0,0] = np.sum(weight * x * x) 4 A[1,0] = np.sum(weight * x) 5 A[0,1] = A[1,0] 6 A[1,1] = np.sum(weight) 7 b[0] = np.sum(weight * x * y) 8 b[1] = np.sum(weight * y)

↓ 変更

python

1 A = np.zeros((3,3)) 2 b = np.zeros((3)) 3 A[0,0] = np.sum(weight * x * x * x * x) 4 A[1,0] = np.sum(weight * x * x * x) 5 A[0,1] = A[1,0] 6 A[2,0] = np.sum(weight * x * x) 7 A[1,1] = A[2,0] 8 A[0,2] = A[2,0] 9 A[2,1] = np.sum(weight * x) 10 A[1,2] = A[2,1] 11 A[2,2] = np.sum(weight) 12 b[0] = np.sum(weight * x * x * y) 13 b[1] = np.sum(weight * x * y) 14 b[2] = np.sum(weight * y)

 

python

1 dif = np.abs(y - (coef[0] * x + coef[1]))

↓ 変更

python

1 dif = np.abs(y - (coef[0] * x * x + coef[1] * x + coef[2]))

投稿2022/05/09 12:06

編集2022/05/09 12:18
jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問