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

一.概念

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


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

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


二.线性回归

线性回归(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() { 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值