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

このQ&Aのポイント
  • Pythonの機械学習のコードでエラーが消えません。プログラムを書き、エラーを消していったが最後に残ったエラーが解決できません。
  • 動画を元にプログラムを部分ごとに分割して実行し、エラーを解消していったが、最後のエラーが解決できません。
  • エラーを解消するために、一部のコードを確認し、上手く動くことを確認したが、連結後にエラーメッセージが表示されます。素因数分解や条件分岐を使って解決しようとしましたが、うまくいきません。
回答を見る
  • ベストアンサー

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()

  • Python
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6635/9402)
回答No.2

いやあの、デバッグまではしませんので自分でやりたいように組んでくださいね? ただいくつかアドバイス > 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要素ずつ増えるのであれば、その式のままでもいいかもしれませんが。

hf-sbf5
質問者

お礼

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

その他の回答 (1)

  • asciiz
  • ベストアンサー率70% (6635/9402)
回答No.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] にアクセスしようとしてしまいますから、範囲外エラーが出ています。 プログラム全体を見たわけではないので何をしたいかはよくわかっていませんが、とりあえず。

hf-sbf5
質問者

お礼

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

関連するQ&A

  • c言語 

    答えを0にするこまち算のプログラムを組んでみたのですが、ここからどうしても進まなくなってしまいました。 自分ではいけるかなと思ったのですが、9-8-7+65-4321=9など答えがありえない数になってしまいます。 どこがいけないか教えてください。むしろ最初から組み直した方がよいのでしょうか… #include <stdio.h> int cul(); int num[9] ={9,8,7,6,5,4,3,2,1}; int total;/**/ int kigou[8]={0,0,0,0,0,0,0,0}; int main(){ for(kigou[0]=0;kigou[0]<3;kigou[0]++){ for(kigou[1]=0;kigou[1]<3;kigou[1]++){ for(kigou[2]=0;kigou[2]<3;kigou[2]++){ for(kigou[3]=0;kigou[3]<3;kigou[3]++){ for(kigou[4]=0;kigou[4]<3;kigou[4]++){ for(kigou[5]=0;kigou[5]<3;kigou[5]++){ for(kigou[6]=0;kigou[6]<3;kigou[6]++){ for(kigou[7]=0;kigou[7]<3;kigou[7]++){ keisan(); } } } } } } } } return 0; } int keisan(){ int n =0; int flag = 0; int t = 0; int i = 0; total = num[0]; /* for (n=0;n<9;n++) printf("kigou[%d] == %d",n,kigou[n]);確かめ*/ for(;n<8;n++){ if(kigou[n] == 0 && n == 0){ total = total * 10 + num[n+1]; for(flag=1;kigou[n+flag]==0 && (n+flag)<9 ;flag++){ total = total * 10 + num[n+flag+1]; } n = n + flag; } flag=0; if(kigou[n]!= 0){ for(flag=1;kigou[n+flag]==0 && (n+flag)<9 ;flag++){ t = num[n+1] * 10 + num[n+flag+1]; } n = n+ flag; total = total + t; } } /*0になる計算式の表示*/ kigou[8]=2;/*表示しないために空白を入れる*/ if(total==0){ for(i=0;i<9;i++){ printf("%d",num[i]); if(kigou[i]==0) printf("+"); if(kigou[i]==1) printf("-"); if(kigou[i]==2) printf(""); } printf("=%d\n",total); } return 0; }

  • VC# 強化学習

    VC#2010で強化学習のプログラムを作ろうと考えているのですが、 実行すると「NullReferenceExceptionはハンドルされませんでした。 オブジェクト参照がオブジェクト インスタンスに設定されていません。」 というエラーが出てプログラムが動きません。 ソースは static public Random rnd; static void Main(string[] args) { double[][] Qtable; //Qtable double Q_max = 0;//Q値の最大値 double reward = 0; //報酬 double alpha = 0.5;//学習係数 double gamma = 0.9;//減衰係数 int epsilon = 10;//行動を無作為に選ぶ確率[%] int trial_max = 100;//試行回数 int num_a = 2;//行動の数 int num_s = 2;//状態の数 int a = 0;//行動 int s = 0;//状態 int sd = 0;//行動の実行によって遷移する状態 int i, j; //メモリー空間の確保 Qtable = new double [num_s][]; for (i = 0; i < num_s; i++) { Qtable[i] = new double[num_a]; } //Q値の初期化 for (i = 0; i < num_s; i++) { for (j = 0; j < num_a; j++) { Qtable[i][j] = 0; Console.WriteLine("Q[{0}][{1}]={2}\n", i, j, Qtable[i][j]); } } //試行開始 for (i = 0; i < trial_max; i++) { //行動の選択 a = epsilon_greedy(epsilon, s, num_a, Qtable); a = 1; //行動の実行 reward = vending_machine(s, a, sd); //sdにおけるQ値の最大値を求める Q_max = max_Qval(sd, num_a, Qtable); //Q値の更新 Qtable[s][a] = (1 - alpha) * Qtable[s][a] + alpha * (reward + gamma * Q_max); s = sd; Console.WriteLine("i={0}\n", i); if (reward > 0) { Console.WriteLine("成功\n", a); } if (reward == 0) { Console.WriteLine("失敗\n", a); } } //Qtableの表示 for (i = 0; i < num_s; i++) { for (j = 0; j < num_a; j++) { Console.WriteLine("{0} ", Qtable[i][j]); } Console.Write("\n"); } return; } static double vending_machine(int s, int a, int sd) { double reward; if (a == 0) { if (s == 0) sd = 1; if (s == 1) sd = 0; reward = 0; } else { if (s == 1) { sd = s; reward = 10; } else { sd = s; reward = 0; } } return reward; } static double max_Qval(int s, int num_a, double [][] Qtable) { double max; int i = 0; max = Qtable[s][0]; for (i = 1; i < num_a; i++) { if (Qtable[s][i] > max) { max = Qtable[s][i]; } } return max; } static int select_action(int s, int num_a, double [][] Qtable) { double max; int i = 0; int[] i_max; i_max = new int[num_a]; int num_i_max = 1; int a; i_max[0] = 0; max = Qtable[s][0]; for (i = 1; i < num_a; i++) { if (Qtable[s][i] > max) { max = Qtable[s][i]; num_i_max=1; i_max[0]=i; } else if (Qtable[s][i] == max) { num_i_max++; i_max[num_i_max - 1] = i; } } int seed = Environment.TickCount; rnd = new Random(seed++); a = i_max[rnd.Next(num_i_max)]; return a; } static int epsilon_greedy(int epsilon, int s, int num_a, double [][] Qtable) { int a; if (epsilon > rnd.Next(100)) { //無作為に行動を選択 a = rnd.Next(num_a); } else { //最大のQ値を持つ行動を選択 a = select_action(s, num_a, Qtable); } return a; } のような感じです。 どなたか分かる方がいれば、教えていただけるとありがたいです。 よろしくお願いします。

  • Pythonのプログラムが狙い通りに動きません

    学習目的で下記のようなプログラムを 組んだのですが、試行錯誤を繰り返しても 絶対ありえない結果ばかりが出力されたり、 謎のメモリーエラーが出たりします。(白目 実行すると画面に入力フォームが表示され、 例えば 80 と打ち込むと、1~80 までの 数の中にいくつ素数がいくつ含まれているかを 確率論的に予測するシステムプログラムです。 乱数 = (a_num) を出し、(1<a_num<serch_range) その整数を(num)で割って、(1<num<a_num) 割り切れたらリストに何もせず、 そうでなければ(1/1000 ) を加える という工程を 1000 回繰り返したのち、 リストの合計に 100 を掛けた数を 表示させるシステムを作ろうとしました。 str_serch_range = input("Enterキーを押せ!") serch_range = int(str_serch_range) list_num = [] def sosuu_kuzi(): while True: for cnt in range(1000): from random import randint a_num = randint(2,serch_range) for num in range(2,a_num): if a_num % num == 0: break else: list_num.append(1%1000) sosuu_kuzi() print(sum(list_num)*100) こんなコードでメモリ不足とか、 絶対おかしいと思うんですが…

  • 最大値を求める

    3つの整数を入力して、最大値を求めるプログラムを作りたいのですが、整数を入力するところまでは うまくいくのですが、結果が、255、と出てしまいます。どこがおかしいのかが解かりません。 どなたか教えていただけませんか? 宜しくお願いします。 #include <stdio.h> int main(void) { int num[3]; int max, i, j; puts("三つの整数を入力してください"); for(i = 0; i < 3; ++i) { printf("整数%d:", (i + 1)); scanf("%d", &num[i]); } max = num[0]; for(j = 0; j < 3; ++j) { if(max < num[j]) { max = num[j]; } } printf("最大値は%dです。\n", max); return 0; }

  • Cのソースコードについて

    #include<stdio.h> int main(void) { long a[6000],sum[6000],max=0; int i,j=0,n,m; for (m = 0; m <= 6000; m++) sum[m] = 0; for (i = 0;; i++) { scanf_s("%ld", &a[i]); if (a[i] > 0) sum[j] += a[i]; else if (a[i] < 0) { j++; sum[j] = -1; j++; } else break; } for (n = 0; sum[n] == 0; n++) { if (max < sum[n]) max = sum[n]; } printf("%ld",max); while(1){} return 0; } こんなコードを書いたのですが 答えが常に0になってしまいます。 原因がはっきりしないので教えてください 使用言語はCです

  • このプログラムの問題点を教えてください。

    //数独 #include <iostream.h> const int num_Max = 100; //一辺のマス最高値 void input_data( int a, int [num_Max][num_Max] ); //入力関数 void yoko_data( int a, const int [100][100], int & ); //判定 void tate_data( int a, const int [100][100], int & ); void block_data( int a, int b, const int [100][100], int & ); main() { int num; //一辺のマスの数 int m; //一ブロックの一辺にあるマスの数 int okey; //numが正常か判別 int dx, dy, dz; int masu[num_Max][num_Max]; //全部のマス cout << "\n埋められた数独が正しいかどうか判断するプログラムです。\n"; while(1){ cout << "横何マスありますか? (4-100)>>" ; cin >> num ; if( num > num_Max || num < 4){ cout <<"範囲外です。再入力して下さい。" ; }else{ m = sqrt( num ); okey = num - m * m; if(okey != 0) cout << "その数字は数独として成り立ちません。再入力して下さい。"; } } //マスの入力 input_data( num, masu ); //横判定 yoko_data( num, masu, dx ); if(dx = 0){ //縦判定 tate_data( num, masu, dy ); if(dy = 0){ //マス判定 block_data( num, m, masu, dz ); } } if(dx == dy == dz == 0) cout <<"\n大正解♪ おめでっとー。\n"; return 0; } //入力 void input_data( int kazu, const int matrix[num_Max][num_Max]) { cout <<"\nマスの数字の入力を左上から順に、右へと行って下さい。"; for(int i = 0; i < kazu; i++){ for(int j = 0; j < kazu; j++){ cout << i+1 << "行目の" << j+1 << "列目 >>"; cin >> matrix[i][j] ; } } } //横列(行)を順に判定 void yoko_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vx = 0; //かぶっていたと判定されたかどうかを見る用 for(int i = 0; i < kazu; i++){ //横一列取り出しました。 for(int j = 0; j < kazu; j++){ for( int k = 1; j+k < kazu; k++){ kaburi = matrix[i][j] - matrix[i][j+k]; if(kaburi == 0){ //かぶってたらループから抜け出す vx++; break; } } } } if(vx > 0) cout << "\n横列(行)検索時に不適切な部分を発見しました。\n"; return vx; } //縦列(列)を順に判定 void tate_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vy = 0; //かぶっていたと判定されたかどうかを見る用 for(int j = 0; j < kazu; j++){ //縦一列取り出しました。 for(int i = 0; i < kazu; i++){ for( int k = 1; k < kazu-1; k++){ kaburi = matrix[i][j] - matrix[i+k][j]; if(kaburi == 0){ //かぶってたらループから抜け出す vy++; break; } } } } if(vy > 0) cout << "\n縦列(列)検索時に不適切な部分を発見しました。\n"; return vy; } //1ブロックごとに判定 void block_data( int kazu, int ruto, int matrix[num_Max][num_Max]) { int hantei[num_Max][num_Max] ; //判定する部分を切り出す用 int kaburi; int vz; //まずブロックごとに切り出してみる for(int i = 0; i < ruto-1; i++){ for(int j = 0; j < ruto-1; j++){ int h = 0; //何ブロック目か int g = 0; //そのブロックの何個目か (h-1)++; for(int l = 0; l < ruto-1; l++){ for(int k = 0; k < ruto-1; k++){ hantei[h][g++] = matrix[i * m + k][j * m + l]; } } } } //かぶっているか判定する for(int x = 0; x < kazu; x++){ for(int y = 0; y < kazu; y++){ for( int z = 1; z < kazu-1; z++){ kaburi = hantei[x][y] - matrix[x+z][y]; if(kaburi == 0){ //かぶってたらループから抜け出す vz++; break; } } } } return vz; } C++で作成したものです。 コンパイルエラーが出てしまうのですが、原因を教えていただけませんか?

  • C言語:単語カウント

    英文中に現れる異なる単語の数を表示するプログラムがわかりません。 例えば 「the a the」と入力されたら the=2 a=1 と表示されるプログラムです。 なんとかカウントはされるのですが出力がうまくいきません。同じ単語も表示されてしまいます。 どなたかご教授お願いします。 WindowsXP、コンパイラはBCCを使っています。 #include <stdio.h> #include <string.h> #define MAX 256 int main() { struct { char word[MAX]; int counter; }list[50]; int i,j,total=0; i=0; while(scanf("%s",list[i].word)!=EOF){ /*キーボードから文字列をすべて読み込む*/ total++; i++; } list[0].counter=1; for(i=0;i<=total;i++,list[i].counter=0){ /*比較*/ for(j=1;j<=total;j++){ if(strcmp(list[i].word,list[j].word)==0){ list[i].counter++; } } } for(i=0;i<=total;i++){ printf("%s %d\n",list[i].word,list[i].counter); /*出力 the=2 a=1 the=1となってしまう*/ } return(0); }

  • 配列の和を求めるプログラム

    キーから入力したデータを配列に入力した後、その和を求めるプログラムを作成したいのですが、プログラミング初心者の私にはさっぱりわかりません。 和を求めたいのに平均値が出てきてしまいます。 どこが間違っているのか教えてください。 #include <stdio.h> float data[5]; float total(int max); void main(void) { int cnt = 0; float d; printf("please input a data: "); scanf("%f", &d); while((cnt < 5) && (d > 0.0)) { data[cnt] = d; cnt++; printf("please input a data: "); scanf("%f", &d); } printf("total data: %5.2f\n", total(cnt)); } float total(int max) { int i; float total = 0.0; for(i = 0; i < max; i++) { total += data[i]; } return total / max; }

  • 最大値と最小値を表示したいのですが・・・

    double numに入っている数字から最大値と最小値を求めたいのですが、このままだと両方とも1.000になってしまうんです・・・ どうやったらちゃんと最大値と最小値が表示されるのでしょうか?? 初心者なものでスイマセンが教えてください!! #include<stdio.h> int main(void) { int i,j; double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0}; double max,min; for(i=0; i<10; i++) { for(j=0; j<10; j++) { if(num[i]>num[j]) max=num[i]; } } for(i=0; i<10; i++) { for(j=0; j<10; j++) { if(num[i]<num[j]) min=num[i]; } } printf("最大値は%fです。",max); printf("最小値は%fです。",min); return 0; }

  • C++ なのですがエラーが消えません

    課題のC++プログラムのエラーが消えません,教えてください. 10個の数値を入力し並び替えるプログラムなのですが並び替え部分以外は先生作成のプログラムです. どうかお願いいたします. #include <stdio.h> #define MAX 10 #define OK 0 void inputnum(int num[]); void sortnum(int num[]); void outputnum(int num[]); main(){ int num[MAX]; printf("番号 氏名\n"); inputnum(num); sortnum(num); outputnum(num); return(OK); } void inputnum(int num[]){ int i; for(i=0;i<MAX;i++,num[i]){ printf("数値%d = ", i+1); scanf("%d",&num[i]); } printf("数値入力完了\n"); } void sortnum(int num[]){ int tmp,p,q; for(p = 0; p < 9; p++){ for(q = p + 1; q < 10; q++){ if(num[p] > num[q]){ tmp = num[p]; num[p] = num[q]; num[q] = tmp; } } } printf("並び替え完了\n"); void outputnum(int num[]){ int i; for(i=0;i<MAX;i++){ printf("数値%d = %d\n",i+1,num[i]); } printf("数値出力完了\n"); }; [エラー  Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 1142122.c: エラー E2140 1142122.c 46: ここでは宣言はできない(関数 sortnum ) エラー E2141 1142122.c 46: 宣言の構文エラー(関数 sortnum ) エラー E2134 1142122.c 54: 複合文に } がない(関数 sortnum ) *** 3 errors in Compile ***]

専門家に質問してみよう