本案例主要利用matlab代码解决“采用实现线性回归(单一变量)来预测一辆食品卡车的利润的问题”,代码中涉及到机器学习中的线性回归理论知识,本文不着重介绍(详细可参考吴恩达的《机器学习》),主要介绍其代码实现过程(源代码参考吴恩达的《机器学习》的课后作业)。
一、ex1.m实现代码如下:代码主要包括三部分:Part 1: 将该线性回归问题的数据集在图中表示、 Part 2: 梯度下降算法实现线性回归、Part 3: 图像化函数J(theta_0, theta_1)。
%%机器学习练习-线性回归函数 % 说明 % ------------ % 这个文件包含的代码将帮助你开始线性回归问题的练习。 %并且该文件代码将用到以下子函数: % % warmUpExercise.m 简单的函数例子,产生5*5的特征矩阵函数 % plotData.m 显示数据,画图 % gradientDescent.m 单一变量批量梯度下降函数 % computeCost.m 计算线线回归的单一变量损失函数算法 % % x指的是10万人口的人口规模 % y指的是10万美元的利润 % %% 初始化 clear ; close all; clc %% ======================= Part 1: 将该线性回归问题的数据集,在图中表示 ======================= fprintf(\'画出训练集的数据 ...\n\') data = load(\'ex1data1.txt\'); %文件ex1data1.txt包含了我们的线性回归问题的数据集。 %第一列是城市的人口,第二列是城市里的一辆食品卡车的利润。 %利润的负值表示损失。 X = data(:, 1); y = data(:, 2); m = length(y); % 训练集的数量 % 画出数据,调用画图函数 plotData(X, y); fprintf(\'运行暂停.按enter键继续..\n\'); pause; %% =================== Part 2: 梯度下降算法 =================== fprintf(\'运行梯度下降算法 ...\n\') X = [ones(m, 1), data(:,1)]; % 在X中添加一列数(m个1) theta = zeros(2, 1); % 初始化拟合参数(0,0) % 一些梯度下降函数设置 iterations = 1600;%迭代次数设置为1500次 alpha = 0.01;%学习率设置为0.01. % 计算和显示初始的成本值 %调用损失函数,计算初值,此时theta值为(0,0) computeCost(X, y, theta) %运行批量梯度下降函数 theta = gradientDescent(X, y, theta, alpha, iterations); % 将theta值打印在屏幕上 fprintf(\'通过批量梯度下降法找到的Theta值: \'); fprintf(\'%f %f \n\', theta(1), theta(2)); % 画出线性拟合图 hold on; % 保持先前的图可见 plot(X(:,2), X*theta, \'-\') %实际拟合的函数为h=theta1*X(1)+theta2*X(2),X(1)=1,X(2)为训练集中的特征值x legend(\'训练数据\', \'线性回归\') hold off % 不要在这个图上叠加其他的图形 % 预测人口规模为3.5万和7万的利润值 predict1 = [1, 3.5] *theta; fprintf(\'当人口为35,000时,我们预测利润为 %f\n\',... predict1*10000); predict2 = [1, 7] * theta; fprintf(\'当人口为35,000时,我们预测利润为 %f\n\',... predict2*10000); fprintf(\'运行暂停.按enter键继.\n\'); pause; %% ============= Part 3: 图像化函数J(theta_0, theta_1) ============= fprintf(\'Visualizing J(theta_0, theta_1) ...\n\') % 将计算出的覆盖在网格图中 theta0_vals = linspace(-10, 10, 100); theta1_vals = linspace(-1, 4, 100); %初始化J_vals为一个0矩阵,长度为1000 J_vals = zeros(length(theta0_vals), length(theta1_vals)); % 填入 J_vals矩阵 for i = 1:length(theta0_vals) for j = 1:length(theta1_vals) t = [theta0_vals(i); theta1_vals(j)]; J_vals(i,j) = computeCost(X, y, t); end end %我们需要在调用surf函数前将J_vals矩阵转置,否则这些轴就会被翻转 J_vals = J_vals\'; % 曲面图 figure; surf(theta0_vals, theta1_vals, J_vals) xlabel(\'\theta_0\'); ylabel(\'\theta_1\'); % 等值线 figure; % 将矩阵J_vals画作15个等高线间隔在0.01到100之间 contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20)) xlabel(\'\theta_0\'); ylabel(\'\theta_1\'); hold on; plot(theta(1), theta(2), \'rx\', \'MarkerSize\', 10, \'LineWidth\', 2);