storytelling / src /probability_emote.py
jitesh's picture
adds pe2
f5d1284
import numpy as np
import plotly.graph_objects as go
import streamlit as st
from .lib import set_input
@st.cache
def get_w(f, ec=0.86, rv=0.50):
result = (rv + f-1)/(ec + f-1)
result = np.clip(result, 0, 1)
# print(f'w = {result}')
return result
@st.cache
def get_f(w, ec=0.86, rv=0.50):
result = 1+(ec*w-rv)/(1-w)
result = np.clip(result, 0, 1)
# print(f'f = {result}')
return result
@st.cache
def get_pe(w, ec=0.86, f=0.50):
result = ec*w+(1-w)*(1-f)
result = np.clip(result, 0, 1)
# print(f'f = {result}')
return result
@st.cache
def get_pe2(w, ec=0.86, f=0.50):
result = 1-np.exp(-w*ec/(f+0.0001))
result = result
# result = np.clip(result, 0, 1)
# print(f'f = {result}')
return result
@st.cache(suppress_st_warning=True)
def get_pe3(w, ec=0.86, f=0.50):
result_np = np.zeros((len(f), len(f)))
st.markdown(result_np)
st.markdown(result_np[0])
for i, fi in enumerate(f):
result = 1-np.exp(-ec/f)
result = w*result
if i ==0:
result_np[i]=w*result
else:
result_np[i]=w*result + (1-w)*result_np[i-1]
# result = np.clip(result, 0, 1)
# print(f'f = {result}')
return result
xdata1 = np.arange(0, 1.1, step=0.01)
# rand = np.random.random_sample()
@st.cache
def proper_float(i):
return np.round(i, 2)
@st.cache
def get_text():
return '''
### Eric's proposal
> I would propose a scoring metric something like this:
> * `probability_emote = w * emotion_confidence + (1 - w) * frequency_penalty`
>
> Where:
> * emotion_confidence: a score from 0.0 to 1.0 representing the emotion model’s confidence in it’s classification results
> * frequency_penalty: a score from 0.0 to 1.0 where a high score penalizes frequent emotes
> * `frequency_penalty = 1 - emotion_frequency`
> * w: a weight from 0.0 to 1.0 that controls the balance between emotion_confidence and frequency_penalty
> * Then you generate a random number between 0.0 and 1.0 and emote if it is greater than probability_emote
> * You will have to set frequency_penalty and w through trial and error, but you can start with setting w=0.5 and giving the emotion classifier and frequency penalty equal weight.
> * Setting w=1.0 would disable the frequency penalty altogether
'''
@st.cache
def get_equation_text(w=0.5, ec=0.7, rand=None, emotion_frequency=None, graph_eq='PE1'):
if graph_eq=='PE1':
text = f'''
#### Equation
```
frequency_penalty = 1 - emotion_frequency
probability_emote = w * emotion_confidence + (1 - w) * frequency_penalty
```
**probability_emote** = {proper_float(w)} * {proper_float(ec)} + {proper_float(1-w)} * frequency_penalty
'''
if rand is not None:
frequency_penalty = proper_float(1-emotion_frequency)
probability_emote = proper_float((w)*(ec)+(1-w)*frequency_penalty)
text = f'''
#### Equation
```
frequency_penalty = 1 - emotion_frequency = 1 - {proper_float(emotion_frequency)} = {frequency_penalty}
probability_emote = w * emotion_confidence + (1 - w) * frequency_penalty
probability_emote = {proper_float(w)} * {proper_float(ec)} + {proper_float(1-w)} * {frequency_penalty}
```
**probability_emote** = {probability_emote}
```
Show_Emotion
= probability_emote > (Random value between 0 and 1)
Random value = {rand}
Show_Emotion = {probability_emote} > {rand}
```
**Show_Emotion** = {probability_emote > rand}
'''
elif graph_eq=='PE2' or graph_eq=='PE3':
# probability_emote = 1 - e ^ (frequency / emotion_confidence)
text = f'''
#### Equation
```
probability_emote = 1 - e ^ (- w * emotion_confidence / frequency)
```
**probability_emote** = 1 - e ^ (- {proper_float(w)} * {proper_float(ec)} / frequency)
'''
return text
def run_probability_emote(container_param):
graph_eq = container_param.selectbox('Select Equation', ['PE1', 'PE2', 'PE3'])
w = set_input(container_param,
label='Weight w', key_slider='w_slider', key_input='w_input',
min_value=0.,
max_value=1.,
value=.5,
step=.01,)
score = set_input(container_param,
label='Confidence Score', key_slider='score_slider', key_input='score_input',
min_value=0.,
max_value=1.,
value=.5,
step=.01,)
# score = container_param.slider(
# label='Confidence Score',
# min_value=0.,
# max_value=1.,
# value=.5,
# step=.01)
calculate_check = container_param.checkbox(label='Calculate', value=False)
if calculate_check:
emotion_frequency = set_input(container_param,
label='Emotion Frequency', key_slider='emotion_frequency_slider_slider', key_input='emotion_frequency_slider_input',
min_value=0.,
max_value=1.,
value=.5,
step=.01,)
rand = set_input(container_param,
label='Random Value', key_slider='rand_slider', key_input='rand_input',
min_value=0.,
max_value=1.,
value=.5,
step=.01,)
else:
emotion_frequency = 'emotion_frequency'
rand = None
st.markdown(get_equation_text(w=w, ec=score, rand=rand,
emotion_frequency=emotion_frequency, graph_eq=graph_eq))
fig = go.Figure()
# fig.add_trace(go.Scatter(x=xdata1, y=np.ones_like(xdata1)*rand,
# mode='markers', name='Random',
# line=dict(color='#ff8300', width=2)
# ))
if calculate_check:
dd = 0.01
fig.add_hline(y=rand, line_width=3,
line_dash="dash", line_color="#ff8300")
fig.add_vline(x=emotion_frequency, line_width=3,
line_dash="dash", line_color="green")
fig.add_trace(go.Scatter(
x=[emotion_frequency-dd, emotion_frequency+dd], y=[rand-dd, rand+dd],
mode='lines',
line=dict(color='#ee00ee', width=8)
),)
fig.add_trace(go.Scatter(
x=[emotion_frequency+dd, emotion_frequency-dd], y=[rand-dd, rand+dd],
mode='lines',
line=dict(color='#ee00ee', width=8)
),)
if graph_eq=='PE1': get_result = get_pe
elif graph_eq=='PE2': get_result = get_pe2
elif graph_eq=='PE3': get_result = get_pe3
fig.add_trace(go.Scatter(
x=xdata1, y=get_result(w=w, f=xdata1, ec=score),
mode='lines',
name='Probability-Emote',
line=dict(color='#00eeee', width=4)
),
)
fig.update_layout(
template='plotly_dark',
xaxis_range=[0., 1.],
yaxis_range=[0., 1.],
xaxis_title="Emotion Frequency",
yaxis_title="Probability Emote",
showlegend=False
)
st.plotly_chart(fig, use_container_width=True)
st.markdown(get_text())