-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlogisticregression.py
More file actions
57 lines (44 loc) · 1.77 KB
/
logisticregression.py
File metadata and controls
57 lines (44 loc) · 1.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
def sigmoid(z):
return 1.0 / (1.0 + np.exp(-z))
def logistic_regression(X, y, num_iterations=200, learning_rate=0.001):
weights = np.zeros(X.shape[1])
for _ in range(num_iterations):
z = np.dot(X, weights)
h = sigmoid(z)
gradient_val = np.dot(X.T, (h - y)) / y.shape[0]
weights -= learning_rate * gradient_val
return weights
# Load Iris dataset
iris = load_iris()
X = iris.data[:, :2] # Use only the first two features (sepal length and width)
y = (iris.target != 0) * 1 # Convert to binary classification
# Split the dataset
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=9)
# Standardize features
sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.transform(X_test)
# Perform logistic regression
weights = logistic_regression(X_train_std, y_train)
# Make predictions
y_pred = sigmoid(np.dot(X_test_std, weights)) > 0.5
# Print accuracy
print(f'Accuracy: {np.mean(y_pred == y_test):.4f}')
# Plot decision boundary
x_min, x_max = X_train_std[:, 0].min() - 1, X_train_std[:, 0].max() + 1
y_min, y_max = X_train_std[:, 1].min() - 1, X_train_std[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
np.arange(y_min, y_max, 0.1))
Z = sigmoid(np.dot(np.c_[xx.ravel(), yy.ravel()], weights)) > 0.5
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X_train_std[:, 0], X_train_std[:, 1], c=y_train, alpha=0.8)
plt.title('Logistic Regression Decision Boundaries')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.savefig('plot.png')