質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

851閲覧

配列のループ処理の出力がおかしい

itsukidesu

総合スコア6

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/02/06 09:27

編集2020/02/07 02:10

現在、c言語で行ったプログラムをpythonに変換してプログラムを書こうとしています。
目的としている処理はfor文の中で y, s, faiの値を更新していくプログラムです。

  1. 初期値としてxはすべて既知のデータでwの初期値のみが与えられています。
  2. xとwの初期値をもとにyを求める。
  3. yをアークタンジェントとしたものをfaiとします。
  4. yとfaiをプログラムに書かれている式に挿入し次wを求める。
  5. 2~4を繰り返すことでwを更新してゆく

図で示しているのは二行に列wの要素の一つを取り出したものです。
しかし、結果は図のようになり結果が更新されないうえに途中から0に収束しています。
手順4においてeta以降の数式を定数倍などに変更すると値が上昇することから、配列のいい関係などは間違っていないと思うのですが、解決方法がわかりません。
まだ、pythonに関しては初心者であるため読みにくいプログラムですが、教えていただけると幸いです。

c++

1#include<iostream> 2#include<fstream> 3#include<vector> 4#include<cmath> 5#include<stdio.h> 6 7using namespace std; 8 9#define N 80000 //データ点数 10#define eta 0.0001 //ステップサイズ 11#define signal1 "origin_data/a04.txt" 12#define signal2 "origin_data/a27.txt" 13 14void Load(vector<double>&s,string signal) //ファイルの読み込み 15{ 16 double temp; 17 ifstream ist(signal); 18 for(int i=0;i<N;++i) 19 { 20 ist>>temp; 21 s.push_back(temp); 22 } 23} 24 25void Normalization(vector<double> &s) //原信号の正規化 26{ 27 double sum = 0, avg, stdev; 28 for(int i=0;i<N;++i) 29 { 30 sum += s[i]; 31 } 32 avg = sum/N; 33 for(int i=0;i<N;++i) 34 { 35 sum += pow(s[i] - avg,2); 36 } 37 stdev = sqrt(sum / N); //標準偏差を求める 38 for(int i=0;i<N;++i) 39 { 40 s[i] = (s[i] - avg) / stdev; //正規化を行う 41 } 42} 43 44void Print(vector<double>x1, vector<double>x2) //ファイルの出力 45{ 46 ofstream ost1("output/a.txt"); 47 ofstream ost2("output/b.txt"); 48 for (int i = 0; i < N; i++) 49 { 50 ost1 << x1[i] << endl; 51 ost2 << x2[i] << endl; 52 } 53} 54 55 56int main() 57{ 58 vector<double> s1,s2; 59 double a1[2] = {1.0, 0.5}; //インパルス応答 60 double a2[2] = {0.3, 2.0}; 61 62 Load(s1, signal1); 63 Normalization(s1); 64 65 Load(s2, signal2); 66 Normalization(s2); 67 68//混合信号の作成 69 vector<double> x1, x2; 70 for(int i=0;i<N;++i) 71 { 72 x1.push_back(a1[0]*s1[i] + a1[1]*s2[i]); 73 x2.push_back(a2[0]*s1[i] + a2[1]*s2[i]); 74 } 75 76//分離更新 77 vector<double>y1,y2; //分離信号 78 vector<double>w11,w12,w21,w22; //分離行列 79 vector<double>fai1,fai2; //スコア関数 80 w11.push_back(1); 81 w12.push_back(0); 82 w21.push_back(0); 83 w22.push_back(1); 84 for (int i = 0; i < N; i++) 85 { 86 y1.push_back(w11[i]*x1[i] + w12[i]*x2[i]); 87 y2.push_back(w21[i]*x1[i] + w22[i]*x2[i]); 88 fai1.push_back(atan(y1[i])); 89 fai2.push_back(atan(y2[i])); 90 w11.push_back(w11[i] + eta * ((1-fai1[i]*y1[i])*w11[i] - fai1[i]*y2[i]*w21[i])); 91 w12.push_back(w12[i] + eta * ((1-fai1[i]*y1[i])*w12[i] - fai1[i]*y2[i]*w22[i])); 92 w21.push_back(w21[i] + eta * ((1-fai2[i]*y2[i])*w21[i] - fai2[i]*y1[i]*w11[i])); 93 w22.push_back(w22[i] + eta * ((1-fai2[i]*y2[i])*w22[i] - fai2[i]*y1[i]*w12[i])); 94 }

イメージ説明

python

1import numpy as np 2import matplotlib.pyplot as plt 3import scipy.stats as sp 4import math 5 6N, eta = 80000, 0.0001 7A = np.array([[1.0, 0.5], [0.3, 2.0]]) 8s1 = np.loadtxt('origin_data/a04.txt') 9s2 = np.loadtxt('origin_data/a27.txt') 10 11s1 = sp.zscore(s1) 12s2 = sp.zscore(s2) 13 14x = np.array([[0 for i in range(N)] for j in range(2)]) 15for i in range (N): 16 for j in range(2): 17 x[j][i] = A[j][0]*s1[i] + A[j][1]*s2[i] 18 19y = np.array([[0 for i in range(N)] for j in range(2)]) 20w = np.array([[[0 for i in range(N)] for j in range(2)] for k in range(2)]) 21fai = np.array([[0 for i in range(N)] for j in range(2)]) 22w[0][0][0], w[0][1][0], w[1][0][0], w[1][1][0] = 1, 0, 0, 1 23 24for j in range(2): 25 y[j][0] = w[j][0][0]*x[0][0] + w[j][1][0]*x[1][0] 26 fai[j][0] = math.atan(y[j][0]) 27 28for i in range(N-1): 29 for j in range(2): 30 y[j][i+1] = w[j][0][i]*x[0][i] + w[j][1][i]*x[1][i] 31 fai[j][i+1] = math.atan(y[j][i]) 32 w[0][j][i+1] = w[0][j][i] + eta * ((1-fai[0][i]*y[0][i])*w[0][j][i] - fai[0][i]*y[1][i]*w[1][j][i]) 33 w[1][j][i+1] = w[1][j][i] + eta * ((1-fai[1][i]*y[1][i])*w[1][j][i] - fai[1][i]*y[0][i]*w[0][j][i])

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ちゃんと見ていないのでこれが原因かはちょっと自信ないのですが、
Pythonに変更する際、yとfaiとwを、y1, y2という別変数から配列にしているようです。
yとfaiはいいのですが、元々はwは1つ(実際には4つ)であるものを2つ(実際には8つ)に増やされています。
また、wxxの値の計算にはy1とy2両方が必要なはずですが、jのループ内でwを計算しているため、少なくともjが0の時には計算に使用する値がおかしいものと思われます。

wは2次元配列に戻し、jのループではなくiのループで計算したら、またちょっと変わるかもしれません。

蛇足ですが、入力値が必要なプログラムの質問の時は、現象が再現するテストデータと、
それを実行した結果があると確認がしやすいです。

投稿2020/02/07 04:49

moredeep

総合スコア1507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itsukidesu

2020/02/07 06:55

回答ありがとうございます。wの数が増えていることに気づきませんでした。配列に対するイメージが足りていなかったようなので指摘の通りループ数を減らして、配列も次元を落とすことで求めていた結果が得られました。 質問に関するアドバイスもありがとうございます。回答が得られないこともあるのはそのような記述が足りていないためだお思うので今後追加していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問