python数学建模实例

这篇小说主要讲七个事:

  1. 给大家介绍一下机械学习中的三个简约算法-K近邻算法
  2. 大面积贰个冷门专业——选矿

前些天凭借一些选矿的数量来讲一下那几个算法。

选矿是为什么的?选矿就是研讨怎么从矿石中把有效的矿产提取出来的一门课程。选矿从前要先把矿石弄成粉末,让矿石中的有用矿物和此外废品分开,然后再利用有用矿物和任何杂志之间的物理化学质量差别将它们分别。
大家今天应用的这几个数量是关于磁铁矿的,在这一个磁铁矿山中,开采出来的原矿石里面有过多废品,黄铁矿、赤铁矿、石英、云母、绿泥石、雅士利石……偶尔还是可以窥见价值连城的先性格绿松石……

上边简单介绍一下数额含义:

  1. BallMillAbility:球磨机台时能力,可以清楚为每台机械每时辰磨出来的矿粉的量;
  2. OreGrade:原矿品位,相当于原矿中的铁成分含量;
  3. RateofMagnet:磁铁率,即在有着铁矿物(磁铁矿、黄铁矿、赤铁矿、褐铁矿等)中磁铁矿所占的百分比;
  4. TailGrade:尾矿品位,尾矿就是选矿之后发出的渣渣;
  5. ConcentrateGrade:精矿品位,就是选矿的最后产品,这几个目标在选矿厂是严俊控制的,一般波动唯有1%。64%档次的磁铁精矿意味着磁铁矿含量已经达到了88%。

咱俩前几日做的预测模型就是要通过那日前伍个目的来预测第6个目标是不是达到

读取csv文件:

In [1]:import pandas as pd
In [2]:df = pd.read_csv('D://Practice/Data.csv')
In [3]:df
Out[3]: 
     BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
0             297.76     18.98         71.65       8.30             64.35
1             280.15     18.68         73.39       8.59             64.87
2             302.81     18.23         72.13       8.69             64.76
3             173.41     19.55         74.42       9.00             64.57
4             345.66     18.57         75.93       9.28             64.62
5             312.65     18.34         72.19       9.19             64.38
6             306.85     17.80         71.80       9.35             64.50
..               ...       ...           ...        ...               ...
猜度目标处理

将最后一列提取出来,作为每一列的归类标签(其中64.5以上为合格(1),64.5之下为不沾边(0))

for i in range(149):
    if df['ConcentrateGrade'][i] >= 64.5:
        df['ConcentrateGrade'][i] = 1
    else:
        df['ConcentrateGrade'][i] = 0

Out[13]: 
     BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
0             297.76     18.98         71.65       8.30               0.0
1             280.15     18.68         73.39       8.59               1.0
2             302.81     18.23         72.13       8.69               1.0
3             173.41     19.55         74.42       9.00               1.0
4             345.66     18.57         75.93       9.28               1.0
5             312.65     18.34         72.19       9.19               0.0
6             306.85     17.80         71.80       9.35               1.0
..               ...       ...           ...        ...               ...
预留的前瞻样本(那里只留了1个,实际应用的时候必要较多数据):
BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
  340.22     17.08         66.66       9.30           --
算算距离并按距离排序

求那或多或少到数码汇总各点的偏离,并将那么些距离值作为一列新的多寡到场到df中。

df['Distance'] = 0
from numpy import *
for i in range(149):
    distance = sqrt((df['BallMillAbility'][i]-350.22)**2+(df['OreGrade'][i]-17.08)**2+(df['RateofMagnet'][i]-65.65)**2+(df['TailGrade'][i]-10.30)**2)
    df['Distance'][i] = distance

排序

a = df.sort(columns = 'Distance')#这里记住对调用df的sort方法不会对df做出改变。

       BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade   Distance  
99            349.90     17.44         68.06       8.50               0.0           3  

40            349.49     17.03         69.76       8.49               0.0           4  

10            352.13     17.41         70.53       8.82               1.0           5  

100           351.63     18.48         71.81       8.46               1.0           6  

65            355.82     16.92         70.51       7.52               0.0           7  

104           347.20     18.76         71.59       8.75               0.0           7  

113           350.17     18.75         73.23       9.04               0.0           7  

46            352.35     18.13         71.98       8.18               0.0           7
 ..               ...       ...           ...        ...               ...
预测

下一场取前k个值(大家取20),总结前k个值中1占多少。

b = a.reset_index(drop = True)#这里要重新建立索引,以便后续操作。另:使用a的reset_index方法不会改变a的值
m = 0
for i in range(20):
    if b['ConcentrateGrade'][i] == 1:
        m += 1
In[46]:m
Out[46]: 9

可知前20组数据中,ConcentrateGrade小于64.5的占多数,大家延续加大k的值试试:

k  20 30 40 50
m  3  6 10 12

通过测试结果大家得以断定,那趟目标应该不会面格。

在做臆度模型的时候,为了防止数据量纲对模型的震慑,大家会对数据开展归一化处理

数码归一化处理

那边运用最简单易行的场景函数归一化(Min-马克斯 Scaling)

图片 1

p = min(df['BallMillAbility'])
o = max(df['BallMillAbility'])
for i in range(149):
    df['BallMillAbility'][i] = (df['BallMillAbility'][i]-p)/(o-p)

就这么挨个把4列数据都归一化

Out[33]: 
     BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
0           0.508755  0.526555      0.418244   0.325203               0.0
1           0.436707  0.481032      0.567986   0.443089               1.0
2           0.529417  0.412747      0.459552   0.483740               1.0
3           0.000000  0.613050      0.656627   0.609756               1.0
4           0.704730  0.464340      0.786575   0.723577               1.0
5           0.569675  0.429439      0.464716   0.686992               0.0
6           0.545946  0.347496      0.431153   0.752033               1.0
7           0.305294  0.391502      0.555077   0.609756               0.0
8           0.594509  0.335357      0.444062   0.776423               1.0
9           0.506505  0.074355      0.302926   0.691057               1.0
..               ...       ...           ...        ...               ...

归一化处理完了后头别忘记保存一下

df.to_csv('D://Practice/data1.csv')

下一场大家再用k近邻算法总结五遍得到如下结果:

k 20 30 40 50
m 3 9 19 31

这么又现身了不一致的结果,理论上来讲,归一化之后的展望模型应该更为精确一点。

ps:对选矿有趣味的可以私信作者

发表评论

电子邮件地址不会被公开。 必填项已用*标注