二分类模型的复现

  • 原理如下
  • 数据工具
  • 模型的训练过程
  • 代码片
  • 通过可视化选择合适的插值方法
  • 利用插值曲线生成的数据训练模型
  • 参考



分界线上侧是颤振,下侧没有颤振。现在需要在上下两侧随机生成数据集

原理如下

1.由数据点训练回归模型来拟合分界曲线

2.由分界曲线生成颤振与不颤振的样本点

3.由样本点训练分类模型

4.由分类模型判断点是否颤振

(但是,这篇文章的矛盾点在于,既然已经知道颤振分界曲线为,什么还要通过颤振曲线产生样本点来训练分类模型呢?直接判断实际点在颤振曲线哪一侧不好吗?
可能的理由有三:

  1. 期刊中训练模型用到的数据集是通过其他手段得到,而非由插值分界曲线得到的;
  2. 适用于高维特征时,已经不能用连续曲面或曲线来生成样本点。因此,神经网络分类对高维特征具有拓展性。
  3. 这篇文献就是在水。

数据工具

  • numpy.interp

一维数组的线性插值方法
numpy.interp(x, xp, fp, left=None, right=None, period=None)

参数

含义

参数值

x

用于插值的x值

1-D float or complex

xp

原数据x

1-D float or complex

fp

原数据y

1-D float or complex,

长度与xp相同

left

任意float or complex corresp

onding to fp

right

任意float or complex corres

ponding to fp

period

None or float,optional

  • 论文中数据集的结构

主轴转速

(rpm)

1000~4000

切削厚度

(mm)

0~2.5

数据集

251

  • 复现论文用到的数据集的结构
    我们尝试用手头的颤振曲线对论文进行复现。受限于数据不同。浮现数据的的结构。

主轴转速

(rpm)

5000~9094

切削厚度

(mm)

0.03584~0.4

数据集

251

  • 可视化分析几种插值方法的效果

我们要选取一种最佳的插值方法,用于生成有标签的数据集对二分类模型进行训练。
因此,要可视化几种备选插值方法,进行选择

Scipy.interpolate

一维插值法

名称/原理

nearest

最邻近插值法

zero

阶梯插值法

slinear

线性插值法

quadratic

二阶B样条

曲线插值法

cubic

三阶B样条

曲线插值法

高阶B样条

曲线插值法

numpy.

interp

流程

  1. 画出原分界曲线。在图上用红色标出。
  2. 画出各种方法在原曲线上的插值散点分布图。在图上用紫色标出。
  3. 画出在插值分布散点图上下随机分布的取样点。上方用绿色,下方用橘黄色标出。并用不同颜色标出
  4. 经过在图上对比。nearest法和zero法插值效果最好。

模型的训练过程

二分类

网络结构

4-1

特征数

2

标签

1

数据集

train:test

8:2

(160:41)

预测

38

p

0.5

初始化方式

随机初始化

目标函数

交叉熵

epoches

5

vadidation

K(10)

代码片

通过可视化选择合适的插值方法

import pandas as pd
import numpy as np
from scipy import interpolate

df1=pd.read_excel('分割面.xlsx', skiprows = [1])#'分割面.xlsx'文件第一行,第三行是数据,这里读入DataFrame,跳过第二行
spindle_speed = df1.columns.values#上面的第一行是对应DataFrame的 标签行,这里获取标签的数据
chip_width = df1.loc[0,:].values
#把这两行数据拼接,再转置成(2,)的矩阵
line1 = np.array(spindle_speed, dtype=float)
line2 = np.array(chip_width, dtype=float)
line = np.vstack((line1, line2))
line = line.T
line[:,1]=line[:,1] * 100


xvals=np.random.uniform(5000, 9094, 251)
yvals=np.random.uniform(0.035845, 0.400000, 251)
yinterp=np.interp(xvals, 
                  line[:, 0],
                  line[:, 1])
data=np.empty((len(xvals), 3))
data[:, 0]=xvals
data[:, 1]=yvals


fig=plt.figure('分界线', (20,45))
fig_num =1
#调用此方法在曲线上下两侧取样两种点,共point_num个,下侧用1标记,染色橘黄色;上侧用0标记,染色绿色
def point_2(function, point_num):
    xvals=np.random.uniform(5000, 9094, point_num)
    yvals=np.random.uniform(0, 0.400000, point_num)
    yinterp=function(xvals)
    #这些数组都做形参,一次性使用
    data_formal=np.empty((point_num,3))
    data_formal[:, 0]=xvals
    data_formal[:, 1]=yvals
    #准备好point_num组标签
    for i in range(point_num):
        if yvals[i]<yinterp[i]:
            data_formal[i, 2]=1
        else:
            data_formal[i, 2]=0

    return data_formal
###*********************########################################


for kind in ["nearest","zero","slinear","quadratic","cubic"]:#插值方式  
    #"nearest","zero"为阶梯插值
    #slinear 线性插值
    #"quadratic","cubic" 为2阶、3阶B样条曲线插值
    #********************************************************#
    #在原分界曲线上插值
    f = interpolate.interp1d(line[:, 0], line[:, 1], kind=kind)
    xnew =  np.linspace(5000, 9094, 4000)
    ynew = f(xnew) 
    #******************************************************#
    #各种插值方法的插值曲线上下各取251点
    data_point = point_2(f, 1000)
    #*****************************************************#
    _0_point=np.empty((1,2))
    _1_point=np.empty((1,2))
    for i in range(len(data_point)):
        
        if data_point[i, 2]==1:
            _0_point = np.vstack((_0_point,data_point[i, 0 :2]))

        else:
            _1_point = np.vstack((_1_point, data_point[i, 0 :2]))
    #在每个子图里绘画插值曲线,及取样点分布
    plt.subplot(6,1,fig_num)
    plt.title('%s 插值法拟合分解曲线'%kind,
              fontproperties = FontProperties(fname=r"c:\windows\fonts\simhei.ttf",size=15))
    #各种插值方法的插值曲线散点图
    plt.scatter(xnew, ynew, alpha=1, color='b', 
                s=2)
    #原分界曲线的曲线图
    plt.plot(line[:,0],line[:,1], color='r',
             alpha=0.5)
    #把取样点描绘出来
    plt.scatter(_0_point[:, 0], _0_point[:, 1], c ='orange',s=10)
    plt.scatter(_1_point[:, 0], _1_point[:, 1], c ='green',s=10)
    plt.legend(['分界线', kind,  '稳定','颤振' ],
               loc="upper right",
               prop = FontProperties(fname=r"c:\windows\fonts\simhei.ttf",size=15)
              )    
    plt.xlabel('SpindleSpeed/rpm', 
               fontproperties= FontProperties(fname=r"c:\windows\fonts\simhei.ttf",size=15)
              )
    plt.ylabel('ChipWidth/mm',
               fontproperties= FontProperties(fname=r"c:\windows\fonts\simhei.ttf",size=15)
              )
    plt.xlim(5000,9000,10)
    plt.ylim(0,0.4,8)
    fig_num = fig_num +1

GRNN进行二分类原理 二分类模型_深度学习

利用插值曲线生成的数据训练模型

参考

插值SciPy.interpolate模块

Harish Cherukuri, E. Perez-Bernabeu, A neural network approach for chatter prediction in turning,Procedia Manufacturing,2019

Matplotlib画几种三维图

windows 下,Anaconda命令总结