Hi guys, I’m having trouble with this exercise. Order 18 is too overfitting for me. how can I solve it? a graph like the one on the orange line should come out. the one with the red line is mine. where I’m wrong in the code, can you correct it please…
![Screenshot 2023-10-19 alle 21.54.30|628x441]
this is my Assignment
You should use the function from above - the Φ feature generator - to approximate the points.
Below you solve for different polynomial orders and plot the result.
Use sub-plots within the Plots
ecosystem, and prepare a plot with subplots:
col1 | col2 | col3 |
---|---|---|
(2) | (4) | (6) |
(8) | (12) | (18) |
|Each subplot should contain|||
- the points,
- the order of polynomial and the error in the title string,
- the plot aligned such that all points are well visible and the quality of the approximation is visible too.
When submitting the solution, make sure that your solution
this is my code:
Preformatted text
using CSV, DataFrames
using LinearAlgebra
Lettura dei dati come mostrato in precedenza
train_data = Matrix(CSV.read(“hw_data.csv”, DataFrame, header = false))
x_height = train_data[:,1]
y_weight = train_data[:,2]
Funzione lineare per il modello
linear_fun(height, a) = a[2] * height + a[1]
Funzione generatrice di caratteristiche
function Φ(x::Real, k::Integer; μ=165, σ=50)::Vector{Real}
z = (x-μ) / σ
return [z.^i for i=0:k]
end
function approximate_and_error(k)
Φ_matrix = hcat([Φ(x, k) for x in x_height]…)
Φ_matrix = transpose(Φ_matrix) # Trasponiamo per avere le dimensioni corrette
a = Φ_matrix \ y_weight
y_pred = Φ_matrix * a
error = norm(y_weight - y_pred)
return a, error
end
function plot_approximation(k)
a, error = approximate_and_error(k)
x_dense = range(minimum(x_height), maximum(x_height), length=1000)
y_preds_dense = [dot(a, Φ(x, k)) for x in x_dense]
p = scatter(x_height, y_weight, label="y2", markersize=5, color=:blue, legend=:topleft, xlabel="X Axis Label", ylabel="Y Axis Label", size=(600,400))
plot!(p, x_dense, y_preds_dense, label="y3 - Order $k", width=2, linecolor=:orange, linestyle=:solid)
title!("Grado $k - Errore: $(round(error; digits=2))")
return p
end
Creazione delle sottotrame
plots_array = [plot_approximation(k) for k in [2,4,6,8,12,18]]
plot(plots_array…, layout=(2,3), size=(900,600)).