1. #-*-coding:UTF-8-*-
  2. # Created on 2015年10月20日
  3. # @author: hanahimi
  4. import numpy as np
  5. import random
  6. import matplotlib.pyplot as plt
  7.  
  8. def randData():
  9. # 生成曲线上各个点
  10. x = np.arange(-1,1,0.02)
  11. y = [2*a+3 for a in x] # 直线
  12. # y = [((a*a-1)*(a*a-1)*(a*a-1)+0.5)*np.sin(a*2) for a in x] # 曲线
  13. xa = []; ya = []
  14. # 对曲线上每个点进行随机偏移
  15. for i in range(len(x)):
  16. d = np.float(random.randint(90,120))/100
  17. ya.append(y[i]*d)
  18. xa.append(x[i]*d)
  19. return xa,ya
  20.  
  21. def hypfunc(x,A):
  22. # 输入:x 横坐标数值, A 多项式系数 [a0,a1,...,an-1]
  23. # 返回 y = hypfunc(x)
  24. return np.sum(A[i]*(x**i) for i in range(len(A)))
  25.  
  26. # 使用 θ = (X.T*X + λI)^-1 * X.T * y求解直线参数
  27. # 该函数会在X的前面添加偏移位X0 = 1
  28. def LS_line(X,Y, lam = 0.01):
  29. X = np.array(X)
  30. X = np.vstack((np.ones((len(X),)),X)) # 往上面添加X0
  31. X = np.mat(X).T # (m,n)
  32. Y = np.mat(Y).T # (m,1)
  33. M, N = X.shape
  34. I = np.eye(N, N) # 单位矩阵
  35.  
  36. theta = ((X.T * X + lam*I)**-1)*X.T*Y # 核心公式
  37. theta = np.array(np.reshape(theta,len(theta)))[0]
  38. return theta # 返回一个一维数组
  39.  
  40. # 使用随机梯度下降法求解最小二参数:
  41. # alpha 迭代步长(固定步长),epslion 收敛标准
  42. def LS_sgd(X,Y,alpha=0.1, epslion = 0.003):
  43. X = [[1,xi] for xi in X] # 补上偏移量x0
  44. N = len(X[0]) # X的维度
  45. M = len(X) # 样本个数
  46. theta = np.zeros((N,)) # 参数初始值
  47. last_theta = np.zeros(theta.shape)
  48.  
  49. times = 10000
  50. while times > 0:
  51. times -= 1
  52. for i in range(M):
  53. last_theta[:] = theta[:]
  54. for j in range(N):
  55. theta[j] -= alpha * (np.dot(theta,X[i])-Y[i])*X[i][j]
  56. if np.sum((theta - last_theta)**2) <= epslion: # 当前后参数的变化小于一定程度时可以终止迭代
  57. break
  58. return theta
  59.  
  60. # 根据输入值:X向量,即拟合阶数,计算对应的范德蒙矩阵
  61. def vandermonde_matrix(X, Y, order=1):
  62. # 根据数据点构造X,Y的 范德蒙德矩阵
  63. m = len(Y)
  64. matX = np.array([[np.sum([X[i]**(k2+k1) for i in range(m)])
  65. for k2 in range(order+1)] for k1 in range(order+1)])
  66. matY = np.array([np.sum([(X[i]**k)*Y[i] for i in range(m)])
  67. for k in range(order+1)])
  68. theta = np.linalg.solve(matX, matY)
  69. return theta
  70.  
  71. if __name__=="__main__":
  72. pass
  73. X, Y = randData()
  74. theta = vandermonde_matrix(X, Y, order=1)
  75. theta = LS_sgd(X,Y)
  76.  
  77. # 画出数据点与拟合曲线
  78. plt.figure()
  79. plt.plot(X,Y,linestyle='',marker='.')
  80. yhyp = [hypfunc(X[i],theta) for i in range(len(X))]
  81. plt.plot(X, yhyp,linestyle='-')
  82. plt.show()

最小二乘法 python实现的更多相关文章

  1. 批处理最小二乘法 python

    参考:系统辨识与自适应控制MATLAB仿真(修订版) 庞中华 崔红 仿真实例2.5 import numpy as np import matplotlib.pyplot as plt from mx ...

  2. python 最小二乘 leastsq 函数实现 法线式 解决与x轴垂直问题

    当使用y=kx+b时,与x轴垂直的直线无法计算.因此使用法线式ysin(theta)+xcos(theta) = dist.貌似这么用有点复杂了,直接使用ax+by=1不知道能不能计算,未测试. # ...

  3. python 最小二乘 leastsq 函数实现

    代码修改自 http://www.cnblogs.com/NanShan2016/p/5493429.html 网上百度了一下,主要是两个例子,一个利用了多项式函数,一个就是这个.有些细节没看懂,主要 ...

  4. 线性回归linear regression(python脚本实现)

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...

  5. Andrew 机器学习课程笔记

    Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...

  6. 【读书笔记与思考】Andrew 机器学习课程笔记

    Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...

  7. python数据分析入门——matplotlib的中文显示问题&最小二乘法

    正在学习<用python做科学计算>,在练习最小二乘法时遇到matplotlib无法显示中文的问题.查资料,感觉动态的加上几条语句是最好,这里贴上全部的代码. # -*- coding: ...

  8. 机器学习:Python中如何使用最小二乘法

    之所以说"使用"而不是"实现",是因为python的相关类库已经帮我们实现了具体算法,而我们只要学会使用就可以了.随着对技术的逐渐掌握及积累,当类库中的算法已经 ...

  9. Python实现实现基于最小二乘法的线性回归

    下面展示利用Python实现基于最小二乘法的线性回归模型,同时不需要引入其他科学计算以及机器学习的库. 利用Python代码表示如下: #首先引入数据集x,和y的值的大小利用Python的数据结构:列 ...

随机推荐

  1. CRF条件随机场简介

    CRF(Conditional Random Field) 条件随机场是近几年自然语言处理领域常用的算法之一,常用于句法分析.命名实体识别.词性标注等.在我看来,CRF就像一个反向的隐马尔可夫模型(H ...

  2. powershell加win的dns服务器,解决网站负载均衡问题

    用我发明的powershell填坑法,加windows的dns服务器.从调整dns服务器解析ip时间段的角度,解决网站负载均衡问题. ------------------------win2012r2 ...

  3. VS2013项目配置directx11

    假定你已经安装好了direct11 SDK(官方下的既是最新版本)和VS2013,并在VS2013中建立了一个新工程. 用VS2013打开工程后,点击右键属性,选择VC++目录: 其中在包含目录中添加 ...

  4. HTML--2图片热点,网页划区,拼接

    图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. 示例: 网页划区: 在一个网页里,规划出一个区域用来展示另一个网页的内容. 示例: 网页的拼接: 在一个网络 ...

  5. 2016年3月AV评测

  6. oracle 删除表和数据分析语句

    TRUNCATE TABLE 表名;ANALYZE TABLE 表名 ESTIMATE STATISTICS;

  7. Python学习路程day5

    冒泡排序 将一个不规则的数组按从小到大的顺序进行排序 data = [10,4,33,21,54,3,8,11,5,22,2,1,17,13,6] #第一次循环,最后一个数字不需要循环,因为最大值已经 ...

  8. Be Careful With BuildConfig.DEBUG

    Be Careful With BuildConfig.DEBUG http://www.digipom.com/be-careful-with-buildconfig-debug/

  9. hdu 2064

    ps:分析发现,要移动n个到最左端,首先要移动n-1个从A到C,然后从C到A,然后再从A到C,然后中间是把大盘从A到C,两步.递推公式自然就是a[n]=3*a[n-1]+2 代码: #include ...

  10. 刷固件Layer1到手机FLASH(硬刷)

    开头: 注意:本文章并不是做GSM 嗅探必须的,平时我们刷机叫软刷是刷到内存里面的,断电就消失了,这个是硬刷,刷到flash里面的,断电不消失,开机就运行的. 本文章经过作者实测可行,这只是单个应用程 ...