题目来自老师的课后作业,如下所示。很多地方应该可以直接调用函数,但是初学Python,对里面的函数还不是很了解,顺便带着学习的态度,尽量自己动手code。

测试版代码,里面带有很多注释和测试代码:

  1. # -*- coding: cp936 -*-
  2. import math
  3. import random
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. '''''
  7. 在x=[0,1]上均匀采样10个点组成一个数据集D=[a,b]
  8. '''
  9. a = []
  10. b = []
  11. x=0
  12. def func(x):
  13. mu=0
  14. sigma=0.1
  15. epsilon = random.gauss(mu,sigma) #高斯分布随机数
  16. return np.sin(2*np.pi*x)+epsilon
  17. for i in range(0,10):
  18. x=x+1.0/11.0
  19. a.append(x)
  20. b.append(func(x))
  21. #定义输出矩阵函数
  22. def print_matrix( info, m ):
  23. i = 0; j = 0; l = len(m)
  24. print info
  25. for i in range( 0, len( m ) ):
  26. for j in range( 0, len( m[i] ) ):
  27. if( j == l ):
  28. print ' |',
  29. print '%6.4f' % m[i][j],
  30. print
  31. print
  32. #定义交换变量函数
  33. def swap( a, b ):
  34. t = a; a = b; b = t
  35. #定义线性方程函数,高斯消元法
  36. def solve( ma, b, n ):
  37. global m; m = ma # 这里主要是方便最后矩阵的显示
  38. global s;
  39. i = 0; j = 0; row_pos = 0; col_pos = 0; ik = 0; jk = 0
  40. mik = 0.0; temp = 0.0
  41. n = len( m )
  42. # row_pos 变量标记行循环, col_pos 变量标记列循环
  43. while( ( row_pos < n ) and( col_pos < n ) ):
  44. # 选主元
  45. mik = - 1
  46. for i in range( row_pos, n ):
  47. if( abs( m[i][col_pos] ) > mik ):
  48. mik = abs( m[i][col_pos] )
  49. ik = i
  50. if( mik == 0.0 ):
  51. col_pos = col_pos + 1
  52. continue
  53. # 交换两行
  54. if( ik != row_pos ):
  55. for j in range( col_pos, n ):
  56. swap( m[row_pos][j], m[ik][j] )
  57. swap( m[row_pos][n], m[ik][n] );
  58. try:
  59. # 消元
  60. m[row_pos][n] /= m[row_pos][col_pos]
  61. except ZeroDivisionError:
  62. # 除零异常 一般在无解或无穷多解的情况下出现……
  63. return 0;
  64. j = n - 1
  65. while( j >= col_pos ):
  66. m[row_pos][j] /= m[row_pos][col_pos]
  67. j = j - 1
  68. for i in range( 0, n ):
  69. if( i == row_pos ):
  70. continue
  71. m[i][n] -= m[row_pos][n] * m[i][col_pos]
  72. j = n - 1
  73. while( j >= col_pos ):
  74. m[i][j] -= m[row_pos][j] * m[i][col_pos]
  75. j = j - 1
  76. row_pos = row_pos + 1; col_pos = col_pos + 1
  77. for i in range( row_pos, n ):
  78. if( abs( m[i][n] ) == 0.0 ):
  79. return 0
  80. return 1
  81. matrix_A=[]         #将系数矩阵A的所有元素存到a[n-1][n-1]中
  82. matrix_b=[]
  83. X=a
  84. Y=b
  85. N=len(X)
  86. M=3    #对于题目中要求的不同M[0,1,3,9]值,需要在这里更改,然后重新编译运行
  87. #计算线性方程组矩阵A的第[i][j]个元素A[i][j]
  88. def matrix_element_A(x,i,j,n):
  89. sum_a=0
  90. for k in range(0,n):
  91. sum_a = sum_a+pow(x[k],i+j-2)   #x[0]到x[n-1],共n个元素求和
  92. return sum_a
  93. for i in range(0,M+1):
  94. matrix_A.append([])
  95. for j in range(0,M+1):
  96. matrix_A[i].append(0)
  97. matrix_A[i][j] = matrix_element_A(X,i+1,j+1,N)
  98. #计算线性方程组矩阵b的第[i]行元素b[i]
  99. def matrix_element_b(x,y,i,n):
  100. sum_b=0
  101. for k in range(0,n):
  102. sum_b=sum_b+y[k]*pow(x[k],i-1)  #x[0]到x[n-1],共n个元素求和
  103. return sum_b
  104. for i in range(0,M+1):
  105. matrix_b.append(matrix_element_b(X,Y,i+1,N))
  106. #函数matrix_element_A_()用来求扩展矩阵A_,array_A表示系数矩阵A,array_b表示方程组右侧常数,A_row表示A的行秩
  107. def matrix_element_A_(array_A,array_b,A_row):
  108. M=A_row  #局部变量M,与全局变量M无关
  109. matrix_A_= []
  110. for i in range(0,M+1):
  111. matrix_A_.append([])
  112. for j in range(0,M+2):
  113. matrix_A_[i].append(0)
  114. if j<M+1:
  115. matrix_A_[i][j] = array_A[i][j]
  116. elif j==M+1:     #如果不加这个控制条件,matrix_A_将被array_b刷新
  117. matrix_A_[i][j] = array_b[i]
  118. return matrix_A_
  119. matrix_A_ = matrix_element_A_(matrix_A,matrix_b,M)
  120. '''''
  121. 多项式拟合函数
  122. '''
  123. #x为自变量,w为多项式系数,m为多项式的阶数
  124. def poly_fit(x,wp,m):
  125. sumf = 0
  126. for j in range(0,m+1):
  127. sumf=sumf+wp[j]*pow(x,j)
  128. return sumf
  129. '''''
  130. sin(2*pi*x)在x=0处的3阶泰勒展开式
  131. '''
  132. coef_taylor = [] #正弦函数的泰勒展开式系数
  133. K=3  #展开到K阶
  134. if K%2==0:
  135. print "K必须为正奇数"
  136. s = 0
  137. k=(K-1)/2+1  #小k为系数个数
  138. #求K阶泰勒展开式的系数:
  139. for i in range(0,k):
  140. s = pow(-1,i)*pow(2*np.pi,2*i+1)/math.factorial(2*i+1)
  141. coef_taylor.append(s)
  142. print "%d阶泰勒级数展开式的系数为:" %K
  143. print coef_taylor
  144. #tx为泰勒展开式函数的自变量
  145. def sin_taylor(tx):
  146. sum_tay=0
  147. for i in range(0,k):
  148. sum_tay=sum_tay+coef_taylor[i]*pow(tx,2*k+1)
  149. return sum_tay
  150. poly_taylor_a = []   #泰勒展开式函数的输入值
  151. poly_taylor_b = []   #泰勒展开式函数的预测值
  152. for i in range(0,N):
  153. poly_taylor_a.append(a[i])
  154. poly_taylor_b.append(sin_taylor(poly_taylor_a[i]))
  155. '''''
  156. 在x=[0,1]上生成100个点,作为测试集
  157. '''
  158. testa = []  #测试集的横坐标
  159. testb = []  #测试集的纵坐标
  160. x=0
  161. for i in range(0,100):
  162. x=x+1.0/101.0
  163. testa.append(x)
  164. testb.append(np.sin(2*np.pi*x))
  165. '''''
  166. 计算泰勒展开式模型的训练误差和测试误差
  167. '''
  168. #定义误差函数:
  169. #ly为真实值,fx为预测值
  170. def Lfun(ly,fx):
  171. L=0
  172. for i in range(0,len(fx)):
  173. L=L+pow(ly[i]-fx[i],2)
  174. return L
  175. '''''
  176. 主程序
  177. '''
  178. if __name__ == '__main__':
  179. # 求解方程组, 并输出方程组的可解信息
  180. ret = solve( matrix_A_, 0, 0 )
  181. if( ret== 0 ):
  182. print "方 程组无唯一解或无解\n"
  183. # 输出方程组及其解,解即为w[j]
  184. w = []
  185. for i in range( 0, len( m ) ):
  186. w.append(m[i][len( m )])
  187. print "M=%d时的系数w[j]:" %M
  188. print w
  189. #多项式拟合后的预测值:
  190. poly_a = []
  191. poly_b = []
  192. for i in range(0,N):
  193. poly_a.append(a[i])
  194. poly_b.append(poly_fit(poly_a[i],w,M))
  195. #fxtay为泰勒展开式的预测值,LCtaylor为测试误差:
  196. fxtay = []
  197. for i in range(0,100):
  198. fxtay.append(sin_taylor(testa[i]))
  199. LCtaylor = Lfun(testb,fxtay)/100
  200. print "三阶泰勒展开式的测试误差为:%f" %LCtaylor
  201. #fxpoly为M阶多项式拟合函数的预测值,LXpoly为训练误差:
  202. fxpoly = []
  203. for i in range(0,N):   #len(poly_b)=N=10
  204. fxpoly.append(poly_fit(a[i],w,M))
  205. LXpoly = Lfun(b,fxpoly)/len(poly_b)
  206. print "M=%d时多项式拟合函数的训练误差为:%f" % (M,LXpoly)
  207. #fxpolyc为M阶多项式拟合函数的预测值,LCpoly为测试误差:
  208. fxpolyc = []
  209. for i in range(0,100):
  210. fxpolyc.append(poly_fit(testa[i],w,M))
  211. LCpoly = Lfun(testb,fxpolyc)/100
  212. print "M=%d时多项式拟合函数的测试误差为:%f" % (M,LCpoly)
  213. #多项式拟合的效果:
  214. fig1 = plt.figure(1)
  215. plt.plot(poly_a,poly_b,color='blue',linestyle='solid',marker='o')
  216. #加入epsilon后的样本:
  217. plt.plot(a,b,color='red',linestyle='dashed',marker='x')
  218. #泰勒展开式拟合效果:
  219. plt.plot(poly_taylor_a,poly_taylor_b,color='yellow',linestyle='dashed',marker='o')
  220. #figure(2)对比多项式拟合函数与训练数据:
  221. fig2 = plt.figure(2)
  222. plt.plot(poly_a,poly_b,color='blue',linestyle='solid',marker='o')
  223. plt.plot(a,b,color='red',linestyle='dashed',marker='x')
  224. plt.show()

M=3时的运行结果:

  1. 3阶泰勒级数展开式的系数为:
  2. [6.283185307179586, -41.341702240399755]
  3. M=3时的系数w[j]:
  4. [-0.28492708632293295, 13.031310645420685, -37.730992850050448, 25.464782221275197]
  5. 三阶泰勒展开式的测试误差为:100.889335
  6. M=3时多项式拟合函数的训练误差为:0.008933
  7. M=3时多项式拟合函数的测试误差为:0.007886

Figure(1):

Figure(2):

初次编写这么长的代码,思路不是有一点的混乱。其中有也有。以后会继续来优化这个程序,作为学习Python的入口。

http://blog.csdn.net/zuyuanzhu/article/details/21321007

Python计算&绘图——曲线拟合问题(转)的更多相关文章

  1. [转载] python 计算字符串长度

    本文转载自: http://www.sharejs.com/codes/python/4843 python 计算字符串长度,一个中文算两个字符,先转换成utf8,然后通过计算utf8的长度和len函 ...

  2. Python计算斗牛游戏的概率

    Python计算斗牛游戏的概率 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛.在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率). ...

  3. python常用绘图软件包记录

    在没有使用python之前,觉得matlab的绘图功能还算可以~但现在发现python的绘图包真的好强大,绘制出的图像非常专业漂亮,但具体使用还有待学习,这里记录学习过程中遇到的python绘图包,以 ...

  4. 利用Python计算π的值,并显示进度条

    利用Python计算π的值,并显示进度条  第一步:下载tqdm 第二步;编写代码 from math import * from tqdm import tqdm from time import ...

  5. 用Python计算幂的两种方法,非递归和递归法

    用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...

  6. Python计算分位数

    Python计算分位数    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/gdkyxy2013/article/details/80911514 ...

  7. python 计算校验和

    校验和是经常使用的,这里简单的列了一个针对按字节计算累加和的代码片段.其实,这种累加和的计算,将字节翻译为无符号整数和带符号整数,结果是一样的. 使用python计算校验和时记住做截断就可以了. 这里 ...

  8. 为了用python计算一个汉字的中心点,差点没绞尽脑汁活活累死

    为了用python计算一个汉字的中心点,差点没绞尽脑汁活活累死

  9. python计算时间差的方法

    本文实例讲述了python计算时间差的方法.分享给大家供大家参考.具体分析如下: 1.问题: 给定你两个日期,如何计算这两个日期之间间隔几天,几个星期,几个月,几年? 2.解决方法: 标准模块date ...

随机推荐

  1. Linux中进行挂起(待机)的命令说明

    /*********************************************************************  * Author  : Samson  * Date   ...

  2. c++一些语法模板

    函数模板特 template <class T> int compare(T v1,T v2) { if(v1<v2) return -1; else if(v1>v2) re ...

  3. Notifications(通知)

    通知 通知是能在应用的普通用户界面外显示给用户的一种消息. 当你告诉系统公布一条通知时,它首先在通知栏中表现为一枚图标. 用户打开通知抽屉后就能查看通知的细节了. 通知栏和通知抽屉都是由系统控制的区域 ...

  4. Linux SSH端口转发

    SSH端口转发分为两种,一种是本地端口转发,又称为本地SSH隧道.一直是远程端口转发.SSH端口转发,还必须指定数据传送的目标主机,从而形成点对点的端口转发. 本地端口转发     假定有三台主机A. ...

  5. error C2471: 无法更新程序数据库

    这段时间在使用VS做一个项目.在使用过程中,今天遇到了一个问题,也就是题目所说的那样: error C2471: 无法更新程序数据库.之后在网上搜了一下,得到了两种解决方案,两种方案分别如下: (一) ...

  6. JS经常使用正則表達式【分享】

    工作中JS经常使用表达式: 1)2010-09-10类型日期校验 2)推断正整数.字符串长度 3)校验长度,和是否空 4)推断字符串是否为空 5)比較字符大小 6)推断字符串长度 7)推断格式是否为E ...

  7. 自己动手写CPU之第六阶段(2)——移动操作指令实现思路

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令能够分为两类:一类是不涉及特殊 ...

  8. 基于CentOS 5.4搭建nginx+php+spawn-fcgi+mysql高性能php平台

    一.安装准备 1.1平台环境: CentOS 5.4 x86_64 GNU/Linux nginx-0.8.21 php-5.2.9 spawn-fcgi-1.6.3 mysql-5.1.34 .2系 ...

  9. unity3d教程动态创建简单平面地形

    unity3d创建地形是不须要usingUnityEditor的.这里使用了AssetDatabase.所以需using UnityEditor; 创建三步: 1.TerrainData terrai ...

  10. [POJ 3150] Cellular Automaton (矩阵高速幂 + 矩阵乘法优化)

    Cellular Automaton Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 3048   Accepted: 12 ...