tosunpasha
Aşağıda ki Düzenlemeyi Dener Misiniz ? _
Octave'da gradient descent (gradyan iniş) algoritmasını kullanarak theta parametrelerini hesaplarken NaN (Not a Number) hatası alıyorsanız, bu genellikle bir bölme hatası, veri tipi uyumsuzluğu veya matris boyutlandırma hatasından kaynaklanır. Kodunuzu incelediğimde, sorun muhtemelen giriş verilerinin (X) düzeniyle ilgili olabilir.
Burada, X matrisinin bir sütununu bir 'bias' terimi olarak eklememiz gerekiyor. Ayrıca, gradyan iniş işlevi, 'h' hipotezinin hesaplanması ve diğer önemli işlemlerin doğru sırada yapılmasını sağlamalıyız.
İşte düzeltilmiş kod:
clear;
x = [150 50 0.1;
160 55 0.2;
170 60 0.15;
180 65 0.05;
190 70 0.3;
200 75 0.25;
210 80 0.4;
220 85 0.35;
230 90 0.5;
240 95 0.45];
% x matrisine bir bias sütunu ekle
x = [ones(size(x, 1), 1) x];
y = [300; 320; 340; 360; 380; 400; 420; 440; 460; 480];
theta = zeros(size(x, 2), 1); % theta boyutunu x'in sütun sayısına göre ayarla
% Gradient Descent fonksiyonu
function [theta] = gradientDescent(x, y, theta, alpha, iterations)
m = length(y);
for iter = 1:iterations
h = x * theta;
theta = theta - alpha * (1/m) * (x' * (h - y));
end
end
iterations = 1000;
alpha = 0.01;
[theta] = gradientDescent(x, y, theta, alpha, iterations);
h = x * theta;
figure;
plot(1:length(y), y, 'ro', 'MarkerSize', 10, 'DisplayName', 'Orijinal Veriler');
hold on;
plot(1:length(h), h, 'b-', 'LineWidth', 2, 'DisplayName', 'Tahmin Edilen Çizgi');
xlabel('Örnek Numarası');
ylabel('y Değerleri');
title('Lineer Regresyon: Orijinal ve Tahmin Edilen Değerler');
legend;
grid on;
x_test = [1 150 50 0.1]; % test verisine bias sütunu ekleyin
z = x_test * theta;
disp(['Theta Parametreleri: ', num2str(theta')]);
disp(num2str(z));
Düzenlemeler:
x
matrisine bir bias sütunu (1'ler) ekledim. Bu, x
matrisinin boyutlarını theta ile uyumlu hale getirir.
theta
boyutunu x
matrisinin sütun sayısına göre ayarladım.
x_test
test vektörüne bir bias terimi ekledim.
Bu düzenlemelerle, NaN hatasından kurtulup doğru theta parametrelerini hesaplamanız gerekir. Kodunuzu tekrar çalıştırmayı deneyin.