mono.log(e)

旅とバイクとプログラミング

非線形連立方程式の解法

非線形連立方程式数値計算

非線形連立方程式数値計算を行うには一般的にニュートン法が用いられるそう。 具体的には、


\begin{align}
f_1(x_1, x_2, \cdots, x_n) &= 0\\\
f_1(x_1, x_2, \cdots, x_n) &= 0\\\
&\cdots\\\
f_n(x_1, x_2, \cdots, x_n) &= 0
\end{align}

のような非線形連立方程式の解x = (x_1, x_2, \cdots, x_n)を求める。

このとき方程式を


\begin{align}
f(x) = 0
\end{align}

とまとめ、この方程式に対するニュートン法の漸化式は以下のようになる。


\begin{align}
x^{(n+1)} &= x^{(n)}+\delta x\\\
&= x^{(n)}-J(x^{(n)})^{-1}f(x^{(n)})
\end{align}

ここでJ(x)はヤコビ行列である。 したがって


\begin{align}
\delta x = -J^{-1}f(x^{(n)})
\end{align}

としてヤコビ行列の逆行列から更新後のx^{(n+1)}が求まるが、数値計算上は


\begin{align}
J\delta x = -f(x^{(n)})
\end{align}

としてガウスの消去法を用いて求解するのが通常のようである。このときの注意としては、ニュートン法の特性により、初期値は求めたい解の近傍に取る必要がある。(多分)

以上を実際にpythonを用いて実行してみるが、scipy にライブラリがあるのでこれを利用してみる。

Scipy.optimize.root

以下使ってみた結果。

gist28808d39e6a1649f14db1d28489c9e6c

参考

org-technology.com

qiita.com

【python】スクレイピングでエロ動画のタグを集めてみた

pythonを始めてから、気が向いたときに軽く調べてjupyter notebookを触る、というサイクルを経ることはや数年。本腰をいれて勉強したいと思いたち、今流行りのオンライン学習に手を出してみたので備忘録も兼ねてちょっと報告してみる。ついでにブログデビューもしてみる。

目次

Udemyで購入したコース

セールのときに以下のコースを1,400円で購入した。なかなかボリュームがあるので、ひたすら写経するだけでも結構一苦労。一週間かけて、仕事終わりに近くのエクセルシオールカフェで一通り学習した。目的のWebスクレイピング講座自体は付録にある。

今回は学んだことをもとに簡単なコードを書いてみたので、備忘録兼ねてアウトプットしてみる。

www.udemy.com

実装

目的:タグを自動で集める

本題であるが、学んだスクレイピングで何かがしたい。シンプルにニュース記事をスクレイピングするのでも良かったが、ここは一つ、いつもお世話になっているサイトに再びお世話になることにした。無論、真面目な理由である。

さて書いてみたコードであるが、試行錯誤の末、以下の形に落ち着いた。プログラミングは初心者レベルなので、汚いコードであることはご容赦いただきたい。

もっと良くかけるよ!というのがあればぜひ教えてほしい。

df = pd.DataFrame()
tag_list = {}
for data in np.arange(220000,225780):
    url1 = "https://masutabe.info/video/" + str(data) + "/"
    #print(url1)
    result1 = requests.get(url1)
    c1 = result1.content
    soup1 = BeautifulSoup(c1)
    summary1 = soup1.find("ul", {"class":"tag_list"})
    #if summary.find("a") != None:
    tag_list[data] = []
    if summary1 != None:
        tags1 = summary1.find_all("a")
        for i in tags1:
            #print(i.string)
            tag_list[data].append(i.string)
    else:
        pass
        #print("urlが見つかりません")
    df = df.append(pd.DataFrame(tag_list[data]))
print("完了しました。")

1サイクル回すのに、体感1秒程度かかるので、np.arrange(220000, 225780)とあるように約5,000ページ分のタグを収集してみた。

得られたdfを以下のコードで修正。

df_r = df.reset_index(drop=True)
stat = pd.DataFrame(df_r[0].value_counts())
stat_r = stat.reset_index()
stat_r.columns = ["tag", "counts"]
stat_r

結果はこんな感じ。

f:id:yo-cchans3:20190323115628p:plain:w300

モロが一番タグ付けされていると思っていたから、この結果は少し意外だった。サンプル数が5,000程度であるものの、動画主の好みがわかる。

まとめ

20行そこそこのコードだが、今まで学習してきたpythonの文法を思い出したり、いろいろ調べたりと、思いの外時間がかかった。Udemyの動画を写経する → なにかアウトプットしてみる、というサイクルはプログラミングを学ぶ上で、とても勉強になった。今後も、少しづつできることを増やしていきたいと思う。

Udemyは月イチぐらいで90%オフセールを行っているので、そのタイミングで気になっているコースを購入するのがおすすめ。

www.udemy.com