Turning ideasinto Products

I design user-focused, aesthetic and functional digital experiences across AI, Web Design, Mobile Design and Frontend.

NEXT.JSTYPESCRIPTSWIFT / iOSPYTHONTENSORFLOWSCIKIT-LEARNPANDASNUMPYPLOTLYRAGAI / LLMMULTI-AGENTGOOGLE DRIVE v3 APIREACT NATIVEGSAPSEO + GEOAUTOMATION
Stack

Technologies I work with

Drag them, fling them, smash them together. I'll even let you build the connections between them yourself.

Grab · Drag · Drop
About

The bridge
between design
& code

From corporate websites to congress automation, from multi-agent AI platforms to native iOS apps, I build end to end. The other half of my time goes to data: neural networks, RAG pipelines, numerical optimization and the visualizations that make a result understandable. I combine design sensibility with systems engineering, and I chase measurable SEO/GEO results and reliable automations.

Next.js / React / TypeScript
Automation & APIs (Google Drive v3, etc.)
Swift / iOS Native
AI / ML & Multi-Agent Systems
Data Science, DL & Visualization
UI/UX, Motion & SEO/GEO
Selected Work

Live projects

From corporate sites to congress automation, from a RAG-based memory network to a graph-indexed iOS app. Every line of code serves a measurable goal.

Data · Machine Learning · Deep Learning

Data Lab

The output of a model matters, and so does how that output is read. This section has three things: visualizations drawn from real project data, formulas turned into code line by line, and the applications that use them.

I tried to explain things without jargon; still, if you tap any dotted-underlined term, it explains what it means.

01 — Visualization

Making data readable

Every chart below was produced from real output in my repositories: epoch series extracted from notebook logs, a committed sensor CSV and the optimization scripts' own run results. The badges show which library drew the original.

FurVision · CNNMatplotlib

What exactly does early stopping catch?

best val_loss
Training accuracyValidation accuracy

Training accuracy climbs to 90% while validation flattens at 80% — that gap is itself. The dashed line marks 14, where bottoms out; restores the weights from there.

K-NN_ClassificationSeaborn

The four numbers behind accuracy

PREDICTEDDid not buyBoughtDid not buy48%60.04%5.0Bought3%3.825%31.3ACTUAL
Correct classification — 73 samplesErrors — 7 samples

91.25% accuracy tells you nothing on its own; the real question is where the errors fall. The opens that up: the model misses 3 real buyers and targets 4 people for nothing — and those two errors do not cost the same.

ANN-RealEstate-RegressionMatplotlib

Where does the regression network saturate?

Training MAEValidation MAE

Validation drops quickly over the first ten and then separates from the training curve. and manage that gap; the final model finishes at 0.92 and an average error of $15,617.

Ardunio_IOTPlotly

Reliable readings from a noisy signal

Sensor 1 (raw)Sensor 2 (raw)30s moving average ±1σ

10,138 raw measurements from the serial port, a ~85-minute heating experiment. The two raw sensors jitter; the 30-second and the band show the underlying trend and the measurement uncertainty together.

Gradient Descent vs NewtonSymPy

Why does the second derivative matter so much?

Gradient descent (fixed α = 0.1)Newton (dividing by f″)

Absolute error to the target, on a log scale. Gradient descent with a fixed only cuts the error to 0.8× each iteration — barely half the way in 4 steps. Newton, by dividing by the , converges : the error roughly squares each step and reaches machine precision in 5 steps. Both curves are real output from the repositories below.

02 — From math to code

Turning formulas into lines of code

Five optimization repos, one shared idea: no derivatives written by hand. In every one the function is defined as a SymPy expression, the gradient is derived with sp.diff, then made numeric with .subs(). The cards below progress from fixed step sizes to symbolic line search — the code blocks are real lines from the repos.

Gradient descent — single variable

Formula
minimize
f(x) = x2 + 6x + 1
xk+1 = xk − α · f′(xk)
α = 0.1 fixed , x0 = 0. The derivative is not written by hand — sp.diff derives it from the function expression.
Code
Gradient Descent/main.py
import sympy as sp # Define symbolic variablex = sp.symbols('x') # define the functionf = (x)**2 + 6*(x) + 1 # derivativef_derivative = sp.diff(f, x) # define inital valuesx_value = 0alfa = 0.1 for i in range(1, 5):    result = f_derivative.subs(x, x_value)     # new x value    x_value -= alfa * result    print(f"Yeni x_{i} değeri: {x_value}\n")
Actual run output
x0 = 0 → x1 = -0.6 → x2 = -1.08 → x3 = -1.464 → x4 = -1.7712

The entire formula collapses into one line: x_value -= alfa * result. Everything else is obtaining the derivative symbolically.

Gradient descent — vector form

Formula
minimize
f(x1, x2) = x12 + 6x22 + x1x2
xk+1 = xk − α∇f(xk)
∇f = [2x1 + x2,  12x2 + x1]T, start (1, 2), α = 0.1.
Code
Gradient with Matris/main.py
for i in range(iterations):    # new values    new_x_1_value = x_1_value - alpha_value * df_dx1.subs({x_1: x_1_value, x_2: x_2_value})    new_x_2_value = x_2_value - alpha_value * df_dx2.subs({x_1: x_1_value, x_2: x_2_value})     print(f"Iterasyon {i + 1}:")     # update the new values    x_1_value = new_x_1_value    x_2_value = new_x_2_value

The order matters here: both components are computed from the old iterate and then written together — a correct simultaneous update. Updating x_1_value early would silently turn it into Gauss–Seidel. Also, because the curvature of x2 is 12, the step factor (1 − 12α) comes out as −0.2: with the same α one coordinate oscillates while the other converges smoothly — that is exactly what ill-conditioning looks like.

03Curvature-scaledNewton-Raphson-Method

Newton's method — optimization form

Formula
minimize
f(x) = x3 − 3x2
xk+1 = xk − f′(xk)f″(xk)
f′ = 3x2 − 6x, f″ = 6x − 6, start x0 = 3. There is no α to choose anymore — the itself sets the step size.
Code
Newton Method/main.py
import sympy as spx = sp.symbols('x')f = (x) ** 3 - 3 * (x) ** 2 #first and second derivativef_derivative = sp.diff(f, x)f_second_derivative = sp.diff(f_derivative, x) x_value = 3iteration = 5for i in range(1, iteration+1):    first_derivative = f_derivative.subs(x, x_value)    second_derivative = f_second_derivative.subs(x, x_value)    if second_derivative != 0:        x_value = x_value - (first_derivative / second_derivative)        print(f"new x_{i} value: {sp.N(x_value)}")    else:        print("Division by zero. Choose a different initial value.")        break
Actual run output
x0 = 3.000000 → x1 = 2.250000 → x2 = 2.025000 → x3 = 2.000305 → x4 = 2.000000 → x5 = 2.000000

The repo name says "Raphson" but the code uses f′/f″, not the classic root-finding form f/f′. So this is a search for a stationary point, not a root: the roots of x3 − 3x2 are 0 and 3, yet starting from x0 = 3 the code moves away from the root toward x = 2, the local minimum.

04Exact line searchQuassi-Newton

Quasi-Newton — direction from an approximate Hessian

Formula
minimize
f = x12 + 3x22 + x1x2 + x1 + x2
pk = −Hk∇fk·sk = Δx, yk = Δ∇f
H0 = diag(½, ⅙) — not the identity matrix but the inverse of the diagonal of the true [[2,1],[1,6]], i.e. a deliberate preconditioner. The S is solved with sp.solve from the orthogonality condition pT∇f(x + Sp) = 0.
Code
Quassi Newton/main.py
h_0 = np.array([[1/2, 0],                [0, 1/6]]) #Find p_0p_0 = np.dot(h_0, q_0.transpose())*-1X_1 = X_0_transpose + S*p_0 # ... q_1 = gradient at X_1 ...result_sum = np.dot(p_0_transpose, q_1_transpose).sum() ## Find Sif result_sum != 0:    S_solve = sp.solve(result_sum, S) ϴ = reel_q_1_transpose - q_0_transpose   # y = Δgradientα = reel_X_1 - X_0_transpose             # s = Δxβ = np.divide(α, ϴ)print(f"β = {β}")

To be honest: this is not BFGS. The code builds both components of the secant update correctly (ϴ = Δgradient, α = Δx), but the np.divide on the last line is an element-wise division — not a rank-2 outer-product update — and h_0 is never updated to h_1. So the line-search half of a quasi-Newton step is done; the matrix update is missing.

05Exact line searchConjugate-Gradient

Conjugate gradient — Fletcher–Reeves

Formula
minimize
f = x12 + x1x2 + ½x22
βFR = q1Tq1q0Tq0·p1 = −q1 + βp0
Numerator and denominator are each a gradient multiplied by its own transpose — that is what makes it Fletcher–Reeves. With Polak–Ribière the numerator would involve a gradient difference; there is no such term in the file. Start (1, 1), p0 = −q0.
Code
Conjugate Gradient/main.py
# ilk yön: en dik inişp_0 = -q_0X_1 = X_0 + S*p_0 # ... q_1 = gradient at X_1 ... # tam çizgi araması: p_0 · q_1 = 0 koşulundan Sresult_sum = np.dot(p_0, q_1_transpose).sum()if result_sum != 0:    S_solve = sp.solve(result_sum, S) #find betabeta = np.dot(reel_q_1, reel_q_1_transpose).sum()/np.dot(q_0, q_0_transpose).sum() p_1 = -(reel_q_1_transpose)+(beta)*(p_0_transpose)print(p_1)

Most textbook implementations pick the step size as a constant; here S is solved symbolically from the orthogonality condition with sp.solve, and comes out as exactly 13/34. In a single step the gradient norm drops so far that β lands at a tiny 1/1156.

Note: the conjugate gradient and quasi-Newton files are hand-unrolled iterations, not converging loops. None of them has a stopping tolerance; the iteration counts are hard-coded.

03 — Applications

From model to result

From image classification to tabular regression, from hardware telemetry to regularization analysis. The numbers on the cards are measured results from the repositories.

Computer Vision · CNN

FurVision

A convolutional network built from scratch for cat/dog classification. Intermediate-layer activations were extracted with a separate Model and the feature maps visualized — to see what the network is actually looking at.

79.95%
Test accuracy
812,217
64×64
Input resolution
TensorFlowKerasConv2DAugmentationEarlyStopping
barisgudul/FurVisionRepo
Regression · Neural Network

ANN Real Estate Regression

House price prediction on the Ames Housing dataset. An end-to-end tabular ML pipeline including missing-value imputation, standardization and dropout regularization.

0.92
$15,617
39,297
Kerasscikit-learnDropoutStandardScaler
barisgudul/ANN-RealEstate-RegressionRepo
Data Engineering · Time Series

Arduino IoT Telemetry

A data pipeline that timestamps the sensor stream coming from the serial port and writes it to CSV, then validates it and analyzes it interactively with Plotly. Dual-sensor comparison, moving average, outlier detection and R² fit analysis.

10,138
Raw measurement rows
~85 min
Continuous recording
±1σ
PlotlypandaspyserialNumPy
barisgudul/Ardunio_IOTRepo
Classification · Distance-Based

K-NN Classification

k-nearest-neighbor classification with the Minkowski metric (p=2, i.e. Euclidean). A study showing why scaling is mandatory for distance-based methods and how the choice of k sets the bias–variance balance.

91.25%
Accuracy
k = 5
p = 2
scikit-learnStandardScalerConfusion Matrix
barisgudul/K-NN_ClassificationRepo
Industrial Analytics

ANN Energy Prediction

Prediction of the hourly net electrical output of a combined-cycle power plant from four variables: ambient temperature, exhaust vacuum, pressure and humidity; with a deliberately small network.

9,568
Samples
4 → 1
Features / target
MSE
KerasRegressionUCI CCPP
barisgudul/ANN-Energy-PredictionRepo
Regularization Analysis

Ridge vs Lasso

A comparison of how L2 and L1 penalties affect the coefficients: Ridge shrinks them while Lasso drives them exactly to zero, performing implicit feature selection.

L1 / L2
Sparsity
Lasso's feature selection
λ
Regularization strength
scikit-learnRidgeLassoDiabetes
barisgudul/Ridge_vs_Lasso_AnalysisRepo
Section · Experience

Career journey

From internship to full-time engineering — professional experience focused on software, automation and AI.

Mar 2026 — Sep 2026
Software Engineer
WriteTec Information Technologies · On-site

I built corporate websites, congress/SaaS automation and AI products. For congress.writetecbt.com I developed an end-to-end platform on the Google Drive v3 API that generates the congress proceedings book automatically; 5+ live client sites were launched.

Dec 2025 — Feb 2026
Computer Engineer
BLADECO HOLDING · Isparta · On-site

Computer engineering duties within the holding company; I provided technical support in system infrastructure, software development and operational processes.

Jun 2025 — Oct 2025
Software Engineer Intern
OrbitX Software · Internship · Remote

I supported the development of desktop GUI applications with PyQt6 and improved the user experience. I contributed to cross-platform mobile app development with React Native (Expo).

Dec 2024 — Jan 2025
AI Trainer
Outlier · Freelance · Remote

I worked as a freelance AI trainer on prompt design and prompt engineering to improve the quality of training data for large language models.

Aug 2024 — Sep 2024
Network Engineer
TÜPRAG · Internship · Uşak · On-site

As an intern network engineer I gained experience in field and system administration on computer networks, Windows Server and corporate network infrastructure.

Contact

Let's build
something together

For new projects, consulting, congress/SaaS automation or just a hello, filling in the form is all it takes. I usually reply within 24 hours.

Portrait of Mehmet Barış Güdül
Currently open to new projects
UTC+3 · TÜRKİYE