こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Pythonの機械学習のコードでエラーが消えません

https://www.youtube.com/watch?v=L4f6KGgX4xI

上の動画を元にプログラムを書き、
部分ごとに分割して動作させてみたりして
エラーを消していったんですが、最後に残った

---> 60 elif total_list[odd]-total_list[even] < 0:
61 delta_gosa = total_list[odd]-total_list[even]#誤差の合計の変化量を出すため、total_list を使う。
62 h += 0.001 * abs(delta_gosa)

IndexError: list index out of range

というエラーがどうしても消えません。
h = 0
n = 1
total_list = []
という部分より上の部分はエラーが出ずに動く事を確認し、
次にこの部分以下と同じ構造のループを持つ文を書いた時に上手くいったのに、
これらをつなげて動かすとエラーメッセージが出てきます。
(インデントは全角スペースで表現しています)

def random_leaner():

 gari_highth_list = []
 gari_mass_list = []
 gari_num = len(gari_mass_list)

 debu_highth_list = []
 debu_mass_list = []
 debu_num = len(debu_mass_list)

 for i in range(90):
  from random import randint

  highth = randint(130,190)
  mass = randint(30,90)
  if highth/mass > 17/5 :
   gari_highth_list.append(highth)
   gari_mass_list.append(mass)
  else:
   debu_highth_list.append(highth)
   debu_mass_list.append(mass)

 gari_highth_max = max(gari_highth_list)#ガリの高さ最大値と体重最大値が同じになるよう補正
 gari_mass_max = max(gari_mass_list)
 k_for_gari = gari_highth_max / gari_mass_max

 debu_highth_max = max(debu_highth_list)#デブの高さ最大値と体重最大値が同じになるよう補正
 debu_mass_max = max(debu_mass_list)
 k_for_debu = debu_highth_max / debu_mass_max

 h = 0
 n = 1
 total_list = []
 big_num = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

 for tnt in range(1,big_num): # while True にしたかったんですが、繰り返し変数を利用したかったので big_num で代用します。

  odd = 2*tnt-3
  even = 2*tnt-4

  gari_GOSA_total = 0
  for num in range(0,gari_num+1):
   #(190ー背の高さ)+(90-体重の重さ)を出し、nを掛けて h”を”引いている
   gari_GOSA = (280 - gari_highth_list[num] - gari_mass_list[num]*k_for_gari)*n - h
   gari_GOSA_total += gari_GOSA

  debu_GOSA_total = 0
  for num in range(0,debu_num+1):
   #(190ー背の高さ)+(90-体重の重さ)を出し、nを掛けて h”から”引いている
   debu_GOSA = h - (280 - debu_highth_list[num] - debu_highth_list[num]*k_for_debu)*n

   debu_GOSA_total += debu_GOSA
  total_list.append(gari_GOSA_total + debu_GOSA_total)

  if tnt == 1:# hを少し変化させ、誤差の合計が減ったかどうか調べる。
   h += 0.001
   n += 0.001

  elif total_list[odd]-total_list[even] < 0:
   delta_gosa = total_list[odd]-total_list[even]#誤差の合計の変化量を出すため、total_list を使う。
   h += 0.001 * abs(delta_gosa)
   n += 0.001 * abs(delta_gosa)

  elif total_list[odd]-total_list[even] > 0:
   delta_gosa = total_list[odd]-total_list[even]
   h -= 0.001 * abs(delta_gosa)
   n -= 0.001 * abs(delta_gosa)
  else:
   print(h,n)
   print(gari_highth_list)
   print(total_list)
   break

random_leaner()

投稿日時 - 2020-07-15 13:47:07

QNo.9772814

困ってます

質問者が選んだベストアンサー

いやあの、デバッグまではしませんので自分でやりたいように組んでくださいね?

ただいくつかアドバイス

>for tnt in range(1,big_num):# while True にしたかったんですが、繰り返し変数を利用したかったので big_num で代用します。

ここの件は、

tnt = 0
while True
  tnt += 1

こうすれば1ずつ増えて永久ループするので、big_numなんて定義しなくて済みます。

でもその次、

>odd = 2*tnt-3
>even = 2*tnt-4

odd と even が必ずtotal_list 要素数の範囲に収まる計算式にするか、範囲外になってしまうときは total_list[x] へのアクセスをしない、というような組み方をする必要があるでしょう。
あるいは1ループに total_list が2要素ずつ増えるのであれば、その式のままでもいいかもしれませんが。

投稿日時 - 2020-07-16 14:15:47

お礼

ありがとうございます。
後はなるだけ自力でやってみます。

投稿日時 - 2020-07-16 15:14:49

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

ちょっとprintデバッグしてみました
61行を含むif文の前で、

print(total_list, odd, even)

を入れて実行したところ、以下の表示になりました。

C:\Users\xxxxxxxx\Desktop\python>python gakusyuu.py
[286.3096629213483] -1 -2
[286.3096629213483, 286.5959725842696] 1 0
[286.3096629213483, 286.5959725842696, 286.5139993611875] 3 2
Traceback (most recent call last):
File "gakusyuu.py", line 76, in <module>
random_leaner()
File "gakusyuu.py", line 61, in random_leaner
elif total_list[odd]-total_list[even] < 0:
IndexError: list index out of range

ループ三回目で、total_list の要素は3つとなっています。
要素が3つであるリストの取れるインデックス値は、0・1・2までです。
ところが odd = 3 となっていて、total_list[3] にアクセスしようとしてしまいますから、範囲外エラーが出ています。

プログラム全体を見たわけではないので何をしたいかはよくわかっていませんが、とりあえず。

投稿日時 - 2020-07-15 14:21:23

お礼

回答ありがとうございます!

投稿日時 - 2020-07-15 15:12:54

あなたにオススメの質問