[关闭]
@Lin-- 2019-09-04T16:10:54.000000Z 字数 5143 阅读 392

数学建模算法

数学建模


灰色系统预测

  1. #灰色预测
  2. import numpy as np
  3. import math
  4. import matplotlib.pyplot as plt
  5. #plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
  6. history_data = [724.57,746.62,778.27,800.8,827.75,871.1,912.37,954.28,995.01,1037.2]
  7. n = len(history_data)
  8. X0 = np.array(history_data)
  9. #可容覆盖
  10. Lamda=[]
  11. for i in range(n-1):
  12. Lamda.append(history_data[i]/history_data[i+1])
  13. if min(Lamda)>math.exp(-2/(n+1)) and max(Lamda)<math.exp(2/(n+2)):
  14. print("在可容覆盖范围内,无需处理数据")
  15. else:
  16. pass
  17. #print("不在可容覆盖范围内,需对数据做处理")
  18. #累加生成
  19. history_data_agg = [sum(history_data[0:i+1]) for i in range(n)]
  20. X1 = np.array(history_data_agg)
  21. #计算数据矩阵B和数据向量Y
  22. B = np.ones([n-1,2])
  23. Y = np.zeros([n-1,1])
  24. for i in range(0,n-1):
  25. B[i][0] = -0.5*(X1[i] + X1[i+1])
  26. Y[i][0] = X0[i+1]
  27. #计算GM(1,1)微分方程的参数a和u
  28. #A = np.zeros([2,1])
  29. A = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
  30. a = A[0][0]
  31. u = A[1][0]
  32. #建立灰色预测模型
  33. XX0 = np.zeros(n)
  34. XX0[0] = X0[0]
  35. for i in range(1,n):
  36. XX0[i] = (X0[0] - u/a)*(1-math.exp(a))*math.exp(-a*(i));
  37. #模型精度的后验差检验
  38. e = 0 #求残差平均值
  39. for i in range(0,n):
  40. e += (X0[i] - XX0[i])
  41. e /= n
  42. '''
  43. #图像(曲线)
  44. plt.plot(np.arange(1,n+1),X0,color="#F08080")
  45. plt.plot(np.arange(1,n+1),XX0,color='b')
  46. plt.show()
  47. '''
  48. #点图
  49. plt.scatter(np.arange(1,n+1),X0,marker='*',color='r',label='历史数据')
  50. plt.scatter(np.arange(1,n+1),XX0,marker='+',color='b',label='预测数据')
  51. plt.legend(loc='upper right')
  52. plt.show()
  53. #求历史数据平均值
  54. aver = 0;
  55. for i in range(0,n):
  56. aver += X0[i]
  57. aver /= n
  58. #求历史数据方差
  59. s12 = 0;
  60. for i in range(0,n):
  61. s12 += (X0[i]-aver)**2;
  62. s12 /= n
  63. #求残差方差
  64. s22 = 0;
  65. for i in range(0,n):
  66. s22 += ((X0[i] - XX0[i]) - e)**2;
  67. s22 /= n
  68. #求后验差比值
  69. C = s22 / s12
  70. #求小误差概率
  71. cout = 0
  72. for i in range(0,n):
  73. if abs((X0[i] - XX0[i]) - e) < 0.6754*math.sqrt(s12):
  74. cout = cout+1
  75. else:
  76. cout = cout
  77. P = cout / n
  78. if (C < 0.35 and P > 0.95):
  79. #预测精度为一级
  80. m = 10 #请输入需要预测的年数
  81. #print('往后m各年负荷为:')
  82. f = np.zeros(m)
  83. for i in range(0,m):
  84. f[i] = (X0[0] - u/a)*(1-math.exp(a))*math.exp(-a*(i+n))
  85. print(f)
  86. else:
  87. print('灰色预测法不适用')

层次分析法

  1. #层次分析法
  2. import numpy as np
  3. import math
  4. import matplotlib.pyplot as plt
  5. #计算矩阵各行乘积
  6. def array_mul(a):
  7. a1=[]
  8. for i in range(a.shape[0]):
  9. temp=1.0
  10. for j in range(a.shape[1]):
  11. temp*=a[i][j]
  12. a1.append(temp)
  13. return np.array(a1)
  14. #矩阵归一化
  15. def normalization(a):
  16. a1=[]
  17. sum=a.sum()
  18. for i in a:
  19. a1.append(i/sum)
  20. return np.array(a1)
  21. #初始变量
  22. P1=[[1,0.3333,0.125]
  23. ,[3,1,0.3333]
  24. ,[8,3,1]]
  25. #计算每一行的乘积
  26. P1=np.array(P1)
  27. PP1=array_mul(P1)
  28. #三次方根
  29. PP1=np.power(PP1,0.3333)
  30. #归一化矩阵
  31. PP1=normalization(PP1)
  32. print(PP1)
  33. #求最大特征根
  34. AW=P1.dot(PP1.T)
  35. print(AW)
  36. Lamda=0
  37. for i in range(AW.size):
  38. Lamda+=AW[i]/(AW.size*PP1[i])
  39. print(Lamda)
  40. #一致性检验
  41. CI=(Lamda-AW.size)/(AW.size-1)
  42. RI=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45,1.49,1.51]
  43. CR=CI/RI[AW.size-1]
  44. print(CR)

主成分分析法

  1. #主成分分析法
  2. import numpy as np
  3. from scipy import stats
  4. from numpy import linalg as LA
  5. #矩阵标准化函数
  6. def zscore(a):
  7. a1=np.subtract(a,np.mean(a,axis=0))
  8. return np.divide(a1,np.std(a,axis=0,ddof=1))
  9. #计算累计贡献率达到85%对应第几个特征值
  10. def contr(a):
  11. sum=np.sum(a)
  12. count,temp=1,0
  13. for i in a:
  14. temp+=i
  15. if (temp/sum)>0.85:
  16. break
  17. else: count+=1
  18. return count
  19. #初值
  20. P=[[10.2352,11.3220,12.3315,12.5644,12.6534,13.5541,13.6698,13.9964],
  21. [10.1223,11.8110,11.9156,12.6654,9.8652,15.6634,10.0023,16.0034],
  22. [15.2364,9.2563,10.1156,10.1156,11.9874,16.2345,14.2648,12.1238],
  23. [7.5612,8.1234,9.6321,8.5678,9.6654,10.2322,11.2344,15.6652]]
  24. P=np.array(P)
  25. #标准化矩阵
  26. P1=zscore(P)
  27. #建立相关系数矩阵
  28. P2=np.corrcoef(P1,rowvar=False)
  29. #矩阵特征值以及主成分个数
  30. Lamda=np.linalg.eigvalsh(P2)
  31. Lamda=-np.sort(-Lamda)#对矩阵特征值从大到小排序
  32. m=contr(Lamda)#主成分个数
  33. #矩阵的特征向量,为特征值对应的那一列
  34. Lamda_vector=np.linalg.eig(P2)

基本遗传算法

  1. #遗传算法
  2. #求y = 10 * sin(5x) + 7 * cos(4x)的最大值
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import math
  6. import random
  7. pop_size=500#种群规模
  8. max_value=10#基因的搜索空间的上界
  9. chrom_length=10#染色体长度,即二进制位数
  10. pc=0.6#交配概率
  11. pm=0.01#基因突变概率
  12. results=[[]]#每一代的最优解,N个二元组
  13. fit_value=[]#个体适应度
  14. fit_mean=[]#平均适应度
  15. #产生随机生成序列
  16. def GeneEncoding(pop_size, chrom_length):
  17. pop=[[]]
  18. for i in range(pop_size):
  19. temp=[]
  20. for j in range(chrom_length):
  21. temp.append(random.randint(0,1))
  22. pop.append(temp)
  23. return pop[1:]
  24. pop=GeneEncoding(pop_size,chrom_length)#生成初始数据
  25. #解码计算每一个个体的表现型
  26. def DecodeChrom(pop,chrom_length):#解码过程
  27. temp=[]
  28. for i in range(len(pop)):
  29. t=0
  30. for j in range(chrom_length):
  31. t+=pop[i][j]*(math.pow(2,j))
  32. temp.append(t)
  33. return temp
  34. def CalObjValue(pop,chrom_length,max_value):#计算表现型
  35. temp1=[]
  36. obj_value=[]
  37. temp1=DecodeChrom(pop,chrom_length)
  38. for i in temp1:
  39. x=i*max_value/(math.pow(2,chrom_length)-1)
  40. obj_value.append(10*math.sin(5*x)+7*math.cos(4*x))
  41. return obj_value
  42. #淘汰负值
  43. def CalFitValue(obj_value):
  44. fit_value=[]
  45. for i in obj_value:
  46. if i>0:
  47. fit_value.append(i)
  48. else:
  49. fit_value.append(0.0)
  50. return fit_value
  51. #选择
  52. #适应度总和
  53. def SumFitValue(fit_value):
  54. total=0
  55. for i in fit_value:
  56. total+=i
  57. return total
  58. #累计概率
  59. def cumsum(newfit_value):
  60. for i in range(len(fit_value-2,-1,-1)):
  61. t,j=0,0
  62. while j<i:
  63. t+=newfit_value[j]
  64. j+=1
  65. newfit_value[i]=t
  66. newfit_value[-1]=1
  67. return newfit_value
  68. #选择函数
  69. def selection(pop,fit_value):
  70. newfit_value=[]
  71. total_fit=SumFitValue(fit_value)#总适应度
  72. for i in fit_value:
  73. newfit_value.append(i/total_fit)#归一化
  74. newfit_value=cumsum(newfit_value)#累计概率
  75. #转轮盘算法选择
  76. ms=[]
  77. for i in range(len(pop)):
  78. ms.append(random.random())
  79. ms.sort()
  80. fitin,newin=0,0
  81. newpop=pop
  82. while newin<len(pop):
  83. if ms[newin]<newfit_value[fitin]:
  84. newpop=pop[fitin]
  85. newin+=1
  86. else:
  87. fitin+=1
  88. pop=newpop
  89. #交配/交换染色体
  90. def crossover(pop,pc):
  91. for i in range(len(pop)-1):
  92. if random.random()<pc:
  93. cpoint=random.randint(0,len(pop[0]))
  94. temp1,temp2=[],[]
  95. temp1.extend(pop[i][0:cpoint])
  96. temp1.extend(pop[i+1][cpoint:-1])
  97. temp2.extend(pop[i+1][0:cpoint])
  98. temp2.extend(pop[i][cpoint:-1])
  99. pop[i]=temp1
  100. pop[i+1]=temp2
  101. #变异/基因突变
  102. def mutation(pop,pm):
  103. px=len(pop)
  104. py=len(pop[0])
  105. for i in range(px):
  106. if random.random()<pm:
  107. mpoint=random.randint(0,py-1)
  108. if pop[i][mpoint]==0:
  109. pop[i][mpoint]=1
  110. else:
  111. pop[i][mpoint]=0
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注