<jupyter_start><jupyter_text>"안녕! Tensorflow Probability - 3"> "통계 추론을 위한 Tensorflow Probability 라이브러리 맛보기 "- toc: true- badges: true- author: 단호진- categories: [ppl]<jupyter_code>import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

import tensorflow as tf
from tensorflow.keras import models, layers
import tensorflow_probability as tfp

tfd = tfp.distributions

if tf.test.gpu_device_name() != '/device:GPU:0':
    print('WARNING: GPU device not found.')
else:
    print('SUCCESS: Found GPU: {}'.format(tf.test.gpu_device_name()))<jupyter_output>SUCCESS: Found GPU: /device:GPU:0<jupyter_text>데이터가상의 데이터에 대하여 회귀 문제를 구성해 보자. 다음 코드는 [확률젹 회귀](https://www.tensorflow.org/probability/examples/Probabilistic_Layers_Regression) 튜토리얼에서 따온 것이다. 이전 포스트에 이어 분석을 진행해 보겠다.<jupyter_code>w0 = 0.125
b0 = 5.
x_range = [-20, 60]

def load_dataset(n=150, n_tst=150):
    np.random.seed(43)
    def s(x):
        g = (x - x_range[0]) / (x_range[1] - x_range[0])
        return 3 * (0.25 + g**2.)
    
    x = (x_range[1] - x_range[0]) * np.random.rand(n) + x_range[0]
    eps = np.random.randn(n) * s(x)
    y0 = (w0 * x * (1. + np.sin(x)) + b0)
    y = y0 + eps
    x = x[..., np.newaxis]
    x_tst = np.linspace(*x_range, num=n_tst).astype(np.float32)
    x_tst = x_tst[..., np.newaxis]
    return y0, y, x, x_tst

y0, y, x, x_tst = load_dataset()
ax = sns.lineplot(x=x.squeeze(), y=y0)
ax = sns.scatterplot(x=x.squeeze(), y=y, color=sns.color_palette()[1])
ax.set_aspect('equal');<jupyter_output><empty_output><jupyter_text>모델6관측 데이터는 이분산성을 보인다. 변동에 대한 표준 편차도 선형으로 변한다고 생각하고 모델을 세우고 싶다. 이를 위하여 Dense 층을 추가하여 하나는 평균에 하나는 표준 편차에 부가하여 확률 변수를 얻겠다.<jupyter_code>mod_6 = models.Sequential([
    layers.Input(1),
    layers.Dense(2),
    tfp.layers.DistributionLambda(
        lambda t: tfd.Normal(
            loc=t[..., :1],
            scale=tf.math.pow(1e-3 + tf.math.softplus(0.01 * t[..., 1:]), 2.0))
    )
])

mod_6.summary()
epochs = 5000

negloglik = lambda y, rv_y: -rv_y.log_prob(y)
mod_6.compile(optimizer=tf.optimizers.Adam(learning_rate=0.01), loss=negloglik)
history = mod_6.fit(x, y, epochs=epochs, verbose=False)
[print(np.squeeze(w.numpy())) for w in mod_6.weights];
df = history.history
df['epoch'] = list(range(epochs))
df = pd.DataFrame(df)

ax = sns.lineplot(data=df, x='epoch', y='loss')
ax.set_yscale('log');
fig, ax = plt.subplots(figsize=(10, 5))

ax = sns.scatterplot(x=x.squeeze(), y=y, color='orange', label='observed')

rv_yhat = mod_6(x_tst)
ax = sns.scatterplot(x=x_tst.squeeze(), y=rv_yhat.sample().numpy().squeeze(), color='b',
                     label='sample')
ax.set_aspect('equal')
ax.legend();<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.16765358993338267, 'fraction_numerical': 0.026646928201332347, 'mean_word_length': 3.96875, 'pattern_counts': {'":': 0, '<': 12, '<?xml version=': 0, '>': 13, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '404625', 'license': 'Apache-2.0', 'n_tokens_mistral': 1326, 'n_tokens_neox': 1388, 'n_words': 241, 'path': '_notebooks/2021-01-17-hello-tfp3.ipynb', 'repo_name': 'danhojin/jupyter-blog', 'size': '2702'}