ea平台365bet体育在线之所以K近邻算法建立一个超简单的展望模型=====python数学建模实例

即时篇稿子要讲点儿单从事:

  1. 为大家介绍一下机上着之一个简单易行算法-K近邻算法
  2. 广泛一个冷专业——选矿

今指一些选矿的数码来讲一下这算法。

选矿是怎么的?选矿就是研究如何由矿石中把实用之矿提取出的相同派课程。选矿之前如果先期把矿石弄成霜,让矿石中的发出因此矿物和另垃圾分开,然后再度采取有因此矿物和任何杂志里的物理化学性能差异将其分别。
我们今天用的这些多少是有关磁铁矿的,在此磁铁矿山中,开采出的原来矿石里面来好多破烂,黄铁矿、赤铁矿、石英、云母、绿泥石、伊利石……偶尔还能发现价值连城的生绿松石……

下简单介绍一下数量含义:

  1. BallMillAbility:球磨机台时能力,可以理解为各国台机器每时流失出来的矿粉的量;
  2. OreGrade:原矿品位,也便是原矿中的铁元素含量;
  3. RateofMagnet:磁铁率,即于所有铁矿物(磁铁矿、黄铁矿、赤铁矿、褐铁矿等)中磁铁矿所占有的百分比;
  4. TailGrade:尾矿品位,尾矿就是选矿之后发生的渣渣;
  5. ConcentrateGrade:精矿品位,就是选矿的最终产品,这个指标在选矿厂是严格控制的,一般波动只生1%。64%水准的吸铁石精矿意味着磁铁矿含量已经达到了88%。

咱俩今天举行的预测模型就使经过这前面4独指标来预测第5个指标是否上

读取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
..               ...       ...           ...        ...               ...
留下的预测样本(这里才留下了一个,实际运用的当儿要比较多数据):
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-Max Scaling)

ea平台365bet体育在线 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:对选矿有趣味之可私信我

发表评论

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