最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。通过一元线性模型应用来理解最小二乘法。

监督学习任务中,预测离散结果的是分类任务,预测连续结果的是回归任务。在回归任务中,预测结果y和x的函数关系中,一元线性回归只包含一个属性的,对应的线性关系;二元线性回归包含两个属性,对应的平面关系;d元线性回归就包括d个属性,对应的超平面关系。

在一元线性回归任务中,给定数据集{(x1,y1),(x2,y2),…,(xn,yn)},有n个(xi,yi)数据对,在坐标中对应n个点,要拟合这n个点为一条直线的线性关系,自然是直线在n个点中间最好。但显然有很多直线满足,怎么衡量呢?选择怎样的直线最好呢?标准是什么?选择最佳直线的标准是:使总的拟合误差(即总残差)达到最小。

1)用“残差和最小”确定直线位置,存在相互抵消的问题。

2)用“残差绝对值和最小”确定直线位置,但绝对值的计算比较麻烦。

3)最小二乘法的原则是以“残差平方和最小”确定直线位置,用最小二乘法除了计算比较方便外,得到的估计量还具有优良特性、对异常值非常敏感。

综上,我们选用最小二乘法的误差平方和最小作为标准来选出一条直线作为n个点的拟合直线。最常用的是普通最小二乘法( Ordinary  Least Square,OLS):所选择的回归模型应该使所有观察值的残差平方和达到最小。(Q为残差平方和)- 即采用平方损失函数。

数学形式定义直线为:

f(xi)=yi=axi+b+ei;

其中,i∈[1,n],ei是样本(xi,yi)的真实值yi=axi+b+ei和拟合值y’i= axi+b的误差,即ei= yi-axi-b。

最小二乘法一元线性回归模型的Java实现,参考代码如下:

package sk.ml;import java.text.DecimalFormat;
import java.util.Random;/** 功能:一元线性回归模型最小二乘法Java实现* 作者:Jason.F* 时间:2017-01-16*/
public class LeastSquares {private final static int n=20;//随机生成10个点的(x,y)public static void main(String[] args){//随机生成20个坐标点Random random = new Random(); double[] x=new double[n];double[] y=new double[n];for(int i=0;i<n;i++){//随机生成n个double数x[i]=Double.valueOf(Math.floor(random.nextDouble()*(99-1)));y[i]=Double.valueOf(Math.floor(random.nextDouble()*(999-1)));}/* y = a x + b* b = sum( y ) / n - a * sum( x ) / n* a = ( n * sum( xy ) - sum( x ) * sum( y ) ) / ( n * sum( x^2 ) - sum(x) ^ 2 )* */estimate(x, y, x.length );}/*** 预测* @param x,y,i*/public static void estimate( double[] x , double[] y , int i ) {double a = getA( x , y ) ;double b = getB( x , y , a ) ;//设置doubl字符串输出格式,不以科学计数法输出  DecimalFormat df=new DecimalFormat("#,##0.00");//格式化设置System.out.println("y="+df.format(a)+"x"+"+"+df.format(b));}/*** 计算 x的系数a* @param x, y* @return a*/public static double getA( double[] x , double[] y ){int n = x.length ;return ( n * pSum( x , y ) - sum( x ) * sum( y ) )/ ( n * sqSum( x ) - Math.pow(sum(x), 2) ) ;}/*** 计算常量系数b* @param x,y,a* @returnb*/public static double getB( double[] x , double[] y , double a ){int n = x.length ;return sum( y ) / n - a * sum( x ) / n ;}/*** 计算常量系数b* @param x, y* @return b*/public static double getC( double[] x , double[] y ){int n = x.length ;double a = getA( x , y ) ;return sum( y ) / n - a * sum( x ) / n ;}//计算和值private static double sum(double[] ds) {double s = 0 ;for( double d : ds ) s = s + d ;return s ;}//计算开平方和值private static double sqSum(double[] ds) {double s = 0 ;for( double d : ds ) s = s + Math.pow(d, 2) ;return s ;}//计算x和y积的和值private static double pSum( double[] x , double[] y ) {double s = 0 ;for( int i = 0 ; i < x.length ; i++ ) s = s + x[i] * y[i] ;return s ;}
}

随机生成的一次执行结果如下:

y=-0.29x+541.23

机器学习知识点(四)最小二乘法Java实现相关推荐

  1. 机器学习知识点(七)决策树学习算法Java实现

    为理解机器学习第四章节决策树学习算法,通过网上找到的一份现成代码,主要实现了最优划分属性选择和决策树构造,其中最优划分属性选择采用信息增益准则.决策树构造采用递归实现,代码如下: package sk ...

  2. 一天1个机器学习知识点(四)

    陆陆续续整理的机器学习的知识点,资料大多数来自网上,不做盈利目的,如果侵权请告知即删!如果文章中有错误的地方还请各位同学指正,,一起学习,一起进步! 每天都在更新中,记得收藏,每天进步一点点!! 一天 ...

  3. 一天1个机器学习知识点(三)

    陆陆续续整理的机器学习的知识点,资料大多数来自网上,不做盈利目的,如果侵权请告知即删!如果文章中有错误的地方还请各位同学指正,,一起学习,一起进步! 每天都在更新中,记得收藏,每天进步一点点!! 一天 ...

  4. 四、Android学习第四天——JAVA基础回顾(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天--JAVA基础回顾 这才学习Android的 ...

  5. Coursera公开课笔记: 斯坦福大学机器学习第四课“多变量线性回归(Linear Regression with Multiple Variables)”

    Coursera公开课笔记: 斯坦福大学机器学习第四课"多变量线性回归(Linear Regression with Multiple Variables)" 斯坦福大学机器学习第 ...

  6. 一天1个机器学习知识点(五)

    陆陆续续整理机器学习的知识点,资料大多数来自网上,不做盈利目的,如果侵权请告知即删!如果文章中有错误的地方还请各位同学指正,一起学习,一起进步! 每天都在更新中,记得收藏,每天进步一点点!! 一天1个 ...

  7. 一天1个机器学习知识点(二)

    陆陆续续整理的机器学习的知识点,资料大多数来自网上,不做盈利目的,如果侵权请告知即删!如果文章中有错误的地方还请各位同学指正,,一起学习,一起进步! 每天都在更新中,记得收藏,每天进步一点点!! 一天 ...

  8. 机器学习知识点全面总结

    ✨写在前面:强烈推荐给大家一个优秀的人工智能学习网站,内容包括人工智能基础.机器学习.深度学习神经网络等,详细介绍各部分概念及实战教程,通俗易懂,非常适合人工智能领域初学者及研究者学习.➡️点击跳转到 ...

  9. 一天1个机器学习知识点(一)

    陆陆续续整理的机器学习的知识点,资料大多数来自网上,不做盈利目的,如果侵权请告知即删!如果文章中有错误的地方还请各位同学指正,,一起学习,一起进步! 每天都在更新中,记得收藏,每天进步一点点!! 一天 ...

最新文章

  1. UiBot带你两分钟看懂RPA是什么
  2. ubuntu下virtualbox使用u盘
  3. TextView之二:常用属性
  4. 冬奥网络安全卫士被表彰突出贡献,探寻冬奥背后的安全竞技
  5. 微信年终奖人均280万?腾讯张军:不可能 醒一醒吧!
  6. PWM级联方案。UART接口的单总线控制多个PWM输出。数字舵机,舵机级联方案
  7. 类和对象编程(二):类访问修饰符
  8. csuoj-1900 锋芒毕露
  9. 【刷题】BZOJ 4503 两个串
  10. 利用diamond进行dbcan数据库建库并进行CAZyme注释(2022.8)
  11. 入了giant FCR 3100,纪念一下!¥1800元
  12. calc():css简单的数学运算–加减乘除
  13. commons-poll、jedis-2.7.0、jedis.properties资源分享
  14. ASR项目实战-交付团队的分工
  15. IDEA springboot启动报错java.lang.UnsatisfiedLinkError: no tcnative-1 in java.library.path
  16. Typora的初步使用及Markdown语法总结
  17. PM-127 网关的应用
  18. CSS3中的径向渐变
  19. doc格式批量转docx
  20. 2018年一季度全球服务器市场排名定了 谁喜谁忧?

热门文章

  1. linux 信号传递函数,Linux Shell之七 函数应用
  2. mysql创建函数1418_Mysql中创建函数报“ERROR 1418 ”的解决方法
  3. yshon对讲机如何调频率_99%的人都不知道对讲机的这些功能.....
  4. linux python代码编辑器,Linux上的Python编辑器
  5. Python 中__new__()和__init__()的区别
  6. DVWA 黑客攻防实战(十五) 绕过内容安全策略 Content Security Policy (CSP) Bypass
  7. 如何处理跨平台的自适应三
  8. python入门系列——第2篇
  9. 遭遇OutOfMemoryError
  10. AsyncTask使用方式一