如何优化python 机器学习库中的函数

机器学习经典算法详解及Python实现&线性回归(Linear&Regression)算法_实验室的小渣渣_新浪博客
机器学习经典算法详解及Python实现&线性回归(Linear&Regression)算法
(一)认识回归
回归是统计学中最有力的工具之一。机器学习监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型、连续性而定义的。顾名思义,分类算法用于离散型分布预测,如前面讲过的KNN、决策树、朴素贝叶斯、adaboost、SVM、Logistic回归都是分类算法;回归算法用于连续型分布预测,针对的是数值型的样本,使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。
回归的目的就是建立一个回归方程用来预测目标值,回归的求解就是求这个回归方程的回归系数。预测的方法当然十分简单,回归系数乘以输入值再全部相加就得到了预测值。
1,回归的定义
回归最简单的定义是,给出一个点集D,用一个函数去拟合这个点集,并且使得点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,那就被称为线性回归,如果曲线是一条二次曲线,就被称为二次回归。
2,多元线性回归
假定预测值与样本特征间的函数关系是线性的,回归分析的任务,就在于根据样本X和Y的观察值,去估计函数h,寻求变量之间近似的函数关系。定义:
其中,n = 特征数目;
xj = 每个训练样本第j个特征的值,可以认为是特征向量中的第j个值。
为了方便,记x0= 1,则多变量线性回归可以记为:
,(θ、x都表示(n+1,1)维列向量)
Note:注意多元和多次是两个不同的概念,“多元”指方程有多个参数,“多次”指的是方程中参数的最高次幂。多元线性方程是假设预测值y与样本所有特征值符合一个多元一次线性方程。
3,广义线性回归
用广义的线性函数:
wj是系数,w就是这个系数组成的向量,它影响着不同维度的Φj(x)在回归函数中的影响度,Φ(x)是可以换成不同的函数,这样的模型我们认为是广义线性模型,Φ(x)=x时就是多元线性回归模型。
(二)线性回归的求解
说到回归,常常指的也就是线性回归,因此本文阐述的就是多元线性回归方程的求解。假设有连续型值标签(标签值分布为Y)的样本,有X={x1,x2,…,xn}个特征,回归就是求解回归系数θ=θ0,
θ1,…,θn。那么,手里有一些X和对应的Y,怎样才能找到θ呢?
在回归方程里,求得特征对应的最佳回归系数的方法是最小化误差的平方和。这里的误差是指预测y值和真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以采用平方误差(最小二乘法)。平方误差可以写做:
至于为何采用最小误差平方和来求解,其统计学原理可参考“对线性回归、逻辑回归、各种回归的概念学习”的“深入线性回归”一节。
在数学上,求解过程就转化为求一组θ值使求上式取到最小值,那么求解方法有梯度下降法、Normal
Equation等等。梯度下降有如下特点:需要预先选定步长a、需要多次迭代、特征值需要Scaling(统一到同一个尺度范围)。因此比较复杂,还有一种不需要迭代的求解方式&Normal
Equation,简单、方便、不需要Feature Scaling。Normal
Equation方法中需要计算X的转置与逆矩阵,计算量很大,因此特征个数多时计算会很慢,只适用于特征个数小于100000时使用;当特征数量大于100000时使用梯度法。另外,当X不可逆时就有岭回归算法的用武之地了。
下面就概括一下常用的几种求解算法。
1,梯度下降法(Gradient Descent)
根据平方误差,定义该线性回归模型的损耗函数(Cost Function)为:
,(系数是为了方便求导展示)
线性回归的损耗函数的值与回归系数θ的关系是碗状的,只有一个最小点。线性回归的求解过程如同Logistic回归,区别在于学习模型函数hθ(x)不同,梯度法具体求解过程参考“机器学习经典算法详解及Python实现—Logistic回归(LR)分类器”。
2,Normal Equation(也叫普通最小二乘法)
Normal Equation算法也叫做普通最小二乘法(ordinary least
squares),其特点是:给定输人矩阵X,如果XTX的逆存在并可以求得的话,就可以直接采用该方法求解。其求解理论也十分简单:既然是是求最小误差平方和,另其导数为0即可得出回归系数。
矩阵X为(m,n+1)矩阵(m表示样本数、n表示一个样本的特征数),y为(m,1)列向量。
上述公式中包含XTX,
也就是需要对矩阵求逆,因此这个方程只在逆矩阵存在的时候适用。然而,矩阵的逆可能并不存在,后面“岭回归”会讨论处理方法。
3,局部加权线性回归
线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计。显而易见,如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引人一些偏差,从而降低预测的均方误差。其中的一个方法是局部加权线性回归(LocallyWeightedLinearRegression,
LWLR )。在该算法中,我们给待预测点附近的每个点赋予一定的权重.于是公式变为:
,W是(m,m)矩阵,m表示样本数。
“核”(与支持向量机中的核类似)来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:
,k需要优化选择.
局部加权线性回归也存在一个问题,即增加了计算量,因为它对每个点做预测时都必须使用整个数据集,而不是计算出回归系数得到回归方程后代入计算即可。因此该算法不被推荐。
4,岭回归(ridge regression)和缩减方法
当数据的样本数比特征数还少时候,矩阵XTX的逆不能直接计算。即便当样本数比特征数多时,XTX
的逆仍有可能无法直接计算,这是因为特征有可能高度相关。这时可以考虑使用岭回归,因为当XTX
的逆不能计算时,它仍保证能求得回归参数。简单说来,岭回归就是对矩阵XTX进行适当的修正,变为(I是单位矩阵,对角线为1,其他为0)从而使得矩阵非奇异,进而能对式子求逆。在这种情况下,回归系数的计算公式将变成:
为了使用岭回归和缩减技术,首先需要对特征做标准化处理,使各特征值的取值尺度范围相同,从而保证各特征值的影响力是相同的。
如何设置 λ 的值?通过选取不同的λ 来重复上述测试过程,最终得到一个使预测误差最小的λ
。可通过交叉验证获取最优值&在测试数据上,使误差平方和最小。
岭回归最先用来处理特征数多于样本数的情况,现在也用于在估计中加人偏差,从而得到更好的估计。事实上,上述公式是在最小平方误差和公式里引入了每个特征的惩罚因子得到,为的是防止过度拟合(过于复杂的模型),在损失函数里增加一个每个特征的惩罚因子,这就是线性回归的正则化(参考“Coursera公开课笔记:
斯坦福大学机器学习第七课“正则化(Regularization)”)。
Note:θ0是一个常数,x0=1是固定的,那么θ0不需要惩罚因子,岭回归公式中的I的第一个元素要为0。
这里通过引入λ来限制了所有误差平方之和,通过引人该惩罚项,能够减少不重要的参数,这个技术在统计学中也叫做缩减(shrinkage
)。缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果,缩减法还可以看做是对一个数据模型的拟合采取了偏差(预测值与真实值差距)、方差(不同预测模型间的差距)折中方案,增加偏差的同时减少方差。偏差方差折中是一个重要的概念,可以帮助我们理解现有模型并做出改进,从而得到更好的模型。岭回归是缩减法的一种,相当于对回归系数的大小施加了限制。另一种很好的缩减法是lasso。lasso难以求解,但可以使用计算简便的逐步线性回归方法来求得近似结果。还有一些其他缩减方法,如lasso、LAR、PCA回归以及子集选择等。与岭回归一样,这些方法不仅可以提高预测精确率,而且可以解释回归系数。
4,回归模型性能度量
数据集上计算出的回归方程并不一定意味着它是最佳的,可以便用预测值yHat和原始值y的相关性来度量回归方程的好坏。相关性取值范围0~1,值越高说明回归模型性能越好。
线性回归是假设值标签与特征值之间的关系是线性的,但有些时候数据间的关系可能会更加复杂,使用线性的模型就难以拟合,就需要引入多项式曲线回归(多元多次拟合)或者其他回归模型,如回归树。
(三)线性回归的Python实现
本线性回归的学习包中实现了普通最小二乘和岭回归算法,因梯度法和Logistic
Regression几乎相同,也没有特征数&10000的样本测试运算速度,所以没有实现。为了支持多种求解方法、也便于扩展其他解法,linearRegress对象采用Dict来存储相关参数(求解方法为key,回归系数和其他相关参数的List为value)。例如岭回归算法在LRDict中的key=‘ridge’,value=[ws,
lamba,xmean,var, ymean]。因为岭回归模型训练和预测中需要对样本进行feature
scaling,所以才需要存储xmean,var,
ymean。linearRegress对象的属性如其__init__函数所示:
Source Code:▼Copy
class linearRegress(object):
def __init__(self,LRDict = None, **args):
”’currently support OLS, ridge, LWLR
obj_list = inspect.stack()[1][-2]
self.__name__ = obj_list[0].split(‘=’)[0].strip()
if not LRDict:
self.LRDict = {}
self.LRDict = LRDict
#to Numpy matraix
if ‘OLS’ in self.LRDict:
self.LRDict[‘OLS’] = mat(self.LRDict[‘OLS’])
if ‘ridge’ in self.LRDict:
self.LRDict[‘ridge’][0] = mat(self.LRDict[‘ridge’][0])
self.LRDict[‘ridge’][2] = mat(self.LRDict[‘ridge’][2])
self.LRDict[‘ridge’][3] = mat(self.LRDict[‘ridge’][3])
self.LRDict[‘ridge’][4] = mat(self.LRDict[‘ridge’][4])
线性回归模型Python学习包下载地址为:
Machine Learning Linear Regression-线性回归
(四)应用
对于需要根据一些特征的组合来预测一个值(如预测房价、菜价等)且预测值和特征组合间的关系是线性时既可以采用线性回归建立预测模型。
线性回归和逻辑回归
机器学习入门:线性回归及梯度下降
对线性回归、逻辑回归、各种回归的概念学习
Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)
特征选择常用算法综述
文章出处:机器学习经典算法详解及Python实现&线性回归(Linear
Regression)算法。
实验室的小渣渣
博客等级:
博客积分:0
博客访问:2,071
关注人气:0
荣誉徽章:更多公众号:gh_61d发布教育部信息网络工程研究中心的工作讯息、科研成果、学术动态最新文章相关推荐搜狗:感谢您阅读【程序员进阶之路】Python中最好用的机器学习库,本文可能来自网络,如果侵犯了您的相关权益,请联系管理员。QQ:1.7 NumPy函数库基础
本文所属图书&>&
机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存、谋发展的决定性手段,这使得这一过去为分析师和数学家所专属的研究...&&
机器学习算法涉及很多线性代数知识,因此本书在使用语言构造机器学习应用时,会经常使用NumPy函数库。如果不熟悉线性代数也不用着急,这里用到线性代数只是为了简化不同的数据点上执行的相同数学运算。将数据表示为矩阵形式,只需要执行简单的矩阵运算而不需要复杂的循环操作。在你使用本书开始学习机器学习算法之前,必须确保可以正确运行开发环境,同时正确安装了NumPy函数库。NumPy函数库是Python开发环境的一个独立模块,而且大多数Python发行版没有默认安装NumPy函数库,因此在安装Python之后必须单独安装NumPy函数库。在Windows命令行提示符下输入c:\Python27\python.exe,在或者Mac OS的终端上输入python,进入Python shell开发环境。今后,一旦看到下述提示符就意味着我们已经进入Python shell开发环境:
在Python shell开发环境中输入下列命令:
上述命令将NumPy函数库中的所有模块引入当前的命名空间。Mac OS上输出结果如图1-3所示。
图1-3 命令行启动Python并在Python shell开发环境中导入模块
然后在Python shell开发环境中输入下述命令:
上述命令构造了一个4&4的随机数组,因为产生的是随机数组,不同计算机的输出结果可能与上述结果完全不同。
NumPy矩阵与数组的区别
NumPy函数库中存在两种不同的数据类型(矩阵matrix和数组array),都可以用于处理行列表示的数字元素。虽然它们看起来很相似,但是在这两个数据类型上执行相同的数学运算可能得到不同的结果,其中NumPy函数库中的matrix与MATLAB中matrices等价。
调用mat()函数可以将数组转化为矩阵,输入下述命令:
由于使用随机函数产生矩阵,不同计算机上输出的值可能略有不同:
.I操作符实现了矩阵求逆的运算。非常简单吧?没有NumPy库,Python也不能这么容易算出来矩阵的逆运算。不记得或者没学过矩阵求逆也没关系,NumPy库帮我们做完了,执行下面的命令存储逆矩阵:
接着执行矩阵乘法,得到矩阵与其逆矩阵相乘的结果:
结果应该是单位矩阵,除了对角线元素是1,4&4矩阵的其他元素应该全是0。实际输出结果略有不同,矩阵里还留下了许多非常小的元素,这是计算机处理误差产生的结果。输入下述命令,得到误差值:
函数eye(4)创建4&4的单位矩阵。
只要能够顺利地完成上述例子,就说明已经正确地安装了NumPy函数库,以后我们就可以利用它构造机器学习应用程序。即使没有提前学习所有的函数也没有关系,本书将在需要的时候介绍更多的NumPy函数库的功能。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'python 机器学习特征没有值怎么处理_百度知道

我要回帖

 

随机推荐