2023年9月25日月曜日

Pythonのプログラム1個が要求する多数ライブラリのバージョン依存関係の不整合のせいで研究の進まない学生を見てると、深層学習以外でPythonを使う理由が分からないのですが、実際どうなんでしょう?

https://jp.quora.com/Python%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A01%E5%80%8B%E3%81%8C%E8%A6%81%E6%B1%82%E3%81%99%E3%82%8B%E5%A4%9A%E6%95%B0%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8

並べ替え
 · 
フォロー

AI関連業務に従事していた頃、Pythonさわってましたが確かにライブラリの依存関係が面倒ですね。

ライブラリの依存関係ではまらないように、開発アプリごとに仮想環境を分けるのが良いらしいです。仮想環境の作る方法も色々あって、どれがベストなのかわかりませんが、僕はpyenv+venvつかってました。

Python深層学習の流行りからか、非常に色々なライブラリが活発に開発されています。

自分で全部ゴリゴリ書くより、ライブラリ使って手早く開発したい人にはよい言語だと思いますよ。

インタープリタなので、コンパイルせずに書いたコード動かせますし。

また人気があるので、開発に詰まったときネットで情報探しやすいなとも感じました。

Pythonが流行っているのを見ると、メリットがデメリットを上回ると判断している人が多いのではないでしょうか。

どんな選択にも、メリット・デメリットがあります。

目的・デメリット・メリット・優先順位を整理し、ベストがPython以外の言語なら、開発言語を変えればよいと思います。

 · 
フォロー

どうでしょう。私は統計処理とグラフ作成用にR言語使っていますが、ライブラリのバージョン依存性に起因する不具合は日常茶飯事です。いちいち整合をとる作業が馬鹿馬鹿しいので目的ごとに個別の環境をdockerで用意するようにしています。この点では、pythonと似たりよったりでしょう。

しかし、プログラムの書きやすさでは、圧倒的にpythonの方が楽ですよ。

私の場合、目的の計算処理に対応したライブラリがR版しか無い(ことが多い)ために仕方なくRをメインで使っていますが、そうした事情がないなら、python+pandasで行きたいところです。pythonは幅広い用途に卒なく対応できる使いやすいプログラミング言語だと思います。テキスト処理に限ってはperlに軍配が上がりますが。

 · 
フォロー

色々な理由が考えられると思いますが、個人的に最重要だと思われるのは以下の3点です。

  1. そもそも近年のプログラミング言語としては文法が平易で習得しやすい
  2. NumPy以下バックエンドがC / C++などの高速な言語で書かれている数値計算ライブラリが多く、それらを組み合わせることでスクリプト言語としてはかなり高速化できる
  3. 特に行列計算に関してはNumPyを経由して数値解析ライブラリのLAPACK APIを利用することができ、行列計算の塊である機械学習を扱う上で有利

1は近年のスクリプト言語なら大体当てはまりますが、2はPythonに特に当てはまるポイントだと思います。そして3が機械学習におけるPythonの優位性を決定づけた要因です。

ただし、この3要因はPythonの専売特許ではありませんので、他言語でも覇権を唱えることは可能でしょう。例えば高速化さえ成ればRも遜色ありませんし、Juliaは3つ全てを兼ね備えることからポストPythonの最有力候補と見る人も多いです。

広告
 · 
フォロー

言語自体のパフォーマンスは確かにGoの方が良い面があるかと思います。ただ、それが直接の理由でGoの方がご指摘の分野で優勢になる、という展開にはならないと私は考えています。

特にディープラーニングで顕著と理解しますが、機械学習の系統では行列計算含めてSIMD命令の類で高速化する処理を駆使する局面が多いと理解します。本当に高速に行うべきところはPythonであってもGoであっても、GPGPUや外部の専用回路に処理を移譲することになるはずで、その点でGo(というかCPUに基づいた処理全般)は「速く」はありません。CUDAへの対応、OpenCLへの対応、もしさらに複数マシンでの分散並列まで向かうならMPIへの対応の方がずっと大事ではないかなと思います。そのような領域ではPythonではなくC++で実装が書かれているはずです。機械学習でGo言語の特長(goroutineのようなスレッド内並列に関する言語組み込み機能等)が決定的に重要になるということもないように感じます。

データサイエンスやディープラーニングでPythonが現在よく使われているのは、言語自体というよりもその言語で使用できる関連する第三者ライブラリの量と質と、Pythonランタイム側の柔軟な対応に依っていると考えます。Pythonは古くから、今で言うPyData関連の機能についてはネイティブでのサポートに前向きと聞いたことがあります。下記のスライドをご参照ください

行列演算とPythonの言語デザイン

最近ではPython 3.5で@演算子が追加されましたが、numpyで頻出する行列積に対応するものと私は理解しています。

What’s New In Python 3.5

Pythonが機械学習専用ということもないのですが、一方で科学技術計算コミュニティと密接な関係を長期に構築してきた事実をGo言語が(その言語機能の素晴らしさだけから)短期に覆せると考えるのは早計に感じられます。Go言語は元々サーババックエンド等での利用を中心としてコンパクトに言語設計をまとめている印象で、Pythonの上記のような対応を真似して「機械学習」等に向けて言語仕様まで拡張するとは思われません。当該分野に特化したライブラリが成熟しておらず、ライブラリからの要望を吸い取る言語ポリシーでもないことから、そう簡単に入れ替えるライブラリが成長することはないのではないか、と感じる次第です。

より複雑な理由からPythonの代わりに他の言語が使われるようになるという可能性自体は、私もあり得ると考えます。ただし、Go言語が「簡単でパフォーマンスに優れている」からそうなる、という予想に対しては「否」と考えるのは以上のような理由によります。

広告
 · 
フォロー

A2Aありがとうございます。

回答編:

前提としてディープラーニングは機械学習の一部なので、機械学習をどのように学習すべきかについて回答します。パターンは2つ。

  • 開発してみたい機能がある場合は、それを実装してみて、一度、AI開発とは何かを理解することをオススメ
  • 開発してみたい機能がない場合は、機械学習のエンジニアが重宝している本を頭からやるのがオススメ

理由編:

(1)開発してみたい機能がある場合

AI開発ですでに開発したい機能やサービスがあり、機械学習の習得が目的化していない場合は、googleやamazonが提供している機械学習のAPIを利用し、機能実装するのがオススメです。

理由は、もうすでに、一端のエンジニアが予測モデルを作るよりも、精度の高い結果を返してくれる機械学習サービスが存在するので、特に自分でこの部分を作らなくても良いかなと思ってます。

例えば、googleのautoMLというサービスでは、データを入力すると様々な機械学習の手法で最適なものを探し、予測などを勝手にやってくれます。

以下のリンクで、サーバーサイドエンジニアの方がAutoML を使ったら、コンテストで良い結果が出たというケースもあり、かなり重宝できます。

AutoML Tablesを使ってKagglerを倒せなかった話 #atmaCup - atmaブログ

それでも、サービスを一度作ってみると、「与えるべきデータを何にするか」、「データ取得をどうするか」、「データ整形をどうするか」と色々課題が見えてきます。

その課題を一個ずつ、調べながらやると、AI開発の本質が見えてきて、自ずと身に付けることが見えてくると思います。

以下の本とかは、まさに、そのようなコンセプトなので、おすすめです。

独学プログラマーのためのAIアプリ開発がわかる本 | 河合 大 | コンピュータサイエンス |

(2)開発してみたい機能がない場合

そうではなく、エンジニアになりたいんだ!という場合を考えてみます。

それでも一回何かターゲットを決めて、(1)をやってみるのはおすすめですが、きちんと基礎を学びたいという場合は、それ用の本があるので、ご紹介します。

主に、以下の3つが機械学習の界隈では、重宝されている本になりまして、今回の場合は、ディープラーニングという言葉も出てきましたので、最初の本がフィットするのではないかと考えています。

少し高額ですが、確実な選択の本だと思います。

深層学習 (アスキードワンゴ) | 黒滝 紘生, 河野 慎, 味曽野 雅史, 保住 純, 野中 尚輝, 冨山 翔司, 角田 貴大, 岩澤 有祐, 鈴木 雅大, 中山 浩太郎, 松尾 豊 | 工学 | Kindleストア | Amazon

これは、深層学習まで専門的なことをこの一冊で学べるし、しかもそこを理解する上で、必要な数学的知識も順番に説明されています。

はじめてのパターン認識 | 平井 有三 |本 | 通販 | Amazon

はじパタの愛称で知られる、機械学習について書かれた定番の本です。

パターン認識と機械学習 上 - ベイズ理論による統計的予測

一度手にとってみてください。受け付けない方もいらっしゃいます。

広告
 · 
フォロー

必要なのはプログラミングは生活をちょっと便利にする道具だという考え方です。

資料はネットで調べればたくさんありますし、やる気があれば本を買ってください。ここではどんな本がいいかには言及しません。

知識は学びの中で少しずつ増やしていけばいいので初めから用意しておく必要はないです。

まだプログラムを経験したことがないのなら機械学習より先にPythonを使った生活をちょっと便利にする道具を作ってみることをお勧めします。

もちろんクオリティの高いものを作る必要はありません。あくまでちょっとでいいんです。

電卓やExcelをまとめるプログラム、Pdfから画像を取り出すプログラムなどから自分に関係ありそうなものを選んでネットや本を見ながら作ってみてください。

これはPythonの練習にもなりますし、プログラムは生活を便利にするためにあるという概念を理解することもできます。

この概念を理解しておけば何のために自分はプログラミングしてるんだろうという気持ちになることを避けられます。

上のプログラムを作ってある程度満足したら本格的に機械学習を始めてみてください。

 · 
フォロー

他回答のコメント欄をみました。基本的にコードは以下の流れになります。

訓練

  1. データの読み込み: csvならpandas, 画像ならopencvなどを使用
  2. データの前処理、加工: 引き続きpandas, opencvなどを使用するが、sklearnにもpreprocessingのためのモジュールがあり、必要ならば使用する
  3. sklearnなどを使用してでデータを訓練用とテスト用に分ける
  4. sklearn, pytorchなどを使用してモデルを組み立て、訓練データでモデルを訓練する
  5. テストデータでモデルを評価
  6. 性能の表示、モデルの保存(pickleなどで)

適用

  1. 訓練済みモデルの読み込み
  2. 対象データの読み込みと前処理
  3. 訓練済みモデルを対象データに適用
  4. 結果の出力

WebAPIなどの形で利用する場合は1は初めに一度だけ実行し、2–4をリクエストごとに行います。

 · 
フォロー

spaCyはわりと新しいツールですよね。

それまでは、pythonではNLTKが有名でした。

NLTKに当るツールはRubyにもいくつかあります。treatがそのひとつです。

spaCyはこれらのツールの出来ることを拡張した新世代のものです。自然言語処理や機械学習の分野ではPythonに一日の長がありRubyが最新のものにキャッチアップするのは難しいと思います。

先日、言語処理学会の年次大会が名古屋でありました。私も参加してきたのですが、殆どの方がPythonやC++で実装されていました。まずはこういった人たちにRubyを使ってもらわないと差は開く一方ですね。

そんな中Rubyを使っている人達も一部にはいました!

クックパッド、LeagalForceといった自然言語処理を必要としている企業(2社ともRubyKaigiのスポンサーもしています)です。ただし、自然言語処理のところはPythonで書かれているそうです。それらの企業でもRubyで自然言語処理ができたらということには興味はあるようです。

それと、名古屋大学の佐藤理史先生の研究室ではなんとRubyで自然言語処理をされているそうです。佐藤先生とも少し話をしましたがやはりRubyは手に馴染んでいてRubyで出来るということにとても価値を感じているようでした。

質問への回答としては、自然言語処理に使う人が少ないからということになりそうですが、今後もそうとは限りません。特に日本語の自然言語処理においては。

広告
 · 
フォロー

機械学習は、データサイエンスをベースにしていますが、データサイエンスをやっている人はデータサイエンティストと呼ばれています。名前のとおり科学者であって、プログラマーやソフトウェア開発者とは、文化が大きく違います。Python の中でも、データサイエンス系の人は、Anaconda という環境を使うことが多く、Web等を開発をしている人とはかなり文化が違い、データサイエンスをやっている人が自分たちで開発した環境です。

データサイエンスをやっている人が使っている言語は、Python, R, Matlab のいずれかが多いです。試行錯誤が多いので、いずれもスクリプト言語です。また、処理の高速化のため行列演算ができて、それらのライブラリーはC/C++で書かれているというのも同じです。

機械学習になってくると、処理の高速化のため GPU を使用する必要がありますが、現在 GPU 用のライブラリーが整備されているのは Python だけなので、Python の独壇場となっています。

これから機械学習等の分野で使われる新たな言語の候補としては、Julia がありますが、必要なライブラリーの整備ができるかというとほぼ絶望的だと思います。プログラム言語は、使う人が増えるとライブラリーが開発され、ライブラリーが開発されると開発者が増えため、普及した言語はますます普及するという相乗効果があります。マイナーな言語はその逆になるので、差を縮めるの難しいです。

日本の業務系プログラマーには Python が嫌いな人が多いですが、Python を使っている人は Python が好きな人が多いです。Stack Overflow Survey 2019 では、Python を使っている人の 73.1%が Loved と回答しています。それは、Rust に次いで2番目に高いです。

Stack Overflow Developer Survey 2019

広告

今後の期待も込めて、Juliaと言っておきましょう。つい先週に、Julia v1.0がでたところです。

Juliaは、素直でキレイな文法(多重ディスパッチやブロードキャスト構文など)、高速な実行速度など、科学技術系の計算には、とても向いている言語です。

さらに、GPUでの実行(CUDAだけではなくOpenCLも)も簡単にできるので、機械学習(とくに深層学習)にも向いています。Flux.jlKnet.jl等の深層学習向けのライブラリもあります。

単純に言語として見れば、Python+numpy+TensorFlowなどよりも、直感的に考えことを素直に記述できると思います。

あとは、どれだけ、人が集まってライブラリ等が整備されるかにかかっていますね。

Machine Learning with Julia: Elegance, Speed and Ease

 · 
フォロー

現状で言えば,機械学習関係のライブラリーが,Python からが使いやすいです。ここらへんは,みなさん,同意見でしょう。

で,なぜ,機械学習系のライブラリがPython用として揃ったかですが,Python が,人工知能以外の分野を含めて,科学技術計算向け言語として大きなシェアを築いたからだと思います。

科学技術計算向け言語として,なぜ,Python が普及したかですが,私の意見では,スクリプト言語でなおかつ,複素数が簡単に使えたらではないかと思います。

10年ほど前ですが,気付いたときは,科学技術計算の分野で,Python のシェアが圧倒でした。それを土壌として,機械学習の分野でも Python が使われているのではないでしょうか。

 · 
フォロー

A Iや機械学習を使ったアプリケーションを開発しているのは、自動運転のように大規模なチームで開発しているところもあれば、個人や小規模のチームで開発しているところも多いです。例えば、囲碁のプログラムとして有名なZenは、もともとは尾島陽児氏が開発したものです。A Iや機械学習が使える分野は多いので、メジャーな分野をはずせば個人でも十分にやっていけると思います。

学習法は、本を読む、ネットで情報を収集する、eラーニングをする、自分でアプリケーションを作るといったところです。他のソフトウェア開発の勉強をするのと大きな違いはありません。むしろ、GoogleをはじめとしてA Iや機械学習の開発者の養成に取り組んでいるので、無料で学習できる優秀な教材が多くは英語版ですがそこら中に転がっています。例としては、以下のようなものがあります。

また、学習環境としては、低スペックでいいのでインターネットに接続できるPC又はタブレットを用意すれば Google Colaboratory 又は Kaggle が使えるので問題はありません。

このようにA Iや機械学習は非常に低コストで学習が可能なので、やる気と能力さえあれば個人でも独学で開発者になることは可能です。ただし、それでもできる人が不足しているというのは、学習する内容が高度でかつ大量にあるため多くの人が途中で挫折してしまうということだということは知っておいてください。

広告
 · 
フォロー

はい、そう思います。

Pythonは、機械学習と深層学習で最も人気があり、広く使用されている言語です。

Why Python is One of the Most Preferred Languages for Data Science? - KDnuggets

広告
 · 
フォロー

結構いろいろなシステムの管理にも使われています。

ubuntuでaptでpythonやpython3をremoveしようとすると

  • apparmor
  • gnome-shell
  • chrome-remote-desktop
  • samba
  • apport
  • firefox
  • gnome-terminal
  • gdebi-core
  • compiz
  • gdebi
  • ibus
  • ubuntu-desktop
  • nvidia-settings
  • rstudio-server ← WTF?? RstudioがPythonに依存w

などなども依存していてともに削除されます。ぶっちゃけUbuntuのデスクトップとしての機能が全滅します。もちろん上記のパッケージ全てがPythonで書かれているとは限りませんが、間接的であれ依存しているPythonの他のプログラムが無いと動かないので影響の大きさは計り知れないでしょう。

CentOSのyumもPython製です。

rpm-software-management/yum

あとは

などの有名なインフラ管理ツールもPython製です。

機械学習と近いですが、科学計算などの研究領域にも多く利用されています。

Raspberry PiとPySerial (Welcome to pySerial’s documentation) を組み合わせて簡単電子工作をしたりrospy (rospy - ROS Wiki) でロボットの制御をしたりもできます。

広告
 · 
フォロー

C、C#、Julia等があります。

 · 
フォロー

Pythonは機械学習の分野では圧倒的に強いです。機械学習をする場合には機械学習のライブラリーだけでなく、データサイエンスや科学技術計算のライブラリが必要だし、画像認識であれば画像処理のライブラリが、自然言語処理であれば辞書や構文解析のライブラリが必要になります。そのため、利用する人が増えれば開発する人も増えて、その相乗効果で関連する分野のライブラリーも充実してきています。

GitHub の The State of the Octoverse 2019 によると、GitHub でもデータサイエンス分野を中心に Python 関連のツールやフレームワークの利用が急速に広がっているとされています(Industry spotlight: data science)。

データサイエンスの分野でよく使われる Numpy, Pandas, Jupyter Notebook, Matplotlib と Ruby を Google Trends で比較すると以下の図のようになり、Rubyの人気度が下がっているのに対して、Numpy 等の人気が急上昇しているのがよくわかります。

Python は、機械学習、データサイエンス、科学技術計算の分野以外でも広く使われています。例えば、Web の分野では Django 等のフレームワークがあり、日本以外では Ruby と同程度に使われています。また、一般には余り知られていませんが組み込み用には Micro Python があり組み込み系の現場では C と並んで広く使われています。強いて弱点ど言えば、スマートフォン用のアプリケーションの分野です。

広告
 · 
フォロー

普通にプログラミングするのも私は楽だと思います。ちょっとしたことをやりやすいですよ。

まあRubyでもできますけど。

PythonはLinuxのディストリビューションならほぼデフォルトで入っているのでなにかあったときにも(何ってなんだ)楽。Rubyはインストールが必要なときがありますね。

 · 
フォロー

文法を覚えるだけでしたら、ひとまずpython でdjangoのwebアプリを作る事が一通り書いてある本を買われてはいかがですか?環境の構築から説明してあるのがいいですね。環境の構築として簡単なのはanacondaを使っているのが多いので無難かもしれません

 · 
フォロー

ディープフェイク画像や映像という事でしょうか?

画像処理ライブラリを併用すれば、出来ると思いますよ。

 · 
フォロー

技術的課題と非技術的課題があります。

技術的課題はまさに指摘されたように、Pythonほど豊かなライブラリがRuby向けに存在しないことです。これに対してはSciRubyコミュニティやRedData ToolsコミュニティがRuby向けライブラリを鋭意開発中ですが、元々のコミュニティサイズの違いもあり、追いつくのには(たとえ可能だったとしても)長い時間がかかるでしょう。

これに対して、PyCallというアプローチが存在しています。これはRubyからPythonのライブラリを使うブリッジを提供するライブラリです。たとえばPandasであるとか、PytorchであるとかをRubyから使えば、Ruby向けライブラリが少ないという問題は(ある程度)解決します。これらのライブラリはPythonレベルでの処理よりもC/C++で実装された内部での処理のほうが割合として高いので、ブリッジによって発生するオーバーヘッドが重大な性能上の問題になることは多くないようです。

非技術的課題としては、これらのライブラリの主なユーザーの多くは別にRubyが好きなわけではないということです。では、Pythonのほうが好きかというとそういうわけでもなくて、問題が解決しさえすればどの言語でも構わない、Pythonを使っているのは、ライブラリも揃っているし(自分でライブラリまで作りたいわけではない)、周囲の人もPythonを使っているから質問しやすいからだ、という人が相当に多いように見受けられます。だとすると、これまでRubyが浸透してきた背景である「技術への愛」とか「Rubyへの愛」のようなものは、ここでは魅力とならないということを意味していて、技術的課題が将来解決したとしてもそれだけではPythonからRubyに移行する動機にはならず、さらに大きなインパクト(ある種の計算がめっちゃ速くなるとか、競争力のある独自フレームワークが登場するとか)が必要になるなあと考えているのです。そして、それは大変に困難なことです。

もっとも、この分野でPythonに勝てなかったからと言って、Rubyの価値が減じるわけではないとも思っているのですが。

広告
 · 
フォロー
Douglas Green

Quora創設者であるアダム・ディアンジェロ氏が、なぜQuoraはPythonを採用したのですか?という質問で答えています。

その答えを要約してみましょう。

  • 創業者たちはMicrosoftが好きではなかったので、C#は除外されました。
  • Javaは手間がかかり、書くのに骨が折れ、Java以外のものではうまく動作しません。
  • OCamlやHaskellは書くのが大変で、ライブラリのサポートも十分ではありませんでした。
  • 彼らはすでにPythonを知っていたので、ユニットテストで型の不足を補い、バックエンドの高速なコードはC++で補完しました。

私は彼らの決断に同意します。主な問題は、開発者にかかるコストよりもサーバコストの方が安いということです。

Python(またはPHP、Perl、Rubyなど)のようなスクリプト言語は、バイトコードやJava(またはC、C++など)のようなコンパイル言語と比較して、プログラミングにかかる時間が約半分になります。

つまり、10人の開発者からなるチームがあり、それぞれが10万ドルの給料をもらっているとすると、100万ドルの給料を支払っていることになります。PythonをJavaに置き換えた場合、さらに10人の開発者を雇い、さらに100万ドルを支払う必要があります。サーバコストを5万ドル節約できて、それが何になるでしょうか?明らかに、その価値はありません。

創業者たちはすでにPythonを知っていて、それを使う準備ができていました。彼らはできる限り早く市場投入し、先行者利益を得たいと考えていました。そして、サイトがすでに本番稼働していて、機能が決まっていれば、最適化すべき箇所も発見できることを知っていました。その時点で、バックエンドをC++に切り替えることができました。

これは他のスタートアップにとっても良い例です。迅速な開発期間とフロントエンドにおける柔軟性、バックエンドにおける高速なサービス時間の組み合わせは模範的なものです。

広告
 · 
フォロー

CやJavaやJavaScriptはブロック構造を波括弧( { } )で表現しますし、Rubyではブロック構造の終わりを end で表現します。もちろん、実際のプログラムではインデントを行うのですが、言語文法上はインデントは単なる空白で意味を持ちません。逆にエディタはプログラムのブロック構造からインデントの深さを計算して行頭位置を調整します(オートインデント)。

一方、Pythonはインデントそのものに文法上の意味をもたせていて、インデントが浅くなった場所でブロック構造が終了するという働きになっています。

この「インデントによるブロック構造」は、Pythonの設計者 Guido van Rossum氏がPythonの前に関わっていた教育用言語 ABC から引き継いだものだそうです。ABCでは「初心者に理解しやすい文法」について様々な調査が行われたそうで、その中で「インデントでブロック構造を表現するのが初心者にとってもっとも理解しやすい」という結果もあり、Pythonはそれを踏襲しています。

実際、CやRubyではブロック終端を表現する「}」や「end」で消費される行がPythonにはないわけですから、縦方向の密度をそれだけ高められますし、読みやすさにも貢献すると思います。

ただし、Pythonの利点としてしばしば述べられる「インデントでブロックを表現しているから、個人差が少ない」とか「ミスが少ない」とかいうのは誤解だと思います。インデントにおける個人差というものはタブを使うか、スペースを使うか、スペースを使うなら一段階あたりいくつのスペースを使うかというところで異なり、インデントを使うからといって解消できるものではありません。むしろタブとスペースの混在とタブ幅の違いによるエラーが発生する危険性もあります。ミスについても、現代のオートインデント機能やシンタックスハイライト機能のあるエディタにおいては、インデントをブロック構造に使わなくても検出できそうです。

考えてみれば、ABCにおける調査はPythonの開発がはじまった1990年以前であることは確実で、その頃はオートインデントはそれほど一般的ではなかった(Rubyはオートインデントを実現したくて、かなり努力してruby-mode.elを開発しました)ことを考えると、オートインデント機能付きエディタを前提として同様の調査をしたら、また別の結果が出るのかもしれません。

Pythonは、このインデントによるブロック構造の影響で、文と式の区別が明確になっていて、そのせいでlambda式の本体部分に式しか書けなかったり、代入が文なので式として扱えなかったり(だから、式として扱える := 代入演算子を導入するPEP 572が提案されて、もめにもめたあげくGuidoの引退の引き金になった)します。

ということで、インデントによるブロック構造は、Pythonの外見上の最大の特徴ではあるものの、言うほどメリットは明確ではなく、新たに言語を新規開発するとして積極的に採用したくなるほどではないような気がします。

広告
 · 
フォロー

うちのMicrosoft 365にinsider program 入れて遊んでみましたよー。

セルD1に=py( と入れPython入力モードしたところです、A1、B1セルの値を引数にアッカーマン関数を実行すると、D1に値が帰ってきました(デモのためJ1にも同じコードをコピーして入れてます)

操作ですが数式メニューからこんな風に入れます。

「Pythonサンプルを試す」ではテーブルから基本的な統計分析をする例題を実行できます。

グラフの中のコードはこんな感じです。

今のところx1()関数でExcel上のセルやテーブルを読み込み、MSのクラウド上のAnacondaで実行してセルに返すことしかできなく、VBAの代わりにはならない(計算専用)ようですが、それでも統計処理やグラフ描画にPythonライブラリを使えるのは魅力ですね。

イヤな予感ですが、今はプレビューでフル機能が開放されていますが製品版では何等かの追加サブスクリプションがないとフル機能を使わせない(ようなことをMSが言っている)ことですかね。またExcel 365限定機能となる気がします。

広告
 · 
フォロー

昔仕事で、

データ抽出(wikipediaのデータ,地方公共団体のデータ,PDF->文字抽出)

データフレーム(概念上のデータベースみたいな)に格納

言語処理してモデリング

みたいなことやったことあり。その時お役立ちしたのが下記の本。


(本)

大体書いてあって便利だった。金使っていいならおすすめ。この本で言うところのWikipediaから抜くとかとくにおすすめっすよ。

で、本高いのでもったいないとしたら、ネットでいい情報探すしかなくて、

経験上述べるならば、

  1. データ抽出
  2. データ格納
  3. データ整形
  4. データ出力

を一手にできる教材がいいと思う。データ抜くだけでは何にもならない。


(ネット教材)

下記の記事なんかは、データスクレイピングして、それをスプレッドシートにまとめる、までやってるしいいのかなと思います。

PythonでスクレイピングしてGoogleスプレッドシートに特定URLのタイトルと見出しを取得するプログラム
今回のPythonのプログラムは特定のURLを指定するとそのサイトをスクレイピングして、タイトルとHタグ(H1からH6タグ)をGoogleスプレッドシートに記録してくれるプログラムです。このプログラムを通してPythonを使った簡単なスクレ

他にもテーマは株のデータ取得するとか、色々あるので、興味の方向性でデータを集めるのがいいのではないかと。


(基本文法)

文法の基本的なところからやりたいなら、下記京都大学のPython演習の教材とかいいと思う。

https://codezine.jp/article/detail/11999

(その他)

英語イケるなら、Youtubeで色々とリアルタイムでプログラミングする動画落ちてるかもしれないので、そっちが手早いかもしれない。

広告
 · 
フォロー

勘違いしているよ。

ディープラーニングなどの研究者は、応用する技術などを研究しているんだ。 速度の研究なんてしていないし、速度の研究だとしても方法として速い利用方法を知れれば良いんだ。 だから、簡単に書いて色々な方法を試せる事の方が重要なんだ。 そして、応用技術が確立したら、それを高速な実装に直せば良い。 研究者たちは「研究」をしているんだ、プロダクトを生産しているわけじゃ無い。
 そして、世の中には私のようなプログラムをチューニングする専門家という人間もいる。 だから、彼らは最初からコードの実行速度という本質以外を重視して研究をおろそかにするよりも、本質である研究を心置きなくやればいい。 あとはこちらに回せばCでもインラインアセンブラでも、場合によってはFPGAを使ってでも高速化する。 そのとき、読みやすいPythonのコードはチューニングしやすくて助かる。 一番たちが悪いのは意味不明になったCのコードだ、各処理の意図を読み取るのに苦労する。

 · 
フォロー

このQuora自身も含めてPythonで実装されているWebサービスはたくさんあります。

もちろん、それぞれに個別の理由があるでしょうが、Pythonは

  • 簡潔かつ比較的一貫性のある仕様
  • Webフレームワークを含めたライブラリ資産の充実
  • 規模が大きなコミュニティの存在

など、開発に有利な条件を満たしています。

人間は、プログラミング言語の移行や複数プログラミング言語を使い分けることをことさらに嫌がる傾向がありますから、Pythonに慣れた開発者が複数いる環境でWebサービス開発にPythonを選択するのはさほど不自然ではないと思います。

 · 
フォロー

それをやろうとしているのがJuliaですけど、結局機械学習分野ではすでにPythonの資産が多すぎてそれらを捨てることができず、なかなか移行できないんですよ。組合せ最適化などあまりPythonのNumPyのエコシステムのメリットが活かせない分野ではJuliaもチャンスはありそうです。

結局JuliaのメリットとしてはC++よりも簡単に書けてPythonよりも速いということなのですが、C++はC++11以降から非常に書きやすくなってもはや難しい言語でなくなりつつあり、またPythonにはpybind11やcythonなどC++と連携するためのツールが整っているためPythonとC++を書ければあえてJuliaに手を出す必要もないと感じます。(一応ちょっとJuliaも触り始めていますが)

あとはPythonにはWeb開発はじめ、機械学習以外のライブラリが充実しているという点も実際にプロダクトを作る際には重要になります。

  • 既存の機械学習のライブラリ
  • システム開発のライブラリ
  • C++連携

の3つを兼ねそろえているのPythonがしばらくは独走でしょう。

関連回答

杜 世橋
 · 3年前
PythonよりJuliaの方が良いなと思える事例を教えていただけませんか?
Pythonの弱点は陽に多重ループを書く必要が有る場合です。行列計算がメインの機械学習では上手くNumPyなどに多重ループを移譲できているのでこの弱点が回避できています。一方で行列計算をあまり利用しない数理最適化の分野ではJuliaのアドバンテージは大きいと思います。PythonだとGILのせいで並列化も難しいですしね。 でも私はPythonのエコシステムを捨ててJuliaを覚え直すくらいだったらPybind11を使ってC++で計算部分だけ書いてPythonからそれを呼び出します。 pybind11 - Seamless operability between C++11 and Python
杜 世橋
 · 2年前
PythonとC++の併用 (Cython, Pybind11) とJuliaではどちらがデータサイエンスプロダクトの開発に向いていますか?
英語版で素晴らしい回答を2ついただきました。 Morgane Alinaï's answer to Which is a better choice for data science product development, Python with C++ (Cython, Pybind11) or Julia? in Julia こちらはTensorflowなどのC++でできているライブラリを使用する場合にはJuliaの出番はなく、新規にC++を自分で大量に書くようなプロジェクトの場合にはJuliaは良い選択肢に入るという意見です。 Erik Engheim's answer to Which is a better choice for data science product development, Python with C++ (Cython, Pybind11) or Julia? in Julia 2つ目の回答ではPythonはPyPy、Cython、pybind11、Numba、JAXなど高速化の技術がいっぱいありすぎてかつそれぞれが一長一短なのが問題点であると指摘しています。 どちらもやはりPythonとC++の関係が鍵ですね。 私個人の意見としてはMorganeさんの回答と非常に近く、行列計算中心の機械学習系はPythonのエコシステムが完成しているのでJuliaに入る余地はあまりなく、逆に数理最適化関連は行列演算で書けなく、陽にループを書く必要が多いためJuliaにアドバンテージがあるように思えます。私は実際に新しいプロジェクトで使用することを検討しています。 一方でJuliaの問題点としては計算以外の領域のライブラリが圧倒的に不足していて、DBなどのミドルウェアとの接続やBoto3やAzure SDKのようなクラウドの機能を利用するためのライブラリが少ないかあるいはほとんどメンテされていないものが多いです。そのため、やはりそういったシステム開発的な部分はPythonなどの他言語の力を借りる必要があると感じました。
杜 世橋
 · 3年前
C++言語を学ぶのはどれくらい難しいですか?
難しいとよく言われるC++ですが、それらの難しい機能を使用しなくても十分にプログラムが書けます。私が思うに必要なことは以下の項目です。 1. 変数の宣言、初期化、代入 2. if, forなどの制御構造 3. class 4. 参照 5. テンプレートの使い方 6. STLコンテナ (string, tuple, vector, map) 7. ヘッダーファイル、コンパイル、リンクの簡単な仕組みとやり方 あれ、ポインターが無いって?そんなのほとんど使わなくても書けるんですよ。C言語でポインターを使う理由は主に次の3つです。 1. 参照渡し 2. 配列 3. 文字列 1はC++の標準機能である参照型を使用すれば実現できますし、2はSTLのvectorを使えば良いのです。事実vectorの内部は通常はheap領域の配列です。3もSTLのstringがあります。標準ライブラリの機能は少ないですが、これらが分かるだけでもPythonなどと同じような感じでプログラムが書けますよ。 過去の回答も参考にしてください。 C言語はシンプルで、パワフルで、優れた言語です。それなのにより複雑なC++言語を選ぶ必要があるでしょうか?に対する杜 世橋 (Du Shiqiao)さんの回答 なぜC++の人気は衰えないのですか?に対する杜 世橋 (Du Shiqiao)さんの回答
杜 世橋
 · 3年前
「PythonはCライブラリを呼ぶための言語」という意見についてどう思いますか?
これはよくぞご質問していただきました。 確かにデータサイエンスで用いられているPythonの有名ライブラリは殆どはC/C++で書かれているか、ラッパーになっています。一部Fortranも含みます。 まずNumPyはコアのndarrayはCで書かれており、行列計算、FFT、乱数などの機能を備えています。線形代数部分は必要であれば別途外部のBLASやLAPACKに移譲することもできます。じつはNumPyの中にはFortranとのインターフェースを作るf2pyというモジュールも入っています。 そしてSciPyも実は様々なCやFortranのレガシーコードのラッパーです。 scipy/scipy あとデータ処理でよく使用されるPandasもCで書かれていますね。 Psycopg2やpymongoなどのDBコネクターもCのライブラリをラッピングしているケースがあります。 さて、PythonとCの連携を語る上で外せないものはやはりラッパー生成ツールです。生のC-APIを叩くのは流石にしんどいです。 このような状況を一変させたものとしてCythonが挙げられます。CythonはPythonライクな文法でCのコードを生成するだけでなく、Cのライブラリのラッパーを作るという目的にも適しています。 Calling C functions 機械学習でおなじみのscikit-learnはCで書かれた部分もあれば、libsvmやliblinearなどの有名ライブラリをCythonでラッピングしているという側面もあります。 またOR-ToolsやTensorflowなどのGoogleが開発しているライブラリではSWIGというラッパー生成ツールがよく利用されます。 さらにさらに近年ではpybind11という非常に洗練されたツールも登場し、C/C++のライブラリをPythonから使用することはますます容易になってきています。 pybind/pybind11 Intel RealSenseというDepthカメラのドライバーや同じくIntel製の点群などの3Dデータを扱うOpen3D、画像処理や機械学習の様々なアルゴリズムを実装したdlib、そしてなんとPyTorchまでもがpybind11を使用しています。 このようにPythonとCは切っても切れない関係にありますのでPythonはCライブラリを呼ぶための言語仰る方もいるでしょう。 しかし、それは根本的に間違っています。われわれにとってはPythonが主であり、Pythonの(クソ)遅い計算部分をどうにかするためにC/C++を使役しているに過ぎません。すなわち、C/C++はPythonから呼ばれるための言語であるというのが正しい現実なのです。
… (もっと読む)
 · 
フォロー

うん、そんなに大量の時間があれば、Pythonならいろんな物が作れる。
 正直、Pythonは非常に高機能なライブラリがたくさんあるから、数行で高度な事が出来る。 私はPythonさわりはじめて数日でスクレイピングツールとか作れたし、数百行も書けば立派なアプリが出来上がるから、作りたい物を考えて、あとは学習で得た物で作りたい物に使えるかってのを考えながら進めてみてはどうかな。
 自主学習で一番不足するのは、上手く使う実践的な方法。 何が作れるか考えるよりも、実際に作ってみて、学習したことを活用してみたり、失敗してみたりして、手直しを繰り返すのが良い。 そうすれば、適した使い方、適さない使いかたがわかってきて、上手く使うための経験を積める。

 · 
フォロー

複数の方から回答リクエストをいただきました。既に他の方の回答で十二分に間に合っていますし、ググればPythonの公式ドキュメントを含め詳しい情報がすぐに見つかるのですが、それでも敢えて回答リクエストをいただいている意図があるとは思いますので、一応回答しておきます。

私が着目したのは、他の回答者の方が読み手のレベルを定義していないこと、また、ちゃんとした説明で回答されている方は暗に読み手に対してそれなりのレベルを要求していることです。

そこで、本回答の読み手は、以下のレベルとします。

  • 高校数学までは一通り習った
  • Pythonのコードを実行することができる

これだけです。

回答としては、以下の通りです。できるだけ平易に説明したいと思います。


前提知識

質問にある0.1、これは10進数の表現ですが、これを2進数で表現すると、

0.00011001100110011001100110011001100110011001100110011010

となります。

これは一体どういうことでしょうか?

現代におけるコンピューターはデジタルという特性上、ハードウェア的には電気信号の有無、0か1かで全てを表現します。よって、0.1のような小数であっても0か1を使って表現するのです。こういった表現は2進数と呼ばれます。(これに対して0〜9で表現するのが10進数です。0〜9に加えてA〜Fも用いるのが16進数です。)

高校数学で習ったのではと思うのですが、例えば2^-1(2の-1乗)は1/2、すなわち0.5です。2^-2(2の-2乗)は1/4、すなわち0.25。2^-3(2の-3乗)は1/8、すなわち0.125です。ちなみに、これらの常に使われている2という数字は基数と呼ばれています。

例えば0.875という10進数の小数を、2進数で表現してみましょう。簡単ですね。0.111です。2^-1 + 2^-2 + 2^-3 だからです。

では10進数の0.9はどうでしょうか?2進数の0.111に対して、10進数で表現するところの0.025を加算する必要がありますね。この0.025を2進数で表現してみましょう。答えを言ってしまうと以下の通りです。

0.000001100110011001100110011001100110011001100110011001101

これは循環小数といいますが、その2進数バージョンです。10進数で表すと0.025ではなく0.02499999999… みたいな感じになります。したがって、2進数の表現を用いる限り、10進数における0.9を0.9として表現することができません。0.89999999999… となってしまいます。

同様に、10進数における0.1も0.3についても、2進数で表現する場合に循環小数となってしまい、10進数における0.1や0.3を表現することができないのです。


Pythonを使った確認

勘の良い方はこの時点で質問の通りとなる理由については察しがつくとは思いますが、質問の通り、Pythonを使って確認してみましょう。

例えばPythonで10進数における0.1を小数点以下55桁まで文字列リテラルとして表現するやり方は以下の通りです。

  1. format(0.1, '.55f') 

結果は '0.1000000000000000055511151231257827021181583404541015625' です。

前述の通り、10進数における0.1は、実際にコンピューターが扱う2進数では循環小数(0.01001100110011001100…)となってしまい、それを10進数に直すとこのような表現となるのです。

では、質問の数値について見ていきましょう。

  1. format(0.1+0.1+0.1, '.55f') 

結果は '0.3000000000000000444089209850062616169452667236328125000' です。

  1. format(0.3, '.55f') 

結果は '0.2999999999999999888977697537484345957636833190917968750' です。

これらの結果から、Pythonにおいて 0.1+0.1+0.1 が 0.3 とはイコールではないこと、0.1+0.1+0.1==0.3がFalseとなることは、明白であると言えます。0.3000000000000000444089209850062616169452667236328125000 == 0.2999999999999999888977697537484345957636833190917968750 は当然Falseであるということです。


まとめ

  • Pythonで0.1+0.1+0.1==0.3がFalseである理由について説明をしました。それぞれ2進数で表現すると循環小数となってしまい、かつそれらが等しくないのが理由です。
  • 高校数学の知識とPythonのコードを実行できるレベルのスキル、この2つさえあれば理解できるよう、極力平易に説明を行いました。
  • より高度な説明、より学術的な説明に関しては、他の方の回答や、検索して出てくる情報を参照してください。
広告
 · 
フォロー

ソフトウェア開発者は、自分で勉強してプログラミングができるようになった人が多いです。データサイエンスや機械学習の分野であれば大学の講義よりも、Youtubeやe-Learningで学習する方がわかりやすいように思います。

2019 Kaggle ML & DS Survey による(出典: Spending $$$ for MS in Data Science - Worth it ? )と、大学の講義で学んだ人は 20.7% で、多くの人が e-Learning で学習しています。

AI のエンジニアは、資格の必要もないし誰でも無料または低料金で学習できるのに、給料は高いです。これは、逆に言うと需要よりも遥かに適性がある人が少ないからです。医学部や薬学部の場合は、大学に入学できれば大部分の人が医者や薬剤師になれて、それで一生生活できます。しかし、大学で人工知能を専攻してもAIエンジニアに必ずしもなれるとは限らないし、能力差がはっきりとでる実力主義の職業です。能力がなければ雇ってくれるところはありません。

日本の高校生は、大学の専攻をイメージだけで選択している人が多いように思いますが、人工知能を専攻することをイメージだけで決めるのはよくありません。もしコードを書く経験をすることなく大学で人工知能を専攻した場合、入学後にコードを書くのが苦痛だとわかったら、楽しくない大学生活になることは間違いありません。

大学で人工知能を専攻したいのであれば、高校時代にプログラミングを経験して、コードを書くのが楽しいかどうか確認しておいた方がいいです。プログラミングやAIの学習は厳しいことが多いです。コードを書くのが楽しい人であれば、多くの障壁を乗り越えていけると思います。

また、高校時代にプログラミングを学び自己学習ができるようにしておけば、大学でプログラミングのアルバイトやインターンを低学年のうちから可能です。プログラミングのアルバイトは、他のアルバイトよりも勉強になるし、単価も高いです。大学生活を豊かに暮らすための1つの手段として使えると思います。

広告
 · 
フォロー

もしデータサイエンティストとして食っていこうと思ったなら役に立つかって大立ちでしょう。

まずは引用から。

何を言っているかと言うと、

このようにフェーズ1においては日本は完全に出遅れてしまったということです。実際、

教育からして遅れまくってます。

しかし、第2フェーズ、第3フェーズでは日本は相当力を入れようとしています。その一例として「日立、データサイエンティスト4倍の3000人に 」を紹介しておきます。これは単に1社の例では全くなく、日本は官民学総出で今後のデータサイエンスに注力しようとしています。

という訳で、データサイエンスに焦点を当てたらこんな感じになるよというお話でした。研究職を目指しているとしたら(新しいアルゴリズムを生み出して一山当てようなどでしたら)他の方の意見を参考になさってください。

… (もっと読む)
 · 
フォロー

昨今の Python はグルー言語(cなどで書かれたライブラリを繋ぐ役割)の側面が強くなっています。

python で機械学習などやる場合、ライブラリの中身は殆ど c 実装だったりします。この場合は M1 と Intel 系とでバイナリが別になるのでややこしめの問題が発生します。

とはいえ M1/M2 の人口はどんどん増えており、サポートも充実してきているので2023年中には遜色なく使えるようになるでしょう。 動いて当たり前ではなく、 OSS コントリビュータに感謝し、問題があれば分析、報告する事で協力していきましょう。

0 コメント:

コメントを投稿