ml-2023SZ/zad3.py

77 lines
2.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import numpy as np
import matplotlib.pyplot as plt
import csv
data = csv.reader(open("fires_thefts.csv"), delimiter=',')
x = list()
y = list()
for xi, yi in data:
x.append(float(xi))
y.append(float(yi))
def h(theta, x):
return theta[0] + theta[1] * x
def J(h, theta, x, y):
"""Funkcja kosztu"""
m = len(y)
return 1.0 / (2 * m) * sum((h(theta, x[i]) - y[i]) ** 2 for i in range(m))
def gradient_descent(h, cost_fun, theta, x, y, alpha, eps):
current_cost = cost_fun(h, theta, x, y)
history = [
[current_cost, theta]
] # zapiszmy wartości kosztu i parametrów, by potem zrobić wykres
m = len(y)
while True:
new_theta = [
theta[0] - alpha / float(m) * sum(h(theta, x[i]) - y[i] for i in range(m)),
theta[1]
- alpha / float(m) * sum((h(theta, x[i]) - y[i]) * x[i] for i in range(m)),
]
theta = new_theta # jednoczesna aktualizacja - używamy zmiennej tymczasowej
try:
prev_cost = current_cost
current_cost = cost_fun(h, theta, x, y)
except OverflowError:
break
if abs(prev_cost - current_cost) <= eps:
break
history.append([current_cost, theta])
return theta, history
alfa = 0.001
eps = 0.00001
best_theta, history = gradient_descent(h, J, [0.0, 0.0], x, y, alfa, eps)
print("Wynik = ", np.matrix(best_theta), ", J(θ) = %.4f" % history[-1][0], "po %d iteracjach" % len(history))
print("Wynik dla eps = ", float(eps), ", α = ", alfa)
print("Predykcja dla 50 pożarów: ", h(best_theta, 50))
print("Predykcja dla 100 pożarów: ", h(best_theta, 100))
print("Predykcja dla 200 pożarów: ", h(best_theta, 200))
best_theta, history_1 = gradient_descent(h, J, [0.0, 0.0], x, y, 0.01, eps)
best_theta, history_01 = gradient_descent(h, J, [0.0, 0.0], x, y, 0.025, eps)
best_theta, history_0076 = gradient_descent(h, J, [0.0, 0.0], x, y, 0.0076, eps)
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(1, 1, 1)
ax.set_ylabel('Warto funkcji kosztu J(θ)')
ax.set_xlabel('Ilość iteracji')
ax.set_title("Wykres zależności między kosztem a różnymi wartościami α")
x_axis = np.arange(0, 201, 1)
y_01 = [history_1[i][0] for i in x_axis]
y_025 = [history_01[i][0] for i in x_axis]
y_0076 = [history_0076[i][0] for i in x_axis]
ax.plot(x_axis, y_01, color='brown', marker="x", label='0.01')
ax.plot(x_axis, y_025, color='purple', marker="o", label='0.025')
ax.plot(x_axis, y_0076, color='orange', marker="^", label='0.0076')
ax.legend()
plt.axis([0, 180, 0, 10**10])
plt.show()