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

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

ただいまの
回答率

89.85%

自己符号化器による等価変換

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 404

atena

score 17

等価変換がうまくいきません.原因が分かる方がいらっしゃれば教えていただきたいです.

#coding:utf-8

import sys
import numpy
import csv

class Sandglass:

    def __init__(self, n_input, n_hidden):
        self.hidden_weight = numpy.random.randn(n_hidden, n_input + 1)
        self.output_weight = numpy.random.randn(n_input, n_hidden + 1)

    def fit(self, X, epsilon, epoch):
        self.error = numpy.zeros(epoch)
        N = X.shape[0]
        for epo in range(epoch):
            print (u'epoch: %d' % epo)
            count = 0
            for x in X:
                count += 1
                self.__update_weight(x, epsilon, count)

            self.error[epo] = self.__calc_error(X)
        with open('error15.csv','a',newline='') as f:
            writer = csv.writer(f)
            writer.writerow(self.error)
        f.close()

    def encode(self, X):
        Z = numpy.zeros((X.shape[0], self.hidden_weight.shape[0]))
        Y = numpy.zeros(X.shape)
        for (i, x) in enumerate(X):
            z, y = self.__forward(x)
            Z[i, :] = z
            Y[i, :] = y

        return (Z, Y)

    def __forward(self, x):
        z = self.hidden_weight.dot(numpy.hstack((1, x)))
        y = self.output_weight.dot(numpy.hstack((1, z)))

        return (z, y)

    def __update_weight(self, x, epsilon, c):
        z, y = self.__forward(x)

        # update output_weight
        output_delta = y - x
        self.output_weight -= epsilon * output_delta.reshape(-1, 1) * numpy.hstack((1, z))

        # update hidden_weight
        hidden_delta = self.output_weight[:, 1:].T.dot(output_delta)
        self.hidden_weight -= epsilon * hidden_delta.reshape(-1, 1) * numpy.hstack((1, x))

        if (c == 1):
            with open('inout21.csv','a',newline='') as f:
                writer = csv.writer(f)
                writer.writerow(x)
                writer.writerow(y)
            f.close()

    def __calc_error(self, X):
        N = X.shape[0]
        err = 0.0
        for x in X:
            _, y = self.__forward(x)
            err += (y - x).dot(y - x) / 2.0

        return err

def ReadDatafile(args):
    return numpy.loadtxt(args, delimiter=',', dtype='float')

def min_max(x, axis=None):
    # 正規化(0,1)
    min = x.min(axis=axis, keepdims=True)
    max = x.max(axis=axis, keepdims=True)
    result = (x-min)/(max-min)
    return result

if __name__ == '__main__':

    args = sys.argv

    print ('read data...')
    train = ReadDatafile(args[1])
    x = min_max(train)
#    x = train
    input_size = x.shape[1]
    hidden_size = 2
    epsilon = 0.01
    epoch = 10000
    stride = 2

    print ('Sandglass init...')
    sand = Sandglass(input_size, hidden_size)

    print ('train...')
    sand.fit(x[::stride], epsilon, epoch)

    test = ReadDatafile(args[2])
    y = min_max(test)
#    y = test

    print ('encode...')
    Z, Y = sand.encode(y[::stride])
    with open('out21.csv','a',newline='') as f:
        writer = csv.writer(f)
        writer.writerow(Y)
    f.close()

元データと学習後の出力値
[0.147804867    0.300808975    0.468231146    0.657795291    0.0211587]
[0.164786818    0.290982418    0.467763505    0.661981791    0.026323475]

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

およそ相関が取れているように見えます。
うまくいかないというのはどういうことでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/14 19:08

    教師データは入力データですね.
    5つ目は差は小さいですが,割合的には[88.5105606, 96.7332899, 99.900126, 99.3635558, 75.5902972]と
    一番等価変換が為されていないと思うのですが大丈夫なんでしょうか?

    キャンセル

  • 2018/02/14 19:15

    それはモデルにおける相対誤差と絶対誤差の問題ですね。
    大きな数を持つ教師データに対して学習したモデルで小さな数を入れると相対誤差が大きくなるのは致し方のないことです。
    対数変換してからモデルを学習させると相対誤差を減らすことが可能なはずです。

    キャンセル

  • 2018/02/14 19:20

    なるほど!!そういうことだったんですね.ありがとうございます.納得しました!

    キャンセル

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

  • ただいまの回答率 89.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる