diff --git a/DIRECTORY.md b/DIRECTORY.md index 64d595e2..ba5fadf8 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -151,6 +151,7 @@ * [Gradient Descent](https://github.com/bellshade/Python/blob/main/implementation/artificial_intelligence/gradient_descent.py) * [K Means Clutser](https://github.com/bellshade/Python/blob/main/implementation/artificial_intelligence/k_means_clutser.py) * [Linear Regression](https://github.com/bellshade/Python/blob/main/implementation/artificial_intelligence/linear_regression.py) + * [Logistic Regression](https://github.com/bellshade/Python/blob/main/implementation/artificial_intelligence/logistic_regression.py) * [Lstm](https://github.com/bellshade/Python/blob/main/implementation/artificial_intelligence/lstm.py) * Audio Filter * [Audio Response](https://github.com/bellshade/Python/blob/main/implementation/audio_filter/audio_response.py) diff --git a/implementation/artificial_intelligence/logistic_regression.py b/implementation/artificial_intelligence/logistic_regression.py new file mode 100644 index 00000000..7548ea12 --- /dev/null +++ b/implementation/artificial_intelligence/logistic_regression.py @@ -0,0 +1,75 @@ +# logistik regression adalah teknik analisis data yang +# menggunakan matematika untuk menemukan antara dua +# faktor data. kemudian menggunakan hubungan ini untuk +# memprediksi nilai dari salah satu faktor tersebut +# berdasarkan faktor yang lain. prediksi biasanya +# memiliki jumlh hasil yang terbata, antara ya dan tidak. +import numpy as np +from matplotlib import pyplot as plt +from sklearn import datasets + + +def fungsi_cost(h, y): + """ + untuk memetakan proses atau nilai dari + satu atau lebih bariabel ke bilangan rill + secara intuitif mewakili berapa biaya yang + terkait dengan proses + """ + return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean() + + +def kemungkinan_maksimum(x, y, ukuran): + """ + ini adalah metode untuk memperkirakan parameter + dari distribusi probabilitas yang diasumsukan, + mengingat beberapa data yang diamati. + """ + skor = np.dot(x, ukuran) + return np.sum(y * skor - np.log(1 + np.exp(skor))) + + +def fungsi_sigmoid(n): + return 1 / (1 + np.exp(-n)) + + +def logsitik_regresi(alpha, x, y, max_iterasi=70000): + theta = np.zeros(x.shape[1]) + + for iterasi in range(max_iterasi): + z = np.dot(x, theta) + h = fungsi_sigmoid(z) + gradient = np.dot(x.T, h - y) / y.size + theta = theta - alpha * gradient + z = np.dot(x, theta) + h = fungsi_sigmoid(z) + j = fungsi_cost(h, y) + if iterasi % 100 == 0: + print(f"loss {j} \t") + return theta + + +if __name__ == "__main__": + iris = datasets.load_iris() + x = iris.data[:, :2] + y = (iris.target != 0) * 1 + + alpha = 0.1 + theta = logsitik_regresi(alpha, x, y, max_iterasi=70000) + print("theta: ", theta) + + def prediksi_probabilitas(n): + return fungsi_sigmoid(np.dot(x, theta)) + + plt.figure(figsize=(10, 6)) + plt.scatter(x[y == 0][:, 0], x[y == 0][:, 1], color="b", label="0") + plt.scatter(x[y == 1][:, 0], x[y == 1][:, 1], color="r", label="1") + (x1_min, x1_max) = (x[:, 0].min(), x[:, 0].max()) + (x2_min, x2_max) = (x[:, 1].min(), x[:, 1].max()) + (xx1, xx2) = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max)) + grid = np.c_[xx1.ravel(), xx2.ravel()] + probs = prediksi_probabilitas(grid).reshape(xx1.shape) + plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors="black") + + plt.legend() + plt.show()