現在、c言語で行ったプログラムをpythonに変換してプログラムを書こうとしています。
目的としている処理はfor文の中で y, s, faiの値を更新していくプログラムです。
- 初期値としてxはすべて既知のデータでwの初期値のみが与えられています。
- xとwの初期値をもとにyを求める。
- yをアークタンジェントとしたものをfaiとします。
- yとfaiをプログラムに書かれている式に挿入し次wを求める。
- 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])
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/07 06:55