前提・実現したいこと
以下のサイトのサイプルコードを変えながら、最小二乗法を実施しようとしております。
https://medium.com/micin-developers/decipher-github-lr-sw-40e519a13c0a
サンプルコード
# 必要なライブラリのインポート 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 # -------------------------------------------------- # scikit-learnのsolverによって、近似直線を得る clf = LinearRegression(fit_intercept=True) clf.fit(X=x, y=y) y_hat = clf.predict(x) # -------------------------------------------------- # 最小二乗法の式を解いて、近似直線式の係数を得る 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、yと学習によって得た近似直線を描画する cmap = plt.get_cmap("tab10") plt.figure(figsize=(12,16), dpi=100) plt.subplot(2, 1, 1) plt.grid(which='major', color=[0.7, 0.7, 0.7], linestyle='-') plt.scatter(x, y, s=300, alpha=0.7, color=cmap(0), label='観測点') plt.plot(x, y_hat, linewidth=10, alpha=0.7, color=cmap(1), label='近似曲線 by scikit-learn') plt.plot(x, y_hat_, linewidth=8, alpha=0.3, color=cmap(2), label='近似曲線 by 最小二乗法', linestyle='--') plt.legend(fontsize=15, loc='lower right') plt.ylim([0, 3.5]) print('scikit-learnで解いたweight = [%.3f, %.3f]' % (clf.coef_, clf.intercept_)) print('最小二乗法で解いたweight = [%.3f, %.3f]' % (w[0], w[1])) plt.show()
変更したコード
サンプルコードの観測点の部分を、実験値に置き換えただけです。
# 必要なライブラリのインポート import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression # 測定値 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]) # -------------------------------------------------- # scikit-learnのsolverによって、近似直線を得る clf = LinearRegression(fit_intercept=True) clf.fit(X=x, y=y) y_hat = clf.predict(x) # -------------------------------------------------- # 最小二乗法の式を解いて、近似直線式の係数を得る 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、yと学習によって得た近似直線を描画する cmap = plt.get_cmap("tab10") plt.figure(figsize=(12,16), dpi=100) plt.subplot(2, 1, 1) plt.grid(which='major', color=[0.7, 0.7, 0.7], linestyle='-') plt.scatter(x, y, s=300, alpha=0.7, color=cmap(0), label='測定値') plt.plot(x, y_hat, linewidth=10, alpha=0.7, color=cmap(1), label='近似曲線 by scikit-learn') plt.plot(x, y_hat_, linewidth=8, alpha=0.3, color=cmap(2), label='近似曲線 by 最小二乗法', linestyle='--') plt.legend(fontsize=15, loc='lower right') plt.ylim([0, 3.5]) print('scikit-learnで解いたweight = [%.3f, %.3f]' % (clf.coef_, clf.intercept_)) print('最小二乗法で解いたweight = [%.3f, %.3f]' % (w[0], w[1])) plt.show()
このコードを実行すると以下のようなエラ〜メッセージが出てしまいます。
エラー
Expected 2D array, got 1D array instead: 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]. Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
この場合、どのようにコードを改変するべきなのでしょうか?
ご教授いただけると幸いです。
何卒宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/21 06:54
2020/11/21 06:57
2020/11/21 06:59
2020/11/21 07:32
2020/11/22 00:36
2020/11/22 00:50
2020/11/22 01:00
2020/11/22 11:09
2020/11/22 11:19