线性回归与逻辑回归及其实现

线性回归与逻辑回归及其实现

回归与分类

  • 预测值定性分析,即离散变量预测时,称之为分类;
  • 预测值定量分析,即连续变量预测时,称之为回归。

如预测一张图片是猫还是狗,是分类问题;预测明年的房价,是回归问题。

线性回归

线性回归模型

  • 一元线性回归模型
    hθ(x)=θ0x0+θ1x1,(x0=1)h_\theta(x)=\theta_0x_0+\theta_1x_1, \ \ \ \ (x_0=1) hθ(x)=θ0x0+θ1x1,    (x0=1)
    即简单的 y=kx+by=kx+by=kx+b

  • 多元线性回归模型
    hθ(x)=θ0x0+θ1x1+⋯+θnxn=∑i=0nθixi=θTX,(x0=1)h_\theta(x)=\theta_0x_0+\theta_1x_1+\dots+\theta_nx_n=\sum_{i=0}^n\theta_ix_i=\theta^TX, \ \ \ \ (x_0=1) hθ(x)=θ0x0+θ1x1++θnxn=i=0nθixi=θTX,    (x0=1)

这里的 x0=1x_0=1x0=1 用来表示偏置 bbb

一元线性回归实例——房价预测

在房价问题中我们以房子面积、离地铁站的距离等属性作为自变量,房价是因变量

  • x0x_0x0:房子面积

  • x1x_1x1:离最近地铁站距离

  • x2x_2x2:绿化规模

线性回归可以理解为将这些特征线性组合起来,即可得到房价。而我们的目标就是求出一组合理的权重参数 θ\thetaθ ,能够较为准确的预测出真实的房价 hθ(x)h_\theta(x)hθ(x)

在这里插入图片描述

这里的一元自变量我们使用年份,y=kx+by=kx+by=kx+b ,这里 xxx 是年份,yyy​ 是该年的房价。我们采用一元线性回归模型来拟合上海市房价,通过已知历史数据拟合出k和b的值(模型的参数)然后我们就可以通过 kkkbbb 来估算2019年、2020年房价。

定义问题

如果我们有 nnn 组样本:(x1,y1),(x2,y2),…,(x3,y3)(x_1,y_1),(x_2,y_2),\dots,(x_3,y_3)(x1,y1),(x2,y2),,(x3,y3) ,我们希望设计一个损失函数 L(x)L(x)L(x) 来拟合这一组样本,当 1n(L(x1)+L(x2)+⋯+L(xn)\frac{1}{n}(L(x_1)+L(x_2)+\dots+L(x_n)n1(L(x1)+L(x2)++L(xn) 最小时,我们得到了想要的模型,这个最小化 LLL 的思路,也称为经验风险最小化(Empirical Risk Minimization**,** ERM)。

在这里,我们使用 MSE/L2 损失:
L=12(y−hθ(x))2L=\frac{1}{2}(y-h_\theta(x))^2 L=21(yhθ(x))2
这与我们在之前 梯度下降法和牛顿法计算开根号中介绍的梯度下降法的损失函数基本一致。

Why MSE ?

我们为什么要选用 MSE 呢?

实际上我们知道,按照解方程的思想,对于只有两个样本的时候,y=kx+by = kx + by=kx+b 有唯一解 k,bk,bk,b,但是当有大于两个样本时,kkkbbb 只有近似解,也就是说,不可能满足所有样本方程,即不可能通过某一组 kkkbbb 完全拟合所有数据,总会带有一些差异,我们要最小化这个差异。

真实值和预测值的关系可以表示为:
y=hθ(x)+ϵy=h_\theta(x)+\epsilon y=hθ(x)+ϵ
这里的 yyy真实值hθ(x)h_\theta(x)hθ(x) 是我们的预测值,而 ϵ\epsilonϵ 则是误差值。而我们总希望预测值足够的接近真实值,也意味着希望不可控的误差值足够接近0,因此需要对误差项进行分析。

MSE的推导

假设误差是服从均值为0方差为 σ2\sigma^2σ2正态分布

  • 为什么这里均值为0:因为均值是预测值

  • 为什么是正态分布,因为现实生活中绝大部分事物都很容易的服从正态分布。这是统计出来的规律做的假设,使得对误差的假设能够尽可能满足更多的场景。若数据不满足正态分布,则假设失败,模型容易出现非预期结果。

使用最大似然估计法,最大化误差出现的概率。这里是最大化概率密度函数:
argmaxθL(θ)=∏i=1n12πσ⋅e−ϵi22σ2argmax_\theta L(\theta)=\prod_{i=1}^n\frac{1}{\sqrt{2\pi}\sigma}\cdot e^{-\frac{\epsilon_i^2}{2\sigma^2}} argmaxθL(θ)=i=1n2πσ1e2σ2ϵi2
其中 ϵ=y−hθ(x)\epsilon=y-h_\theta(x)ϵ=yhθ(x) 。当 ϵ=0\epsilon=0ϵ=0 ,即误差值为 0 时,整式取到最大值。

给定n个样本,每个样本出现误差的可能性乘在一起,表示了整体出现误差的可能性(联合概率),所以是连乘。当所有误差都接近均值时,其发生的概率最大,最大似然其实就是表示了大家都别出现误差好了,用数学上的概率密度函数表示这件事。

然后就是对数似然,属于是本科阶段概率论与数理统计的基操:
lnL(θ)=ln∏i=1n12πσ⋅e−ϵi22σ2=∑i=1nln12πσ⋅e−ϵi22σ2=∑i=1n(ln12πσ+lne−ϵi22σ2)=nln12πσ−12σ2∑i=1nϵi2\begin{align} lnL(\theta)&=ln\prod_{i=1}^n\frac{1}{\sqrt{2\pi}\sigma}\cdot e^{-\frac{\epsilon_i^2}{2\sigma^2}}\\ &=\sum_{i=1}^nln\frac{1}{\sqrt{2\pi}\sigma}\cdot e^{-\frac{\epsilon_i^2}{2\sigma^2}}\\ &=\sum_{i=1}^n(ln\frac{1}{\sqrt{2\pi}\sigma}+ ln e^{-\frac{\epsilon_i^2}{2\sigma^2}})\\ &=nln\frac{1}{\sqrt{2\pi}\sigma}-\frac{1}{2\sigma^2}\sum_{i=1}^n\epsilon^2_i \end{align} lnL(θ)=lni=1n2πσ1e2σ2ϵi2=i=1nln2πσ1e2σ2ϵi2=i=1n(ln2πσ1+lne2σ2ϵi2)=nln2πσ12σ21i=1nϵi2
前面一项是常数,σ2\sigma^2σ2 是数据集的方差,也是常数,因此这里的最大似然, 我们只需要最大化下面这个 J(θ)J(\theta)J(θ)
J(θ)=−12∑i=1nϵi2=−12(y−hθ(x))2J(\theta)=-\frac{1}{2}\sum_{i=1}^n\epsilon^2_i=-\frac{1}{2}(y-h_\theta(x))^2 J(θ)=21i=1nϵi2=21(yhθ(x))2
即最小化 12(y−hθ(x))2\frac{1}{2}(y-h_\theta(x))^221(yhθ(x))2,就是我们的 MSE 损失函数了。

MSE可以用“对数据误差采用正态分布假设”推导而得来,这里也体现了正太分布在模型预测中的重要性,如果不服从假设,容易出现训练异常、不收敛、效率低等各种问题。

欠拟合与过拟合

现实中,我们的要拟合的数据很可能不止是一个简单的线性分布。当我们试图用简单的线性模型去拟合非线性的数据,无疑误差是会非常大的,这就是欠拟合现象。为了增强模型的表达能力,我们可以引入更多的(非线性)参数。比如下式中,我们共有三个参数 kidentity,ksin,kcosk_{identity},k_{sin},k_{cos}kidentity,ksin,kcos
y=kidentityx+ksinsin(x)+kcoscos(x)+by=k_{identity}x+k_{sin}sin(x)+k_{cos}cos(x)+b y=kidentityx+ksinsin(x)+kcoscos(x)+b
但是,如果我们加的参数过多,反而会导致模型表达能力过强,将数据的偏差也学习了进来,这就会使得模型在面对新的数据时预测不准,这种情况称为过拟合。对于过拟合,我们有很多种缓解的方式,如数据增强、正则化(权重衰减)、神经网络中的dropout、BN等。这里我们介绍一下正则化的方法。

正则化

正则化的思路是限制模型的复杂度,最好能够得到较为稀疏的模型(多个参数 kkk 为 0)。具体来说,正则化会在模型原本的损失函数中加入一项正则项,对于模型复杂度过高的情况,加以惩罚。在我们之前的例子中,可以是:
L=12(kidentityx+ksinsin(x)+kcoscos(x)+b)2+λ(kidentity2+ksin2+kcos2+b2)L=\frac{1}{2}(k_{identity}x+k_{sin}sin(x)+k_{cos}cos(x)+b)^2+\lambda(k_{identity}^2+k_{sin}^2+k_{cos}^2+b^2) L=21(kidentityx+ksinsin(x)+kcoscos(x)+b)2+λ(kidentity2+ksin2+kcos2+b2)
这里后面一项 λ(kidentity2+ksin2+kcos2+b2)\lambda(k_{identity}^2+k_{sin}^2+k_{cos}^2+b^2)λ(kidentity2+ksin2+kcos2+b2) 就是正则项,而 λ\lambdaλ 称为正则项系数。

我们之前提到正则化相当于对模型的参数做了约束,要求其越简单越好,最小化模型参数,这也称为:结构风险最小化(Structural Risk Minimization,SRM)。

正则与范数

正则化也有许多种不同的形式,主要是区别于正则项所选用的范数,比如上面的正则项中,就是选用的 L2L_2L2 范数,故也称为 L2L_2L2 正则化,岭回归等。

类似的,还有 L1L_1L1 正则项 λ(∣kidentity∣+∣ksin∣+∣kcos∣+∣b∣)\lambda(|k_{identity}|+|k_{sin}|+|k_{cos}|+|b|)λ(kidentity+ksin+kcos+b) ,这也称为 lasso 回归。

更一般地,对于 PPP 型范数 ∣∣θ∣∣p=∑i=1n∣θi∣pp||\theta||_p=\sqrt[p]{\sum_{i=1}^n|\theta_i|^p}∣∣θp=pi=1nθip ,有带正则化的损失函数:L=Lθ(x)+λ∣∣θ∣∣ppL=L_\theta(x)+\lambda||\theta||^p_pL=Lθ(x)+λ∣∣θpp

代码

#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <cmath>
#include <tuple>
#include <iomanip>using namespace std;struct Item {float year;float price;
};vector<Item> load_data(const string& file) {vector<Item> output;fstream ifile(file, ios::binary | ios::in);string line;getline(ifile, line);while(getline(ifile, line)){int p = line.find(",");Item item;item.year  = atof(line.substr(0, p).c_str());item.price = atof(line.substr(p + 1).c_str());output.emplace_back(item);}return output;
}tuple<Item, Item> compute_mean_std(const vector<Item>& items) {Item mean{0, 0}, stdval{0, 0};for(auto& item : items){mean.year  += item.year;mean.price += item.price;}mean.year  /= items.size();mean.price /= items.size();for(auto& item : items){stdval.year  += std::pow(item.year - mean.year, 2.0f);stdval.price += std::pow(item.price - mean.price, 2.0f);;}stdval.year  = std::sqrt(stdval.year / items.size());stdval.price = std::sqrt(stdval.price / items.size());return make_tuple(mean, stdval);
}int main() {auto datas = load_data("shanghai.csv");Item mean, stdval;tie(mean, stdval) = compute_mean_std(datas);for(auto& item : datas){item.year  = (item.year - mean.year) / stdval.year;item.price = (item.price - mean.price) / stdval.price;}float k_identity = 0.1;float k_sin      = 0.1;float k_cos      = 0.1;float lambda     = 1e-5;float b = 0;float lr = 0.01;for(int iter = 0; iter < 1000; ++iter){float loss = 0;float delta_k_identity = 0;float delta_k_sin      = 0;float delta_k_cos      = 0;float delta_b          = 0;for(auto& item : datas){float predict = k_identity * item.year + k_sin * std::sin(item.year) + k_cos * std::cos(item.year) + b;float L = 0.5 * std::pow(predict - item.price, 2.0f) + lambda * (k_identity*k_identity + k_sin*k_sin + k_cos*k_cos + b*b);delta_k_identity += (predict - item.price) * item.year + k_identity * lambda;delta_k_sin      += (predict - item.price) * std::sin(item.year) + k_sin * lambda;delta_k_cos      += (predict - item.price) * std::cos(item.year) + k_cos * lambda;delta_b          += (predict - item.price) + b * lambda;loss += L;}if(iter % 100 == 0)cout << "Iter " << iter << ", Loss: " << setprecision(3) << loss << endl;k_identity = k_identity - lr * delta_k_identity;k_sin      = k_sin      - lr * delta_k_sin;k_cos      = k_cos      - lr * delta_k_cos;b          = b          - lr * delta_b;}printf("模型参数:k_identity = %f, k_sin = %f, k_cos = %f, b = %f\n"\"数据集:xm = %f, ym = %f, xs = %f, ys = %f\n",k_identity,  k_sin, k_cos, b, mean.year, mean.price, stdval.year, stdval.price);float year          = 2023;float x             = (year - mean.year) / stdval.year;float predict       = x * k_identity + std::sin(x) * k_sin + std::cos(x) * k_cos + b;float predict_price = predict * stdval.price + mean.price;printf("预计%d年,房价将是:%.3f 元\n", (int)year, predict_price);return 0;
}

逻辑回归

逻辑回归虽然名字里带着“回归”二字,但实际上是进行(二)分类。

同样是以房价为例,如果我们有两个特征,分别是房屋面积和离地铁站的距离,而我们想要将所有房屋分为两类:让人幸福和让人不幸福。我们该怎么做呢?

基于线性回归的思考

如果继续按照线性回归的思路,我们或许会这样考虑:线性回归能够根据输入,输出一个标量预测值这个值的区间没有限制,从负无穷到正无穷都可以,而我们现在想要做的事情是二分类。那么只要把线性回归的输出值压缩在0到1之间,就可以将它看做是一种概率,再设定一个阈值(比如0.5),概率大于等于 0.5 则分类为幸福,小于 0.5 则分类为不幸福,就可以实现分类了。即我们希望用一个函数 hθ(x)h_\theta(x)hθ(x) 将线性回归模型得到的输出值,映射在 0-1 之间,表示为:
f(x)={1,hθ(x)≥0.50,hθ(x)<0.5f(x)=\begin{cases} 1,\ \ \ h_\theta(x)\ge0.5 \\ 0,\ \ \ h_\theta(x)<0.5 \end{cases} f(x)={1,   hθ(x)0.50,   hθ(x)<0.5

sigmoid函数

我们选择的是这样一个函数:
g(z)=11+e−zg(z)=\frac{1}{1+e^{-z}} g(z)=1+ez1
这就是著名的 Sigmoid 函数,其函数图像如下:

在这里插入图片描述

为什么选择 Sigmoid 函数?

  • sigmoid函数的定义域是(-INF, +INF),而值域为(0, 1)。
  • sigmoid函数是可导的。
  • sigmoid函数对于给定的输入变量,会根据选择的参数计算输出变量=1的可能性,也就是说它的输出表示概率,都是0到1之间。

Sigmoid函数的推导

根据之前的内容,我们可以这么理解:逻辑回归=线性回归+Sigmoid函数

  • 线性回归:z=kx+bz=kx+bz=kx+b
  • Sigmoid 函数:y=11+e−zy=\frac{1}{1+e^{-z}}y=1+ez1

则逻辑回归:y=11+e−(kx+b)y=\frac{1}{1+e^{-(kx+b)}}y=1+e(kx+b)1

接下来我们开始进行推导:

hθ(x)=11+e−(kx+b)h_\theta(x)=\frac{1}{1+e^{-(kx+b)}}hθ(x)=1+e(kx+b)1 得(注意我们这里 kx+bkx+bkx+b 是专门针对一元的,如果是多元的,常用 θTx\theta^TxθTx 表示):
lnhθ(x)1−hθ(x)=kx+bln\frac{h_\theta(x)}{1-h_\theta(x)}=kx+b ln1hθ(x)hθ(x)=kx+b
由上式,我们可以这样说:模型预测的,是正反例的对数概率

如果我们把 hθ(x)h_\theta(x)hθ(x) 视为样本 xxx 为正例的可能性,那么,自然在二分类中,1−hθ(x)1-h_\theta(x)1hθ(x) 即为负例可能性,两者的比值的对数,称为对数几率,这也是为什么逻辑回归也称为对数几率回归。同样,反过来,我们通过对样本为正反例可能性的伯努利分布推导(和指数族定义),也能得到上式的结果,因此,选择 Sigmoid 的原因在于他符合描述样本 xxx 为正反例的可能性,而逻辑回归则是对该可能性建模,求解参数极大似然估计的过程

损失函数与伯努利分布

如果我们这里依然用之前线性回归中使用的 MSE 作为损失函数,则得到:
L(θ)=12∑i=1m(y(i)−hθ(x(i)))2L(\theta)=\frac{1}{2}\sum_{i=1}^m(y^{(i)}-h_\theta(x^{(i)}))^2 L(θ)=21i=1m(y(i)hθ(x(i)))2
其中 hθ(x)=11+e−(kx+b)h_\theta(x)=\frac{1}{1+e^{-(kx+b)}}hθ(x)=1+e(kx+b)1

在这里插入图片描述

我们观察这个函数机器导数的曲线发现,函数的导数值在多个区域接近 0,使得在部分位置时难以迭代,不利于求解全局最优解,因此,直接采用线性回归的方法,可能在某些时候具备效果,但肯定不是最合适的方案。

对于二分类问题,yyy 的取值 0, 1服从伯努利分布,则有:

yyy 为 1 时:
P(y=1∣x;θ)=hθ(x)P(y=1|x;\theta)=h_\theta(x) P(y=1∣x;θ)=hθ(x)
yyy 为 0 时:
P(y=0∣x;θ)=1−hθ(x)P(y=0|x;\theta)=1-h_\theta(x) P(y=0∣x;θ)=1hθ(x)
写成统一的形式:
P(y∣x;θ)=hθ(x)y(1−hθ(x))1−y,y=0,1P(y|x;\theta)=h_\theta(x)^y(1-h_\theta(x))^{1-y},\ \ \ y=0,\ 1 P(yx;θ)=hθ(x)y(1hθ(x))1y,   y=0, 1
为了估计参数 θ\thetaθ ,我们有似然函数:
L(θ)=P(y∣x;θ)=∏i=1m(y(i)∣x(i);θ)L(\theta)=P(y|x;\theta)=\prod_{i=1}^m(y^{(i)}|x^{(i)};\theta) L(θ)=P(yx;θ)=i=1m(y(i)x(i);θ)
代入后,得:
L(θ)=∏i=1mhθ(x(i))y(i)(1−hθ(x(i)))1−y(i)L(\theta)=\prod_{i=1}^mh_\theta(x^{(i)})^{y^{(i)}}(1-h_\theta(x^{(i)}))^{1-y^{(i)}} L(θ)=i=1mhθ(x(i))y(i)(1hθ(x(i)))1y(i)
我们要求 θ\thetaθ 的极大似然估计,找到参数 θ\thetaθ 使得似然函数 LLL 的值最大,即找到一组参数 θ\thetaθ ,使得:

  • yyy 为正类,模型预测 y=1y=1y=1 的概率最大;
  • yyy 为负类,模型预测 y=0y=0y=0 的概率最大。

同样还是取对数:
lnL(θ)=∑i=1my(i)lnhθ(x(i))+∗(1−y(i))ln(1−hθ(x(i)))lnL(\theta)=\sum_{i=1}^my^{(i)}lnh_\theta(x^{(i)})+*(1-y^{(i)})ln(1-h_\theta(x^{(i)})) lnL(θ)=i=1my(i)lnhθ(x(i))+(1y(i))ln(1hθ(x(i)))
我们希望得到的是最大化值的参数估计,相当于是求 LLL 函数的最大值。对于求最大值,相比线性回归,我们唯一区别是这里使用了梯度上升法,也可以给 LLL 加个负号,然后仍然用梯度下降法,可能熟悉的朋友已经发现了,这里的 −lnL(θ)-lnL(\theta)lnL(θ)就是我们熟悉的交叉熵损失:
θ+=θ−α−∂lnL(θ)∂θ\theta^+=\theta-\alpha\frac{-\partial{lnL(\theta)}}{\partial\theta} θ+=θαθlnL(θ)
求导得:
∂lnL(θ)∂θj=(y−hθ(x))xj\frac{\partial{lnL(\theta)}}{\partial\theta_j}=(y-h_\theta(x))x_j θjlnL(θ)=(yhθ(x))xj
即可得到第 jjj 个参数的更新公式:
θj+=θj+α(y(i)−hθ(x(i)))xj(i)\theta_j^+=\theta_j+\alpha(y^{(i)}-h_\theta(x^{(i)}))x_j^{(i)} θj+=θj+α(y(i)hθ(x(i)))xj(i)

代码

给出上海房价与幸福关系的预测代码

#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <cmath>
#include <tuple>
#include <iomanip>
#include <stdarg.h>using namespace std;struct Item{float area;float distance;float label;
};#define INFO(...)  ::__printf(__FILE__, __LINE__, __VA_ARGS__)void __printf(const char* file, int line, const char* fmt, ...){va_list vl;va_start(vl, fmt);// None   = 0,     // 无颜色配置// Black  = 30,    // 黑色// Red    = 31,    // 红色// Green  = 32,    // 绿色// Yellow = 33,    // 黄色// Blue   = 34,    // 蓝色// Rosein = 35,    // 品红// Cyan   = 36,    // 青色// White  = 37     // 白色/* 格式是: \e[颜色号m文字\e[0m   */printf("\e[32m[%s:%d]:\e[0m ", file, line);vprintf(fmt, vl);printf("\n");
}/* 通过csv文件加载数据 */
vector<Item> load_data(const string& file){vector<Item> output;fstream ifile(file, ios::binary | ios::in);string line;getline(ifile, line);while(getline(ifile, line)){int p0 = line.find(",");int p1 = line.find(",", p0 + 1);Item item;item.area     = atof(line.substr(0, p0).c_str());item.distance = atof(line.substr(p0+1, p1).c_str());item.label    = atof(line.substr(p1+1).c_str());// cout << item.area << ", " << item.distance << ", " << item.label << endl;output.emplace_back(item);}return output;
}/* 计算数据的均值和标准差 */
tuple<Item, Item> compute_mean_std(const vector<Item>& items){Item mean{0, 0}, stdval{0, 0};for(auto& item : items){mean.area  += item.area;mean.distance += item.distance;}mean.area  /= items.size();mean.distance /= items.size();for(auto& item : items){stdval.area  += std::pow(item.area - mean.area, 2.0f);stdval.distance += std::pow(item.distance - mean.distance, 2.0f);;}stdval.area  = std::sqrt(stdval.area / items.size());stdval.distance = std::sqrt(stdval.distance / items.size());return make_tuple(mean, stdval);
}double sigmoid(double x){return 1 / (1 + std::exp(-x));
}int run(){auto datas = load_data("shanghai.csv");Item mean, stdval;tie(mean, stdval) = compute_mean_std(datas);/* 对数据进行减去均值除以标准差,使得均值为0,标准差为1 */for(auto& item : datas){item.area     = (item.area - mean.area) / stdval.area;item.distance = (item.distance - mean.distance) / stdval.distance;}float k_area = 0.1;float k_dist = 0.1;float b = 0;float lr = 0.1;for(int iter = 0; iter < 1000; ++iter){float loss = 0;float delta_k_area = 0;float delta_k_dist = 0;float delta_b      = 0;for(auto& item : datas){float predict = k_area * item.area + k_dist * item.distance + b;double logistic = sigmoid(predict);float L = -(std::log(logistic) * item.label + std::log(1 - logistic) * (1 - item.label));delta_k_area += (logistic - item.label) * item.area;delta_k_dist += (logistic - item.label) * item.distance;delta_b      += (logistic - item.label);loss += L;}if(iter % 100 == 0)cout << "Iter " << iter << ", Loss: " << setprecision(3) << loss << endl;k_area = k_area - lr * delta_k_area;k_dist = k_dist - lr * delta_k_dist;b      = b      - lr * delta_b;}INFO("模型参数:k_area = %f, k_dist = %f, b = %f", k_area, k_dist, b);INFO("数据集:area_mean = %f, dist_mean = %f, area_std = %f, dist_std = %f", mean.area, mean.distance, stdval.area, stdval.distance);INFO("""k_area = %f\n""k_distance = %f\n""b = %f\n""area_mean = %f\n""area_std = %f\n""distance_mean = %f\n""distance_std = %f", k_area, k_dist, b, mean.area, stdval.area, mean.distance, stdval.distance);float area          = 100;float distance      = 2000;float norm_area     = (area - mean.area) / stdval.area;float norm_dist     = (distance - mean.distance) / stdval.distance;float predict       = k_area * norm_area + k_dist * norm_dist + b;float logistic      = sigmoid(predict);INFO("在上海,对于房屋面积 %.0f 平方米,距离地铁 %.0f 米的住户而言,他们觉得生活是 【%s】 的.",area, distance, logistic > 0.5 ? "幸福" : "并不幸福");return 0;
}
int main(){return run();
}

Ref

  1. 【机器学习】逻辑回归十分钟学会,通俗易懂(内含spark求解过程)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hbase 页面访问_HBase

HBase 特点 海量存储 Hbase 适合存储 PB 级别的海量数据&#xff0c;在 PB 级别的数据以及采用廉价 PC 存储的情况下&#xff0c;能在几十到百毫秒内返回数据。这与 Hbase 的极易扩展性息息相关。正式因为 Hbase 良好的扩展性&#xff0c;才为海量数据的存储提供了便利。 2&…

深入理解L1、L2正则化

深入理解L1、L2正则化 转自&#xff1a;【面试看这篇就够了】L1、L2正则化理解 一、概述 正则化&#xff08;Regularization&#xff09;是机器学习中一种常用的技术&#xff0c;其主要目的是控制模型复杂度&#xff0c;减小过拟合。正则化技术已经成为模型训练中的常用技术&a…

机器学习中的概率模型

机器学习中的概率模型 转自&#xff1a;https://zhuanlan.zhihu.com/p/164551678 机器学习中的概率模型 概率论&#xff0c;包括它的延伸-信息论&#xff0c;以及随机过程&#xff0c;在机器学习中有重要的作用。它们被广泛用于建立预测函数&#xff0c;目标函数&#xff0c;以…

max std value 宏_Rust Macro/宏 新手指南

Rust语言最强大的一个特点就是可以创建和利用宏/Macro。不过创建 Rust宏看起来挺复杂&#xff0c;常常令刚接触Rust的开发者心生畏惧。这片文章 的目的就是帮助你理解Rust Macro的基本运作原理&#xff0c;学习如何创建自己的 Rust宏。相关链接&#xff1a;在线学编程 - 汇智网…

农林资金 大数据审计案例_大数据审计:现状与发展

大数据审计&#xff1a;现状与发展【摘要】传统手工环境下&#xff0c;审计人员常用的审计方法包括检查法、观察法、重新计算法、外部调查法、分析法、鉴定法等。随着信息技术的发展&#xff0c;被审计单位的运行越来越依赖于信息化环境。信息化环境下审计工作发生了巨大的变化…

angularjs sill 创建项目_开源项目——博客项目MyBlogs.Core,基于.NET 5

个人博客站项目源码&#xff0c;高性能低占用的博客系统&#xff0c;这也许是我个人目前写过的性能最高的web项目了 。目前日均处理请求数80-120w次&#xff0c;同时在线活跃用户数30-100人&#xff0c;数据量累计已达到100多万条&#xff0c;数据库Redis网站主程序同时运行在一…

怀旧服推荐配置_【怀旧服】狂暴战P4毕业装备推荐

在怀旧服开启P4阶段之后&#xff0c;狂暴战玩家的输出也得到了进一步的提升。当然&#xff0c;狂暴战想要打出足够的伤害离不开对应的装备&#xff0c;现在就给大家介绍下狂暴战P4阶段的BIS装备。散件装备狂暴战在这一阶段依旧有非常不错的散件装备&#xff0c;个人建议玩家入手…

高斯混合模型GMM及EM迭代求解算法(含代码实现)

高斯混合模型GMM及EM迭代求解算法&#xff08;含代码实现&#xff09; 高斯分布与高斯混合模型 高斯分布 高斯分布大家都很熟悉了&#xff0c;下面是一元高斯分布的概率密度函数&#xff08;Probability Density Function&#xff0c;PDF&#xff09;&#xff1a; P(x)N(μ,…

十个模块_专栏 | ABAQUS Part模块的十个小技巧

作者介绍星辰_北极星2012年开始从事Abaqus仿真相关工作&#xff0c;服务大小课题逾百项; 主要仿真领域&#xff1a;石油工程、岩土工程和金属加工工艺&#xff1b; 重点研究方向&#xff1a;ABAQUS GUI二次开发、固体力学、断裂以及损伤等。Abaqus有部件(Part)和装配体(Assembl…

深度学习时代的视频理解综述

深度学习时代的视频理解综述 本文为b站bryanyzhu老师四期视频理解相关论文解读的汇总图文笔记。 我们先精读深度学习时代视频理解领域最为重要的两篇论文&#xff1a;双流网络和 I3D。它们分别是领域内两大类方法双流&#xff08;利用光流&#xff09;网络和 3D CNN 网络的代…

typec扩展坞hdmi没反应_typec扩展坞转hdmi/vga多功能网口usb转换器苹果华为电脑matebook6元优惠券券后价26.8元...

★typec扩展坞转hdmi/vga多功能网口usb转换器苹果华为电脑matebook&#xff0c;6元拼多多优惠券★券后价26.8元★★★typec扩展坞转hdmi/vga多功能网口usb转换器苹果华为电脑matebook&#xffe5;26.8元&#xffe5;32.8元已拼5097件点击抢购猜你喜欢[速发]喵喵机P1热敏打印机手…

NLP任务概览

NLP任务概览 本文为台湾大学李宏毅老师视频课程笔记。本课程介绍了 &#xff08;2020年&#xff09;NLP 领域常见的 17 种任务。本文只会从输入输出的角度概览多种 NLP 任务&#xff0c;并简介它们的常见做法&#xff0c;并不会细致地介绍每个任务模型的具体细节。 两种模式与…

大物实验总结模板_期中总结大会amp;期末动员大会

在逐渐降温的双创周麦包坊的期中总结暨期末动员大会来啦在学长团和小麦包的分享下希望大家重新启航奋斗期末板块一学长团经验分享面对本学期十二门科目&#xff0c;作为过来人的前辈们给出很多对本学期各科目的针对性建议&#xff0c;可谓是干货满满&#xff0c;快来瞧瞧吧&…

PTMs:NLP预训练模型的全面总结

PTMs&#xff1a;NLP预训练模型的全面总结 转自&#xff1a;https://zhuanlan.zhihu.com/p/115014536 预训练模型(Pre-trained Models,PTMs) 的出现将NLP带入了一个全新时代。2020年3月18日&#xff0c;邱锡鹏老师发表了关于NLP预训练模型的综述《Pre-trained Models for Natur…

python中提取几列_Python一键提取PDF中的表格到Excel(实例50)

从PDF文件获取表格中的数据&#xff0c;也是日常办公容易涉及到的一项工作。一个一个复制吧&#xff0c;效率确实太低了。用Python从PDF文档中提取表格数据&#xff0c;并写入Excel文件&#xff0c;灰常灰常高效。上市公司的年报往往包含几百张表格&#xff0c;用它作为例子再合…

详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解

详解最大似然估计&#xff08;MLE&#xff09;、最大后验概率估计&#xff08;MAP&#xff09;&#xff0c;以及贝叶斯公式的理解 声明&#xff1a;本文为原创文章&#xff0c;发表于nebulaf91的csdn博客。欢迎转载&#xff0c;但请务必保留本信息&#xff0c;注明文章出处。 本…

重新打开_iPhone 应用停止响应或无法打开的解决办法

如果当您在 iPhone 上使用某个重要应用时&#xff0c;遇到应用停止响应、意外退出或无法打开的问题&#xff0c;请参考如下步骤尝试解决&#xff1a;1.强制退出应用&#xff1a;在 iPhone 后台强制关闭该应用之后&#xff0c;再次重新打开看看。2.重启您的设备&#xff0c;然后…

机器学习理论——优雅的模型:变分自编码器(VAE)

机器学习理论——优雅的模型&#xff1a;变分自编码器&#xff08;VAE&#xff09; 转自&#xff1a;机器学习理论—优雅的模型&#xff08;一&#xff09;&#xff1a;变分自编码器&#xff08;VAE&#xff09; 另外直观理解 VAE&#xff0c; 推荐 台大李宏毅老师的课程&#…

基于流的(Flow-based)生成模型简介

基于流的(Flow-based)生成模型简介 生成任务 我们先回顾一下所谓的生成任务&#xff0c;究竟是做什么事情。我们认为&#xff0c;世界上所有的图片&#xff0c;是符合某种分布 pdata(x)p_{data}(x)pdata​(x) 的。当然&#xff0c;这个分布肯定是个极其复杂的分布。而我们有一…

iec60870-5-104通讯协议编程_三菱FX编程口通讯协议1——协议解读

三菱PLC编程口通讯协议&#xff1a;1、三菱PLC编程口通讯协议有四个命令&#xff0c;如下&#xff1a;2、三菱FX系列PLC地址对应表&#xff1a;PLC_X Group Base AddRess128&#xff1b;Const PLC_Y_Group Base AddRess160&#xff1b;M _Group Base_AddRess 256&#xff1b;P…