Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
 
flernuar
0 / 0 / 0
Регистрация: 12.04.2019
Сообщений: 8
1

Какие алдьтернативные методы восстановления некластеризуемых данных? (решение на основе WGAN)

22.04.2019, 16:22. Просмотров 262. Ответов 0

Имеется GAN (Generative adversarial network), а именно Wasserstein GAN (с ограничением весов нейронок clip'ом).

Датасет: массив данных 18000 строк, 10 столбцов (признаков). значение каждого признака варьируется в промежутке [0,1]
плохие (полностью нулевые или почти нулевые) данные уже отсечены.

learn data: 15000 строк
test data : 3000 строк

в test data вычищаю 7ой ([:, 6]) столбец, чтобы проверить работоспособность метода значением RMSE.

Обучаю нейронки на learn data.

Далее нахожу для каждой строки из test data ближайшее значение 7ого признака по заполненным остальным данным:

Код
z_loss = tf.reduce_mean((G_prob_z_full - data_pl)*(G_prob_z_full - data_pl))   #data_pl - строка из 9 заполненных значений из test data
 
train_step_z = tf.train.AdamOptimizer(learning_rate=10e-4).minimize(z_loss, var_list=z0) #z0 - вектор на входе генерирующей нейросети (10 признаков)

обучение нейронки:

Код
mb_size = 64
X_dim = 10
z_dim = 10
h_dim = 128



def xavier_init(size):
    in_dim = size[0]
    xavier_stddev = 1. / tf.sqrt(in_dim / 2.)
    return tf.random_normal(shape=size, stddev=xavier_stddev)


X = tf.placeholder(tf.float32, shape=[None, X_dim])

D_W1 = tf.Variable(xavier_init([X_dim, h_dim]))
D_b1 = tf.Variable(tf.zeros(shape=[h_dim]))

D_W2 = tf.Variable(xavier_init([h_dim, 1]))
D_b2 = tf.Variable(tf.zeros(shape=[1]))

theta_D = [D_W1, D_W2, D_b1, D_b2]


z = tf.placeholder(tf.float32, shape=[None, z_dim])

G_W1 = tf.Variable(xavier_init([z_dim, h_dim]))
G_b1 = tf.Variable(tf.zeros(shape=[h_dim]))

G_W2 = tf.Variable(xavier_init([h_dim, X_dim]))
G_b2 = tf.Variable(tf.zeros(shape=[X_dim]))

theta_G = [G_W1, G_W2, G_b1, G_b2]


def sample_z(m, n):
    return np.random.uniform(-1., 1., size=[m, n])


def generator(z):
    G_h1 = tf.nn.relu(tf.matmul(z, G_W1) + G_b1)
    G_log_prob = tf.matmul(G_h1, G_W2) + G_b2
    G_prob = tf.nn.sigmoid(G_log_prob)
    #G_prob = tf.nn.relu(G_log_prob)
    return G_prob


def discriminator(x):
    D_h1 = tf.nn.relu(tf.matmul(x, D_W1) + D_b1)
    out = tf.matmul(D_h1, D_W2) + D_b2
    return out


G_sample = generator(z)
D_real = discriminator(X)
D_fake = discriminator(G_sample)


D_loss = tf.reduce_mean(D_real) - tf.reduce_mean(D_fake) 
G_loss = -tf.reduce_mean(D_fake)


D_solver = (tf.train.RMSPropOptimizer(learning_rate=1e-4)
            .minimize(-D_loss, var_list=theta_D))
G_solver = (tf.train.RMSPropOptimizer(learning_rate=1e-4)
            .minimize(G_loss, var_list=theta_G))

clip_D = [p.assign(tf.clip_by_value(p, -100, 100)) for p in theta_D]

#GradientDescent finding best noise
#----------------------------------------------------------------------------------------
data_pl = tf.placeholder(tf.float32, shape=(1,9))
z0 = tf.Variable(tf.zeros(shape=[1,z_dim]))
G_h1_z = tf.matmul(z0, G_W1) + G_b1
G_log_prob_z = tf.matmul(G_h1_z, G_W2) + G_b2
G_prob_z = tf.nn.sigmoid(G_log_prob_z)

ind = tf.constant([0, 1, 2, 3, 4, 5, 7, 8, 9])
G_prob_z_full = tf.transpose(tf.nn.embedding_lookup(tf.transpose(G_prob_z), ind))
ind_miss=tf.constant([6])
G_prob_z_miss = tf.transpose(tf.nn.embedding_lookup(tf.transpose(G_prob_z), ind_miss))

#sess = tf.Session()

z_loss = tf.reduce_mean((G_prob_z_full - data_pl)*(G_prob_z_full - data_pl))

reassign_z0 = tf.assign(z0, tf.zeros(shape=[1,z_dim]))

train_step_z = tf.train.AdamOptimizer(learning_rate=10e-4).minimize(z_loss, var_list=z0)

dml_full=np.append(dml[:,:6], dml[:,7:],axis=1)

G_pr_z_miss = np.zeros((l-15000))
G_pr_z=np.zeros((l-15000,9))

#------------------------------------------------------------------------------------------
sess = tf.Session()
sess.run(tf.global_variables_initializer())

def next_batch(num, data):
    '''
    Return a total of `num` random samples and labels. 
    '''
    idx = np.arange(0 , data.shape[0])
    np.random.shuffle(idx)
    idx = idx[:num]
    data_shuffle = [data[i] for i in idx]
 
    return np.asarray(data_shuffle)
    
i = 0

for it in range(50000):
    for _ in range(5):
        X_mb = next_batch(mb_size, dml)
        _, D_loss_curr, _ = sess.run(
            [D_solver, D_loss, clip_D],
            feed_dict={X: X_mb, z: sample_z(mb_size, z_dim)}
        )

    _, G_loss_curr = sess.run(
        [G_solver, G_loss],
        feed_dict={z: sample_z(mb_size, z_dim)}
    )
    #samples = np.zeros((1000000,10,100), dtype = np.float32)
    if it % 20000 == 0:
        print('Iter: {}; D loss: {:.4}; G_loss: {:.4}'
              .format(it, D_loss_curr, G_loss_curr))
как пример, нахождение значение признака с индексом 6 для 89ой строки (G_prob_z_curr[i,6]):
Код
dmt_full=np.append(dmt[:,:6], dmt[:,7:],axis=1)
start = time. time()

nl=100
G_prob_z_curr = np.zeros((nl,10))

for i in range(89, 90):
    if i % 20 == 0:
        print(i)
        end = time. time()
        #print(end - start)
        
    for it in range(100001):
        
        _, loss1, z0_curr, G_prob_z_curr[i,:] = sess.run([train_step_z, z_loss, z0, G_prob_z], feed_dict={data_pl :  dmt_full[i,:].reshape((1, 9))})
        if it%10000==0:
            print(loss1, G_prob_z_curr[i,:])
    sess.run(reassign_z0)
в результате (жирным выделил нужный признак, z_loss курсивом):
#0 итераций:
4.559742e-05 [0.00993958 0.00220129 0.00655714 0.0039838 0.00138375 0.00190324
0.00090161 0.00164524 0.00123517 0.00774178]
#10000 итераций:
1.2680157e-08 [1.49780512e-03 1.15661025e-02 2.08586454e-04 3.83257866e-05
4.55677509e-05 1.31114423e-02 2.77638435e-03 2.98023224e-08
1.24690114e-05 2.57591746e-04]
#20000 итераций:
3.6052623e-09 [1.51634216e-03 1.16047263e-02 1.12265348e-04 2.43782997e-05
3.13520432e-05 1.31382346e-02 2.74524093e-03 0.00000000e+00
6.12493295e-06 1.39984026e-04]
2.0957482e-09 [1.51944160e-03 1.16084218e-02 8.56220722e-05 2.00271606e-05
2.65240669e-05 1.31399930e-02 2.72920728e-03 0.00000000e+00
4.47794673e-06 1.07212378e-04]
1.6638412e-09 [1.52248144e-03 1.16370022e-02 7.19726086e-05 1.74939632e-05
2.37822533e-05 1.31662786e-02 2.72333622e-03 0.00000000e+00
3.65926780e-06 9.03617838e-05]
1.1333017e-09 [1.52128935e-03 1.16092563e-02 6.30319118e-05 1.58548355e-05
2.19345093e-05 1.31397247e-02 2.70926952e-03 0.00000000e+00
3.14032309e-06 7.94278312e-05]
1.0936777e-09 [1.52346492e-03 1.16360188e-02 5.69820404e-05 1.47223473e-05
2.05934048e-05 1.31646991e-02 2.70739198e-03 0.00000000e+00
2.78794482e-06 7.18631418e-05]
7.8446516e-10 [1.52227283e-03 1.16145313e-02 5.22732735e-05 1.37686729e-05
1.94609165e-05 1.31442547e-02 2.69734859e-03 0.00000000e+00
2.51983283e-06 6.60212900e-05]
6.6668293e-10 [1.52197480e-03 1.16063356e-02 4.85181808e-05 1.29938126e-05
1.85966492e-05 1.31364167e-02 2.69067287e-03 0.00000000e+00
2.31192780e-06 6.14310557e-05]
5.8638006e-10 [1.52239203e-03 1.16100013e-02 4.55081463e-05 1.23679638e-05
1.79111958e-05 1.31397843e-02 2.68682837e-03 0.00000000e+00
2.14557031e-06 5.77162318e-05]
#100000 итераций:
5.2291266e-10 [1.52212381e-03 1.16048455e-02 4.30047512e-05 1.18911266e-05
1.71661377e-05 1.31348968e-02 2.68164277e-03 0.00000000e+00
2.00715999e-06 5.45943767e-05]

реальное значение 89 строки test dataset
[1.52341407e-03 1.16079712e-02 0.00000000e+00 1.33478026e-09
7.94060775e-06 1.31371809e-02 8.33663705e-03 3.44640262e-06
9.63711345e-07 3.59723279e-06]

в результате z_loss отлично сходится и алгоритм работает. однако RMSE получается очень большой.
1. Как можно преобразовать данные? кластеризация k-средним работает очень плохо на них. может существуют еще какие-то методы приведения датасета к нужному виду?

2. какой метод заполнения данных можно еще реализовать? по значению z_loss WGAN дает очень неплохие результаты, но они далеки от идеала. смею предположить, что любая грамотная сетка даст +- тот же результат
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2019, 16:22
Ответы с готовыми решениями:

Подскажите, какие методы используются для решения данных задач?
подскажите какие методы используются для решения данных задач

Какие виды и методы существуют для тестирования базы данных Access?
Какие виды и методы существуют для тестирования базы данных Aceess?

Для абстрактного класса определить какие методы должны быть абстрактными, а какие обычными.
1. Полную структуру классов и их взаимосвязь продумать самостоятельно. 2. Для абстрактного класса...

Методы восстановления RAR архивов
Существует ли в природе утилит который производит восстановления RAR архивов путём сравнения...

Методы восстановления аппаратуры после сбоя
Здравствуйте.Посоветуйте какую-нибудь литературу ,где пожно найти информацию о методах...

0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2019, 16:22

Какие изменения происходят при откате к точке восстановления ?
Если я создам точку восстановления системы а потом установлю какую нибудь программу. Эта программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru