您的位置:首页 > 其它

人工智障学习笔记——机器学习(2)线性模型

2017-11-02 15:48 537 查看
一.概念

线性模型:就是线性的模型。



其实我在网上搜了很久,想用一句话能够简单易懂的表达出这个概念,但是确实不知道该怎么组织语言。不过相信有一些数学基础的同学应该是能明白的。

我们可以这样认为,世界上所有的问题都可以用公式表达,如果任何问题都是可以用线性模型来描述的,那么我们人人都可以预测未来,因为其模型非常的简单。但是很遗憾,大多数问题都是非线性的。

二.线性回归

线性回归(linearregression)通过学习到一个线性模型来尽可能准确地预测实值输出标记。这句话的意思就是说,训练出一个线性模型的学习器,然后用来预测实值输出。

常用的几种求解算法:

1.梯度下降法:沿梯度下降的方向求解极小值(也可以沿梯度上升方向求解极大值),算法迭代的终止条件是梯度向量的幅值接近0即可,可以设置个非常小的常数阈值。

C++代码

#include<iostream>
#include<cmath>
#include<ctime>
using namespace std;
double f(double x)
{
return x*x - 2 * x + 1;
}
double g(double x)
{
return 2 * x - 2;
}
double GradientDescent(double xs, double s)
{
double x = xs;
double y;
int i = 0;
while(++i)
{
double grad = -1 * g(x);
x += grad*s;
y = f(x);
cout << "i = " << i << " grad = " << grad << " x = " << x << " y = " << y << endl;
if (abs(grad) < 1e-6)
break;
}
return x;
}
int main()
{
double xk = -5, ak = 0.1;
GradientDescent(xk, ak);
system("pause");
}



2.最小二乘法:通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。

C++代码

#include<iostream>
#include<cmath>
using namespace std;
class Point //Point类的声明
{
public: //外部接口
Point(float xx = 0, float yy = 0) { X = xx; Y = yy; }
float GetX()
4000
{ return X; }
float GetY() { return Y; }
friend float linefit(Point l_point[], int n_point);
private: //私有数据成员
float X, Y;
};

float linefit(Point l_point[], int n_point)
{
float av_x, av_y; //声明变量
float L_xx, L_yy, L_xy;
//变量初始化
av_x = 0; //X的平均值
av_y = 0; //Y的平均值
L_xx = 0; //Lxx
L_yy = 0; //Lyy
L_xy = 0; //Lxy
for (int i = 0; i<n_point; i++) //计算X、Y的平均值
{
av_x += l_point[i].X / n_point;
av_y += l_point[i].Y / n_point;
}
for (int i = 0; i<n_point; i++) //计算Lxx、Lyy和Lxy
{
L_xx += (l_point[i].X - av_x)*(l_point[i].X - av_x);
L_yy += (l_point[i].Y - av_y)*(l_point[i].Y - av_y);
L_xy += (l_point[i].X - av_x)*(l_point[i].Y - av_y);
}
cout << "a=" << L_xy / L_xx << endl; //输出回归系数a
cout << "b=" << av_y - L_xy*av_x / L_xx << endl; //输出回归系数b
return float(L_xy / sqrt(L_xx*L_yy)); //返回相关系数r
}

int main()
{
Point l_p[10] = {
Point(208,21.6),
Point(152,15.5),
Point(113,10.4),
Point(227,31.0),
Point(137,13.0),
Point(238,32.4),
Point(178,19.0),
Point(104,10.4),
Point(191,19.0),
Point(130,11.8) };
float r = linefit(l_p, 10); //进行线性回归计算
cout << "r=" << r << endl; //输出相关系数
system("pause");
}





三、逻辑回归

逻辑回归(Logistic Regression, LR)其实就是在线性回归的基础上,套用了一个逻辑函数。逻辑回归是属于线性模型的,因为逻辑回归的决策边界(decision boundary)是线性的。它只是在特征到结果的映射中加入了一个sigmoid函数。即先把特征求和,然后使用非线性的函数将连续值映射到0与1之间。

逻辑回归与线性回归的差别:

1)线性回归要求变量服从正态分布,逻辑回归对变量分布没有要求。

2)线性回归要求因变量是连续性数值变量,而逻辑回归要求因变量是分类型变量。

3)线性回归要求自变量和因变量呈线性关系,而逻辑回归不要求自变量和因变量呈线性关系

4)逻辑回归是分析因变量取某个值的概率与自变量的关系,而线性回归是直接分析因变量与自变量的关系

总之, 逻辑回归与线性回归实际上有很多相同之处,最大的区别就在于他们的因变量不同,其他的基本都差不多,正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalized linear model)。这一家族中的模型形式基本上都差不多,不同的就是因变量不同,如果是连续的,就是多重线性回归,如果是二项分布,就是逻辑回归。逻辑回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。所以实际中最为常用的就是二分类的逻辑回归。

四、总结

线性模型使用简单的公式通过一组数据点来查找「最优拟合」线。通过你已知的变量方程,你可以求出你想要预测的变量。为了求出预测量,我们输入已知的变量得到答案。

线性回归和逻辑回归都有着相同的缺点。两者都具有「过拟合(overfit)」的趋势,这意味着模型太适应于数据而牺牲了推广到先前未知的数据的能力。因此,这两个模型经常需要进行规范,这意味着它们有一定的惩罚(penalty)以防止过拟合。还有就是因为它们太简单了,所以往往不能预测更复杂的行为。

五、相关学习资源

https://wenku.baidu.com/view/c62809e66c85ec3a86c2c500.html

http://www.cnblogs.com/voyagflyer/p/5570446.html

http://www.sohu.com/a/128440208_465975
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: