一,假设函数:

1) 逻辑回归(Logistic Regression),Logistic function, Sigmoid function是同一个意思,函数形式(假设函数形式)如下:

逻辑回归是二分类算法, hθ(x)>=0.5 h θ ( x ) >= 0.5 <script type="math/tex" id="MathJax-Element-107">h_{\theta}(x) >= 0.5</script>( z>=0 z >= 0 <script type="math/tex" id="MathJax-Element-108">z >=0</script>, 即 θTx>=0 θ T x >= 0 <script type="math/tex" id="MathJax-Element-109">{\theta}^Tx >= 0</script>),则 y=1 y = 1 <script type="math/tex" id="MathJax-Element-110">y = 1</script>。

2) 决策边界(Decision Boundary)
逻辑函数分为正类和负类时的边界,即 hθ(x)=0.5 h θ ( x ) = 0.5 <script type="math/tex" id="MathJax-Element-111">h_{\theta}(x) = 0.5</script>即为边界函数。

上图假定参数 θ θ <script type="math/tex" id="MathJax-Element-112">\theta</script>已经学好, 根据上一张图知 θTx>=0 θ T x >= 0 <script type="math/tex" id="MathJax-Element-113">{\theta}^Tx >= 0</script>为正类, θTx<0 θ T x < 0 <script type="math/tex" id="MathJax-Element-114">{\theta}^Tx < 0</script>为负类,则边界为 θTx=0 θ T x = 0 <script type="math/tex" id="MathJax-Element-115">{\theta}^Tx = 0</script>,此时边界为 x1+x2=3 x 1 + x 2 = 3 <script type="math/tex" id="MathJax-Element-116">x_1 + x_2 = 3</script>

3) 非线性决策边界
假设已经使用训练集训练逻辑回归模型,得到参数 θ θ <script type="math/tex" id="MathJax-Element-117">\theta</script>,于线性边界一样,则非线性决策边界为 θTx=0 θ T x = 0 <script type="math/tex" id="MathJax-Element-118">{\theta}^Tx = 0</script>,如下

二,参数学习

1) 损失函数,学习参数,首先需要定义损失函数,线性回归的损失函数可以是均方误差

J(θ)=1mi=1m(hθ(xi)yi)2 J ( θ ) = 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) 2
<script type="math/tex; mode=display" id="MathJax-Element-119">J(\theta) = \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^i)-y^i)^2</script>,但逻辑回归的损失函数不能使用均方误差函数,因为逻辑回归函数 hθ(x)=11+exp(θTx) h θ ( x ) = 1 1 + e x p ( − θ T x ) <script type="math/tex" id="MathJax-Element-120">h_{\theta}(x) =\frac{1}{1+exp(-\theta^Tx)} </script>,也叫Sigmoid function作为假设函数,此函数是非线性的,会导致均方误差函数为non-convex( 函数的二阶导数大于等于零,那么这个函数就是凸函数),有许多局部最小值。所有需要定义新的损失函数,如下:

损失函数另一种表达方式是:

Cost(hθ(x),y)=ylog(hθ(x))(1y)log(1hθ(x)) C o s t ( h θ ( x ) , y ) = − y l o g ( h θ ( x ) ) − ( 1 − y ) l o g ( 1 − h θ ( x ) )
<script type="math/tex; mode=display" id="MathJax-Element-121">Cost(h_{\theta}(x), y) = -y log (h_{\theta}(x)) - (1-y)log(1-h_{\theta}(x))</script>
所有样本的损失值之和:
J(θ)=1/mi=1mCost(hθ(x),y) J ( θ ) = 1 / m ∑ i = 1 m C o s t ( h θ ( x ) , y )
<script type="math/tex; mode=display" id="MathJax-Element-122">J(\theta) = 1/m\sum_{i=1}^{m} Cost(h_{\theta}(x), y)</script>

2) 使用梯度下降算法,找到 J J <script type="math/tex" id="MathJax-Element-123">J</script>损失值最小时的参数θ<script type="math/tex" id="MathJax-Element-124">\theta</script>,预测某个样本 x x <script type="math/tex" id="MathJax-Element-125">x</script>时,利用得到的参数θ<script type="math/tex" id="MathJax-Element-126">\theta</script>代入假设函数(逻辑回归函数,Sigmoid函数),即可求得预测值:

hθ(x)=11+exp(θTx) h θ ( x ) = 1 1 + e x p ( − θ T x )
<script type="math/tex; mode=display" id="MathJax-Element-127">h_{\theta}(x) =\frac{1}{1+exp(-\theta^Tx)} </script>

3) 梯度下降法,损失函数偏导具体推导过程参考链接

前面已经确定了三要素:假设函数,损失函数,梯度下降

三,Matlab实现

数据集下载:百度云链接 密码:tb4p

假设一所高中有一个数据集,代表40名学生被录取进入大学,40名学生未被录取。训练样本包含两个标准化考试的学生成绩和学生是否被录取的标签。

任务是建立一个二元分类模型,根据学生在两次考试中的分数来估计大学录取的机会。

ex4x.dat:X数组的第一列代表所有的测试1分数,第二列代表所有的测试2分数。
ex4y.dat:Y向量使用“1”来标记被录取和“0”以标记未录取的学生。

数据分布

Matlab代码

clear;
clc;
% 1,读入数据
load('D:\Code\Data\ex4Data\ex4x.dat');
load('D:\Code\Data\ex4Data\ex4y.dat');
x = ex4x;
y = ex4y;

% 2,显示数据,查看分布
pos = find(y == 1); neg = find(y == 0);
plot(x(pos, 1), x(pos,2), '+'); hold on
plot(x(neg, 1), x(neg, 2), 'o')

% 3, 参数设置
iteration = 10000;
sample_num = length(x); % 样本个数
x = [ones(sample_num, 1), x];
theta = zeros(size(x, 2), 1); % 参数
alpha = 0.1;

% 4,特征归一化
x(:,2) = (x(:,2)- mean(x(:,2)))./ std(x(:,2));
x(:,3) = (x(:,3)- mean(x(:,3)))./ std(x(:,3));

% 5,迭代,寻找最佳参数
for i = 1:iteration
    h = 1 ./ (1 + exp(-x * theta)); % 通过假设函数得到预测值
    J(i,1) = -1/sample_num * (y' * log(h+eps) + (1-y)'*log(1-h+eps)); % 当前参数下的损失值
    theta(1,1) = theta(1,1) - alpha * sum((h - y) .* x(:,1));  % 更新参数
    theta(2,1) = theta(2,1) - alpha * sum((h - y) .* x(:,2));
    theta(3,1) = theta(3,1) - alpha * sum((h - y) .* x(:,3));
    %theta = theta - alpha * x'*(h-y); % 同时更新所有参数
end

figure,
plot(x(pos, 2), x(pos,3), '+'); hold on
plot(x(neg, 2), x(neg, 3), 'o')

% 6,边界为Theta'x = 0; theta_1 + theta_2*x_2 + theta_3*x_3 = 0
max_value = max(x(:,2));
min_value = min(x(:,2));
X = min_value:0.001:max_value;
Y = -(theta(1,1) + theta(2,1) * X) / theta(3,1);
plot(X, Y, '-')

效果图,画决策边界( hθ(z)=0.5,z=θTx=0 h θ ( z ) = 0.5 , 此 时 z = θ T x = 0 <script type="math/tex" id="MathJax-Element-128">h_\theta(z)=0.5, 此时z=\theta^Tx=0</script>):

关键代码(向量化表示):

theta(1,1) = theta(1,1) - alpha * sum((h - y) .* x(:,1));  % 更新参数
theta(2,1) = theta(2,1) - alpha * sum((h - y) .* x(:,2));
theta(3,1) = theta(3,1) - alpha * sum((h - y) .* x(:,3));
%theta = theta - alpha * x'*(h-y); % 同时更新所有参数
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐