Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions models/svm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC, SVR
from sklearn.metrics import accuracy_score, mean_squared_error

class SVMClassifier:
def __init__(self, kernel='linear', C=1.0):
self.kernel = kernel
self.C = C
self.model = SVC(kernel=self.kernel, C=self.C)

def train(self, X, y):
self.model.fit(X, y)

def predict(self, X):
return self.model.predict(X)

def evaluate(self, X, y):
y_pred = self.predict(X)
return accuracy_score(y, y_pred)

def get_support_vectors(self):
return self.model.support_vectors_


class SVMRegressor:
def __init__(self, kernel='rbf', C=1.0, epsilon=0.1):
self.kernel = kernel
self.C = C
self.epsilon = epsilon
self.model = SVR(kernel=self.kernel, C=self.C, epsilon=self.epsilon)

def train(self, X, y):
self.model.fit(X, y)

def predict(self, X):
return self.model.predict(X)

def evaluate(self, X, y):
y_pred = self.predict(X)
return mean_squared_error(y, y_pred, squared=False) # RMSE
62 changes: 62 additions & 0 deletions pages/svm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from models.svm import SVMClassifier, SVMRegressor

st.title("🔷 Support Vector Machine (SVM) Simulator")

option = st.radio("Choose Mode", ["Classification", "Regression"])

if option == "Classification":
st.subheader("SVM Classifier Visualization")

# Load toy dataset
X, y = datasets.make_blobs(n_samples=100, centers=2, random_state=6, cluster_std=1.2)

kernel = st.selectbox("Kernel", ["linear", "poly", "rbf", "sigmoid"])
C = st.slider("Regularization (C)", 0.01, 10.0, 1.0)

model = SVMClassifier(kernel=kernel, C=C)
model.train(X, y)

# Plot decision boundary
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 300),
np.linspace(y_min, y_max, 300))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.figure(figsize=(8, 6))
plt.contourf(xx, yy, Z, cmap='coolwarm', alpha=0.6)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolors='k')
plt.scatter(model.get_support_vectors()[:, 0], model.get_support_vectors()[:, 1],
s=100, facecolors='none', edgecolors='yellow', label='Support Vectors')
plt.legend()
st.pyplot(plt)
st.write(f"**Accuracy:** {model.evaluate(X, y):.2f}")

else:
st.subheader("SVM Regressor Visualization")

# Generate regression dataset
X = np.sort(5 * np.random.rand(100, 1), axis=0)
y = np.sin(X).ravel() + np.random.randn(100) * 0.1

kernel = st.selectbox("Kernel", ["linear", "poly", "rbf", "sigmoid"])
C = st.slider("Regularization (C)", 0.1, 10.0, 1.0)
epsilon = st.slider("Epsilon", 0.01, 1.0, 0.1)

model = SVMRegressor(kernel=kernel, C=C, epsilon=epsilon)
model.train(X, y)
y_pred = model.predict(X)

# Plot regression curve
plt.figure(figsize=(8, 6))
plt.scatter(X, y, color="blue", label="Data")
plt.plot(X, y_pred, color="red", label="SVM Prediction")
plt.title("SVM Regression")
plt.legend()
st.pyplot(plt)
st.write(f"**RMSE:** {model.evaluate(X, y):.3f}")