プロが教えるわが家の防犯対策術!

Pythonを使って機械学習の勉強を始めました(今日から)

「スッキリわかる機械学習入門」の本を参考書にしております。
この本に出てくる練習問題4-2に関して 参考書のコードと回答、私が作ったコードと回答が異なり何が悪いのかご教示いただけないでしょうか?

以下が練習問題4-2です
「次の表は生徒10人の試験得点です。(100点満点)
71,67,73,61,79,59,83,87,72,79
これについて、次の手順に従ってpythonコードを作成してください
手順1
scoresリストを1つ作成する
手順2
for文を使って、上記値のデータをscoresリストに格納する
手順3
scoresリストの各要素に対して、次のデータ加工を行い、それぞれを新しいリストであるfinal_scoreリストに格納する
加工後得点 = 0.8*試験得点+20
手順4
final_scoreの平均点を計算し表示する」

以下が模範解答です
score = [] #手順1
for i in range(10):
score = int(input("{}人目の試験得点 >> ".format(i + 1)))
scores.append(score)
final_score = []#手順3
for score in scores:
tmp = score * 0.8 + 20
final_score.append(tmp)
avg = sum(final_score) / len(final_score)
print("平均得点は{}点".format(avg))
(出力は77.89473684210526点でした)

以下が私が書いた拙いコードです
scores = [71, 67, 73, 61, 79, 59, 83, 87, 72, 79]
len_scores = len(scores)
total = 0 # 初期値 0 を設定
#手順2
for score in scores:
#手順3
total = total + (score * 0.8 + 20) #全体の平均点に20を加算
final_score = total
final_ave = final_score / len_scores
print(final_ave)
(出力は78.48でした)

以上です。改善点、模範解答の解説をよろしくお願いいたします。
(今日から勉強を始めた初心者だと思って、大目に見て回答していただけたら幸いです。)

A 回答 (3件)

>ただ、その解が異なるのです。

参考書は(出力は77.89473684210526点)、私のコードは(出力は78.48でした)でした。
>その点についてご教示いただけますでしょうか。

うん、そりゃ簡単だ。
「貴方のコードの計算結果」が正しい。参考書が間違っている。
出力は77.89473684210526点には「ならない」。
検算してご覧?

scores = [71, 67, 73, 61, 79, 59, 83, 87, 72, 79]
sum([0.8 * i + 20 for i in scores]) / len(scores)
78.48

になるから(参考書のコードで実行しても「そうなる」)。

これも理由がハッキリしてんだ。
実は「プログラミング関係の技術書」ってのは「しっかりした」本じゃない。事実上、単なる「同人誌」なんだよ。
「スッキリわかる機械学習入門」の出版社はインプレスだっけ?でもインプレスに限った話じゃなくって、「殆どのプログラミング関係の本を出してる出版社」は事実上、「同人誌印刷・販売会社」なんだ、と言う衝撃的事実がある。

多分「教科書出版社」って想像するに、「信頼出来る執筆者に依頼して本を出版する」とか思うでしょ?
でもプログラミング関係に於いては違うんだ。実は「かなりの確率で」持ち込み企画なの。「今まで教科書なんざ書いた事のない1プログラマ」とかが、原稿を出版社に持ち込んで、そこでO.K.を貰えば本が出版される、っつー、実は「かなり杜撰な」出版体制なのね。
んでだ。
そこで「編集」がやるのは「誤字・脱字のチェック」しか行われないわけ。
つまり、「原稿に書かれてるプログラムを自分で組んでみて、走らせてみて、間違いなく走る」なんつーチェックは「ほぼ絶対なされない」。
これが、Amazonなんかの書評で、「打ち込んだプログラムを走らせたけど走りません」って苦情が書かれてる原因なんだよ(笑)。
「技術書の殆どは同人誌」なんだ。ぶっちゃけ、そんなのはコミケで売ってくれ、とか思うんだが(笑)、IT関連の出版書、なんつーのは実はそういうレベルなんだ。
従って、本当に「信頼がおける」出版物、ってのは限りなく少ないんだ。それが「IT系出版物」の実態だ。
だから貴方がこうやって悩む事になる。

> まず一冊初心者本をやってみようかな?と思い始めましたが遠回りになりそうな気がしてきました。

うん、少なくとも「Pythonを学びたい」と言う場合、市販書籍の場合、ロクな本は売ってません。
っつーか、現在、「Python本はバブル」状態で、言っちゃえば「Pythonをあまり知らん奴らが」Python本を書いて出す、っつーロクでもない状況になってんのね。
Pythonを覚えたい場合、ぶっちゃけ、「日本で書かれた本」に金を払って勉強するのは無駄です。Web文書で充分、っつーかそれで学ぶのが一番いい。

Dive into Python:
http://diveintopython3-ja.rdy.jp/

まず教科書としては上がオススメ。「洋書の翻訳本」の方がマシなんだけど、そういう「洋書の翻訳本」がタダで公開されている。
これを使って学ぼう。
ただし、この本は「プログラミング初学者向け」ではないんで、ちと難しいと思う。
そこで、詰まった場合は調べる対象の「参考書」が必要だ。これもWebでタダで読める。

Think Python:
https://cauldron.sakura.ne.jp/thinkpython/thinkp …

これはPDFなんで、何だったら印刷して手元に置いておいても良い。
Dive into Pythonで「ちと分かりづらいPythonの部分」を章題から検索して読む。
この本は「冒頭からマジメに読む」には向かないんだけど、簡易リファレンスとしては有効だ。「機能をリファレンスから調べる」クセをつけよう。
そしてもっと細かいリファレンスがPythonチュートリアルだ。

Pythonチュートリアル:
https://docs.python.org/ja/3/tutorial/index.html

題名が「チュートリアル」になってっけど、これは「初心者向け」を意味していない。「他言語でプログラミング経験がある人向けの」チュートリアル、って意味で、初見だと結構難しいと思う。
このWeb文書の立ち位置は、Think Pythonで調べて「納得がいかない」あるいは、「もっと良く知りたい」場合に使う参考書の参考書、だ。Think Pythonで納得できたならこっちは参照しなくてもいい。
いずれにせよ、Dive into Python3とThink Pythonを使えばもう「Pythonを使ったプログラミング」には嫌でも慣れると思うし、思いつく限り「ベストな学習法」です。
タダだし(笑)。いや、マジで「ヘタな本を買う」よか「かなり」マシだと思う。

どうしても「書籍を買いたい」場合は次の本が初学者にはオススメ。

世界標準MIT教科書 Python言語によるプログラミングイントロダクション 第3版:
https://www.kindaikagaku.co.jp/book_list/detail/ …

これは今年の1月に出たばっかの本。
Amazonなんかだと過去の版が「難しすぎる」とか酷評されてたけど、全然難しくない、です。
っつーか「他の言語を学んだ人にとっては難しい」だけ。実は他の言語経験者じゃない人の方が素直に読めると思う。どの言語たぁ言わんけど、「高階関数もない」言語ユーザーにとっては「高階関数が理解出来ない」とか、その「別の言語に脳が侵されてる人」が難しい、って言ってるに過ぎない。
まぁ、日本のPython本を買って読むならこっち買って読んだ方がいいですね。機械学習の基礎に付いても論じてるし(統計学に付いても書いてる)。

まぁでも、最初に挙げたWeb文書3冊で学ぶのがコスト的に言っても一番良い、つまり「オススメ」かな?
以上。
    • good
    • 1

模範解答実行してみると



1人目の試験得点 >> 71
2人目の試験得点 >> 67
3人目の試験得点 >> 73
4人目の試験得点 >> 61
5人目の試験得点 >> 79
6人目の試験得点 >> 59
7人目の試験得点 >> 83
8人目の試験得点 >> 87
9人目の試験得点 >> 72
10人目の試験得点 >> 79
平均得点は78.48点

だね。試さなかったのだろうか?

模範解答に平均の出力結果まで含まれていないなら
入力ミスでしょう。含まれているなら回答のミス。
    • good
    • 0

まず、だな。



> 参考書のコードと回答、私が作ったコードと回答が異なり何が悪いのかご教示いただけないでしょうか?

うん、1つ勘違いがある。
プログラムっつーのは「計算された結果が正しければ」どう書いてもいいんだ。
つまり、唯一の「誰でもこうなる」っつー書き方、ってのは無いんだよ。
すなわち、参考書のプログラムが78.48で、貴方が書いたプログラムも78.48が出た、のなら「貴方の書いた解」は、この「お題」に於いては「それも正しい解」って事になるんだ。
安心していい。
ただ、唯一違いがあるとすると、参考書が提示した解は「外部から入力される」前提になってんだけど、貴方の書いたブツは「点数がすべて埋め込まれている」。
そこだけが違うだけ、だ。参考書の提示した解は「10個の点数なら何でもいい」けど、貴方が書いたのは結果「決め打ち」になってる。
それくらいかな?

なお、言っちゃえば、その参考書が書いてる「例示」は良くない。「良くない」って言い方がダメなら「ダサい」んだ。
生粋のPythonistaならそんなダサいコードは書かない。しかし、最近「あんま実はPythonを知らない」のに色気を出して「Python本」を書く輩が増えている。
Pythonistaなら、その参考書の「例示」のようなダサいコードじゃなくって、次のように書くだろう。

from statistics import mean

avg = mean([0.8 * int(input(f"{i + 1}人目の試験得点 >> ")) + 20 for i in range(10)])
print(f"平均得点は{avg}点")

「三行で書ける」事を「十行もかけて書く」のは、言っちゃえばバカの所業だ。
出来るだけ、このスタイルで「書けるようになる」事を目標とすべきだ。これは老婆心からこう言ってる。
Pythonは「ダラダラとfor文を回して」「わざわざリストを結合して」「またダラダラとfor文を回して」「わざわざ要素を一々加工するように指示して」「それを長さで割って」と言うような処理をする設計にはなっていない。
「平均を取る」って前提なら組み込みのstaticsライブラリにあるmean関数を使う、と言う判断をすべきだ。Pythonにはそのための用意がある。

mean:
https://docs.python.org/ja/3/library/statistics. …

何かのお題があったらまずはPythonのライブラリを調べる癖を付ける事。

Python標準ライブラリ:
https://docs.python.org/ja/3/library/index.html

「貴方が何かを書く」以前に既に「適したライブラリ関数」が用意されてる可能性が高い。それに「頼る」のが実はPython上達の早道だ。
通常、「何でも自分で書けるようになる」のがプログラミングへの心構え、とか思われてるけど、Pythonでは逆。「如何に自分でプログラムを書かないようにするか」が実はPythonでは重要なんだ、と言う嘘のようなホントの話。
これが貴方の「検索能力」を底上げし、それが実は「モダンなプログラミングの勉強」なんだ。

そしてもう2つポイントがある。
1つ目。Pythonではfor文は「使わない」。必ず使わない、ってワケじゃないけど、そんなブツより「リスト内包表記」を覚えよう。80%くらいはそれで済むんだ。

リスト内包表記:
https://docs.python.org/ja/3/tutorial/datastruct …

リスト内包表記はPythonの「最重要機能」だ。
よってその本がリスト内包表記を解説してない、ないしは「可読性を下げるのでなるべく使わないようにしましょう」なぞと書いてたらクソ本だ。そういう場合はその本はぶん投げていい。っつーかぶん投げた方がいい。
そうじゃなければ即刻その本の「リスト内包表記」の箇所を読んで「使いこなせるように」する事。

また、Pythonの最重要関数はfunctools.reduce。

functools.reduce:
https://docs.python.org/ja/3/library/functools.h …

極端な話、Pythonでは「リスト内包表記」とfunctools.reduceの2つさえ使いこなせれば、もう初心者は卒業、です。
    • good
    • 0
この回答へのお礼

ありがとうございます。初心者である私に大変わかりやすいご指示で感謝いたします。

ただ、その解が異なるのです。参考書は(出力は77.89473684210526点)、私のコードは(出力は78.48でした)でした。
その点についてご教示いただけますでしょうか。

また
「「三行で書ける」事を「十行もかけて書く」のは、言っちゃえばバカの所業だ。
出来るだけ、このスタイルで「書けるようになる」事を目標とすべきだ。これは老婆心からこう言ってる。」
に関して、完全に同意いたします。
「「貴方が何かを書く」以前に既に「適したライブラリ関数」が用意されてる可能性が高い。それに「頼る」のが実はPython上達の早道だ。」
も完全同意です。

ある研究に関して機械学習ができたら面白そうだと思い勉強を始めよう、まず一冊初心者本をやってみようかな?と思い始めましたが遠回りになりそうな気がしてきました。
私はpython専門家やプログラマーになりたいわけではないのです。
類似研究で機械学習を使っていてコードなどを公開しているものを探し、片っ端からググって理解していった方が早いかも?と思いました。

重ねてお礼申し上げます。
お時間あれば再度ご回答お願い致します。

お礼日時:2023/07/20 16:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!