二分类模型的复现
- 原理如下
- 数据工具
- 模型的训练过程
- 代码片
- 通过可视化选择合适的插值方法
- 利用插值曲线生成的数据训练模型
- 参考
分界线上侧是颤振,下侧没有颤振。现在需要在上下两侧随机生成数据集
原理如下
1.由数据点训练回归模型来拟合分界曲线
2.由分界曲线生成颤振与不颤振的样本点
3.由样本点训练分类模型
4.由分类模型判断点是否颤振
(但是,这篇文章的矛盾点在于,既然已经知道颤振分界曲线为,什么还要通过颤振曲线产生样本点来训练分类模型呢?直接判断实际点在颤振曲线哪一侧不好吗?
可能的理由有三:
- 期刊中训练模型用到的数据集是通过其他手段得到,而非由插值分界曲线得到的;
- 适用于高维特征时,已经不能用连续曲面或曲线来生成样本点。因此,神经网络分类对高维特征具有拓展性。
- 这篇文献就是在水。
)
数据工具
- 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 |
流程
- 画出原分界曲线。在图上用红色标出。
- 画出各种方法在原曲线上的插值散点分布图。在图上用紫色标出。
- 画出在插值分布散点图上下随机分布的取样点。上方用绿色,下方用橘黄色标出。并用不同颜色标出
- 经过在图上对比。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
利用插值曲线生成的数据训练模型
插值SciPy.interpolate模块
Harish Cherukuri, E. Perez-Bernabeu, A neural network approach for chatter prediction in turning,Procedia Manufacturing,2019
Matplotlib画几种三维图
windows 下,Anaconda命令总结