二分类模型的复现


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

原理如下

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原数据x1-D float or complex
fp原数据y1-D float or complex,
长度与xp相同
left任意float or complex corresp
onding to fp
right任意float or complex corres
ponding to fp
periodNone 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
p0.5
初始化方式随机初始化
目标函数交叉熵
epoches5
vadidationK(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

在这里插入图片描述

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

参考

  1. 插值SciPy.interpolate模块
  2. Harish Cherukuri, E. Perez-Bernabeu, A neural network approach for chatter prediction in turning,Procedia Manufacturing,2019
  3. Matplotlib画几种三维图
  4. windows 下,Anaconda命令总结
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值