USER
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from scipy.optimize import linprog
# Veri oluşturma ve hazırlama
np.random.seed(42)
def generate_data(num_days=587):
states = np.random.randint(-2, 3, (num_days, 2))
states[:, 1] = np.random.randint(-1, 2, num_days) # İkinci boyut için -1, 0, 1
actions = np.random.randint(-1, 2, num_days)
return states, actions
states, actions = generate_data()
# Veriyi eğitim ve test setlerine ayırma
X_train, X_test, y_train, y_test = train_test_split(states, actions, test_size=0.2, random_state=42)
# Davranış Klonlama (BC)
class BehaviorCloning:
def __init__(self):
self.model = LogisticRegression(multi_class='ovr', solver='lbfgs')
def train(self, states, actions):
self.model.fit(states, actions)
def predict(self, states):
return self.model.predict(states)
# Linear Inverse Reinforcement Learning (LIRL)
class LIRL:
def __init__(self, num_states, num_actions, gamma=0.99):
self.num_states = num_states
self.num_actions = num_actions
self.gamma = gamma
self.rewards = np.zeros(num_states)
def train(self, states, actions, transitions):
feature_expectations = np.zeros(self.num_states)
for s in states:
feature_expectations[self.state_to_index(s)] += 1
c = -feature_expectations
A_ub = []
b_ub = []
for s in range(self.num_states):
for a in range(self.num_actions):
constraint = np.zeros(self.num_states)
for next_s in range(self.num_states):
constraint[s] -= transitions[s, a, next_s]
constraint[next_s] += self.gamma * transitions[s, a, next_s]
A_ub.append(constraint)
b_ub.append(0)
A_ub = np.array(A_ub)
b_ub = np.array(b_ub)
res = linprog(c, A_ub=A_ub, b_ub=b_ub, method='highs')
if res.success:
self.rewards = res.x
else:
print("LIRL optimization failed.")
def predict(self, state):
state_index = self.state_to_index(state)
q_values = np.zeros(self.num_actions)
for a in range(self.num_actions):
q_values[a] = self.rewards[state_index]
return np.argmax(q_values) - 1 # -1, 0, 1 için düzeltme
def state_to_index(self, state):
# 2D state'i tek bir indekse dönüştür
return (state[0] + 2) * 3 + (state[1] + 1)
# Durum geçiş modelini oluşturma
def create_transition_model(num_states, num_actions):
transitions = np.zeros((num_states, num_actions, num_states))
for s in range(num_states):
for a in range(num_actions):
next_states = np.random.choice(num_states, size=10, replace=True)
for next_s in next_states:
transitions[s, a, next_s] += 0.1
return transitions
num_states = 15
num_actions = 3
transitions = create_transition_model(num_states, num_actions)
# BC modeli eğitme ve test etme
bc_model = BehaviorCloning()
bc_model.train(X_train, y_train)
bc_predictions = bc_model.predict(X_test)
bc_accuracy = np.mean(bc_predictions == y_test)
# LIRL modeli eğitme ve test etme
lirl_model = LIRL(num_states, num_actions)
lirl_model.train(X_train, y_train, transitions)
lirl_predictions = np.array([lirl_model.predict(s) for s in X_test])
lirl_accuracy = np.mean(lirl_predictions == y_test)
print(f"Behavior Cloning Accuracy: {bc_accuracy:.4f}")
print(f"LIRL Accuracy: {lirl_accuracy:.4f}")
# Öğrenilen ödül fonksiyonunu görselleştirme
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.bar(range(num_states), lirl_model.rewards)
plt.title("LIRL Learned Reward Function")
plt.xlabel("State")
plt.ylabel("Reward")
plt.show()
Kodu düzeltASSISTANT
Kodunuzda, LIRL (Linear Inverse Reinforcement Learning) modelinin tahmin metodu doğru bir şekilde implement edilmemiş. Özellikle, ödül fonksiyonu elde edildikten sonra ilgili politikayı (policy) çıkarıp tahminlerde kullanmamız gerekiyor. Şu anki kodda `predict` fonksiyonu sadece ödül fonksiyonunu kullanarak aynı değerleri dönüyor, bu da tahminlerin anlamlı olmamasına yol açıyor.
Aşağıda, LIRL modelinizi düzeltecek şekilde kodunuzu güncelledim. Bu güncelleme ile ödül fonksiyonunu kullanarak optimal politikayı hesaplıyor ve tahmin işleminde bu politikayı kullanıyoruz.
```python
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from scipy.optimize import linprog
# Veri oluşturma ve hazırlama
np.random.seed(42)
def generate_data(num_days=587):
states = np.random.randint(-2, 3, (num_days, 2))
states[:, 1] = np.random.randint(-1, 2, num_days) # İkinci boyut için -1, 0, 1
actions = np.random.randint(-1, 2, num_days)
return states, actions
states, actions = generate_data()
# Veriyi eğitim ve test setlerine ayırma
X_train, X_test, y_train, y_test = train_test_split(states, actions, test_size=0.2, random_state=42)
# Davranış Klonlama (BC)
class BehaviorCloning:
def __init__(self):
self.model = LogisticRegression(multi_class='ovr', solver='lbfgs')
def train(self, states, actions):
self.model.fit(states, actions)
def predict(self, states):
return self.model.predict(states)
# Linear Inverse Reinforcement Learning (LIRL)
class LIRL:
def __init__(self, num_states, num_actions, gamma=0.99):
self.num_states = num_states
self.num_actions = num_actions
self.gamma = gamma
self.rewards = np.zeros(num_states)
self.policy = np.zeros(num_states, dtype=int)
def train(self, states, actions, transitions):
feature_expectations = np.zeros(self.num_states)
for s in states:
feature_expectations[self.state_to_index(s)] += 1
c = -feature_expectations
A_ub = []
b_ub = []
for s in range(self.num_states):
for a in range(self.num_actions):
constraint = np.zeros(self.num_states)
for next_s in range(self.num_states):
constraint[s] -= transitions[s, a, next_s]
constraint[next_s] += self.gamma * transitions[s, a, next_s]
A_ub.append(constraint)
b_ub.append(0)
A_ub = np.array(A_ub)
b_ub = np.array(b_ub)
res = linprog(c, A_ub=A_ub, b_ub=b_ub, method='highs')
if res.success:
self.rewards = res.x
self.compute_policy(transitions)
else:
print("LIRL optimization failed.")
def compute_policy(self, transitions):
# Değer iterasyonu ile optimal politikayı hesapla
V = np.zeros(self.num_states)
delta = 1
threshold = 1e-5
max_iterations = 1000
iteration = 0
while delta > threshold and iteration < max_iterations:
delta = 0
for s in range(self.num_states):
v = V[s]
q_values = np.zeros(self.num_actions)
for a in range(self.num_actions):
q = 0
for next_s in range(self.num_states):
q += transitions[s, a, next_s] * (self.rewards[next_s] + self.gamma * V[next_s])
q_values[a] = q
V[s] = np.max(q_values)
delta = max(delta, abs(v - V[s]))
iteration += 1
# Politika çıkarımı
for s in range(self.num_states):
q_values = np.zeros(self.num_actions)
for a in range(self.num_actions):
q = 0
for next_s in range(self.num_states):
q += transitions[s, a, next_s] * (self.rewards[next_s] + self.gamma * V[next_s])
q_values[a] = q
self.policy[s] = np.argmax(q_values)
self.V = V
def predict(self, state):
state_index = self.state_to_index(state)
action_index = self.policy[state_index]
return action_index - 1 # -1, 0, 1 için düzeltme
def state_to_index(self, state):
# 2D state'i tek bir indekse dönüştür
return (state[0] + 2) * 3 + (state[1] + 1)
# Durum geçiş modelini oluşturma
def create_transition_model(num_states, num_actions):
transitions = np.zeros((num_states, num_actions, num_states))
for s in range(num_states):
for a in range(num_actions):
next_states = np.random.choice(num_states, size=10, replace=True)
for next_s in next_states:
transitions[s, a, next_s] += 0.1
transitions[s, a, :] = transitions[s, a, :] / transitions[s, a, :].sum() # Normalize et
return transitions
num_states = 15
num_actions = 3
transitions = create_transition_model(num_states, num_actions)
# BC modeli eğitme ve test etme
bc_model = BehaviorCloning()
bc_model.train(X_train, y_train)
bc_predictions = bc_model.predict(X_test)
bc_accuracy = np.mean(bc_predictions == y_test)
# LIRL modeli eğitme ve test etme
lirl_model = LIRL(num_states, num_actions)
lirl_model.train(X_train, y_train, transitions)
lirl_predictions = np.array([lirl_model.predict(s) for s in X_test])
lirl_accuracy = np.mean(lirl_predictions == y_test)
print(f"Behavior Cloning Accuracy: {bc_accuracy:.4f}")
print(f"LIRL Accuracy: {lirl_accuracy:.4f}")
# Öğrenilen ödül fonksiyonunu görselleştirme
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.bar(range(num_states), lirl_model.rewards)
plt.title("LIRL Learned Reward Function")
plt.xlabel("State")
plt.ylabel("Reward")
plt.show()
```
**Açıklamalar:**
1. **LIRL `predict` Fonksiyonu Güncellendi:** Artık `predict` fonksiyonu, öğrenilen politikayı kullanarak tahmin yapıyor. Önceden tüm eylemler için aynı ödül değerini kullanıyordu, bu da doğru olmayan tahminlere yol açıyordu.
2. **Politika Hesaplama (`compute_policy` Metodu):** LIRL modeline `compute_policy` adında yeni bir metod ekledik. Bu metod, değer iterasyonu kullanarak optimal politikayı hesaplıyor.
3. **Değer İterasyonu:** Değer iterasyonu, mümkün olan tüm durumlar için değer fonksiyonunu ve ardından politikayı hesaplıyor. Bu sayede, model ödül fonksiyonunu öğrendikten sonra bu ödül fonksiyonuna göre en iyi eylemleri seçebiliyor.
4. **Normalize Edilmiş Geçiş Olasılıkları:** `create_transition_model` fonksiyonunda, geçiş olasılıklarını normalize ettik. Bu sayede, her eylem için geçiş olasılıklarının toplamı 1 oluyor ve değer iterasyonu daha doğru çalışıyor.
5. **Eylem İndekslerinin Düzeltilmesi:** Eylem indekslerini doğru bir şekilde eylem değerlerine (`-1`, `0`, `1`) eşleştirdik.
Bu değişikliklerle birlikte kodunuz artık doğru bir şekilde çalışmalı ve LIRL modeli tahminlerinde öğrenilen politikayı kullanarak daha anlamlı sonuçlar üretecektir.