最近经一朋友介绍揽下某油下面一个小项目,算是挣点外快。该项目主要是运用脉冲涡流检测原理实现对管道或其它铁磁材料等的缺陷检测,厚度测量等;而我要做的是根据海量的脉冲涡流信号数据和厚度标定数据建立/学习一个从信号到厚度的映射。大概花了两周时间:第一周调研脉冲涡流相关的资料和技术;第二周提想法并编码解决问题。截至今使用比较风靡的深度学习技术达到了不错的效果,后续会协助公司撰写/申请专利。

脉冲涡流检测原理

当金属材质的导体在磁场中进行切割磁力线运动或者直接摆放在 一个变化的磁场中的时候,由法拉第电磁感应定理可知, 金属导体内部会感生出类似水流漩涡形状的电流, 该感应电流因其漩涡状被称为涡电流。相对于传统的涡流检测技术,脉冲涡流检测技术是将频率丰富的具有一定占空比的脉冲电流信号加载到激励线圈上,当激励电流信号瞬间关断时,激励线圈由于电流信号的瞬间变化而感应出一个随时间快速衰减的脉冲磁场该磁场称为一次场,快速变化的一次场会在导体试件内部感应出旋涡状的脉冲电流,该脉冲涡流信号随着时间在导体中传播衰减而感应出一个新的变化的磁场,称为二次场,如下图所示。根据电磁感应原理在使用检测探头对导体材料进行检测时,检测线圈上输出的为线圈周围磁场随时间衰减感应出的瞬态电压。

脉冲涡流检测技术正是利用了涡流效应这一物理现象,在被测金属试件中存在有缺陷的时候,试件中的感应涡流以及磁场的分布必定会受到缺陷的影响而发生相应的改变,借助分析这些变化来掌握试件中缺陷的有关情况。所以检测试件的导电性能、腐蚀状况或者厚度等信息会对检测线圈接收的感应信号直接产生影响,通过对感应电压信号进行数据采集、处理、分析就可以掌握被检测试件的相应的缺陷信息。

如上图所示,当金属试件中存在有缺陷的时候,涡流的传播被缺陷所阻碍,而由于电流总是会沿着阻抗较低的路径传播,所以其传播路径势必会发生相应的改变,而试件的缺陷处为空气,而空气的阻抗明显高于金属的阻抗,因此可以看到传播到缺陷所在位置的涡流改变了其原先的传播路线,均在缺陷处进行了“绕行”,进而继续在金属试件中流动。随着金属试件中涡流分布的改变,该涡流所感生的磁场分布也已经与无缺陷时的分布情况有所区别,而这些分布上的变化与试件中存在的缺陷之间存在着若干的对应关系,借助对这些关系所进行的分析,从而实现对金属试件中存在缺陷的情况进行研究。

方法

为了解决这个映射问题,开始大量从知网上调研文献。发现比较常规的做法是,从脉冲涡流信号中提取特征,并于相对应的厚度信息进行可视化,再人为的去拟合出这个函数映射。特征比较普遍的是采用末段信号的斜率,或利用傅里叶变换对脉冲信号进行谐波分析提取振幅等信息。本人照着文献里的方法进行尝试,发现要么操作起来很难,要么就是可视化后没有一定的规律从而难以拟合。因此得出的结论是,文献里的方法也许只实用于对应的场景,通用性不够强;当面临新的场景检测任务,也许整个数据分析方法都得推翻重来。

鉴于此,开始发挥本人的专业所长,利用大数据模型去拟合这些海量数据。

读取数据:数据的目录结构是各个月份的采集数据成一个目录,而在月份目录下又有具体天的采集信号,因此在编码中采用递归进行读取。比如在某一天的目录下有文件:“2017101601_1.txt“ 和 ”2017101601_1_dep.txt“分别是脉冲涡流信号数据文件和对应的厚度数据,当然还有其它数据(该项目中没有利用);其中脉冲涡流数据最主要的信息包含每一个测点的随着时间衰减的涡流电压信号-31维。注意,由于脉冲涡流这种电磁感应的测量方式,前后各6个测点的数据进行了舍弃。

import os
import numpy as np
import matplotlib.pyplot as plt
from pylab import mplmpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = FalsefoldPath='D:\\Data'
eddyDataSets=np.empty((0,31))
yDataSets=[]
timeData=np.zeros(31)def readTxt(txtPath):with open(txtPath) as datFile: eddyData=np.empty((0,31))onePlaceData=np.zeros((1,31))for txtLine in datFile.readlines():cls=txtLine.strip().split()if cls:str0=cls[0]if str0.isdigit():timeData[int(str0)-1]=float(cls[1])try:onePlaceData[0,int(str0)-1]=float(cls[2])except ValueError:onePlaceData[0,int(str0)-1]=float('NaN')if int(str0)==31:eddyData=np.r_[eddyData,onePlaceData] return eddyData[6:eddyData.shape[0]-6,:]def readFolders(foldPath): global  eddyDataSets    filelist=os.listdir(foldPath)for files in filelist:filePath=os.path.join(foldPath,files)if os.path.isfile(filePath):#is filefilename=os.path.splitext(files)[0]filetype=os.path.splitext(files)[1]if filename[-4:]!='_dep' and filetype =='.txt':  print(filePath)eddyData=readTxt(filePath)eddyDataSets=np.r_[eddyDataSets,eddyData]filePath=os.path.join(foldPath,filename+'_dep.txt')print(filePath)with open(filePath) as datFile:lines=datFile.readlines()lines.pop(0)lines.pop()vfloats=[line.strip().split() for line in lines]yDataSets.extend([float(n) for vf in vfloats for n in vf])else:#is foldreadFolders(filePath)readFolders(foldPath)
yDataSets=np.asarray(yDataSets)

读取预处理:数据的可视化如下图所示,展示了其中10个测点位置的涡流信号-电压衰减曲线。由于电压值的变化范围较大,下图进行了双对数坐标展示。从下图分析,不同测点位置的电压衰减在前半部分基本相同,不同之处在于末段部分,呈现不同程度的波形抖动(这也解释了斜率法在这种场景中无法操作);对于不同测点的波形图,比如厚度为19.7712的波形图后段的谷值和峰值有一定的区分度,但值得注意的是在其它测点处并没有呈现类似的倾向,因此简单分析这种底层特征很难找到一个合适的先验特征。因此,我们采用机器学习模型的强拟合能力来拟合这些数据。由于电压值的变换差异,我们对信号采用对数变换,并取后续15维特征;另外,由于给的标定数据中有’inf’,对数据进行了清洗。最后的数据总量为170,983条,并划分训练集(0.9)/测试集(0.1):(eddyDataSets,yDataSets),(eddyDataSets_test,yDataSets_test)。

def show2Darray(eddyDataSets,yDataSets):#绘图函数num_data=eddyDataSets.shape[0]myColor=np.random.rand(num_data,3)plt.figure(figsize=(10,10))    plt.title('各测点的电压衰减曲线', fontsize=36)for i in range(num_data):plt.loglog(timeData,eddyDataSets[i],color=myColor[i],label='thickness: {}'.format(yDataSets[i]),marker='o')plt.legend()plt.xlabel(r"$us$", fontsize=30)plt.ylabel(r"$\frac{uV}{A}$", fontsize=30)plt.savefig('D:\\1.jpg')plt.show()

#pre-processing
idx=np.nonzero(np.isinf(yDataSets))
eddyDataSets=np.delete(eddyDataSets,idx,axis=0)
yDataSets=np.delete(yDataSets,idx,axis=0)eddyDataSets=np.log10(np.abs(eddyDataSets)+1)
eddyDataSets=eddyDataSets[:,-15:]

模型:首先想到了SVR模型,并利用10折交叉验证和网格搜索进行参数最优调节。

from sklearn.metrics import mean_squared_error
from sklearn.grid_search import GridSearchCV
from sklearn.model_selection import cross_val_score,cross_validate
from sklearn.svm import SVR
from sklearn.externals import joblibparam_C_gamma={"C": np.arange(1,1001,10),"gamma": np.logspace(-3, 3, 50)}
gSearch=GridSearchCV(estimator=SVR(),param_grid = param_C_gamma,cv=10,scoring='neg_mean_squared_error')
gSearch.fit(eddyDataSets, yDataSets)
#打印最佳参数及评测结果
print(gSearch.grid_scores_, gSearch.best_params_, gSearch.best_score_)
#根据最佳参数重新训练整个数据集,并在测试集上测试
clf=SVR(C=100,gamma=10)
clf.fit(eddyDataSets, yDataSets)
joblib.dump(clf, "SVR_train_model.m") #保存模型#加载模型
#clf = joblib.load("SVR_train_model.m")
mse = mean_squared_error(yDataSets_test, clf.predict(eddyDataSets_test))
print("MSE: %.4f" % mse)

模型:GBDT模型,同样利用10折交叉验证和网格搜索进行参数最优调节。

from sklearn.ensemble import GradientBoostingRegressor#tuning n_estimators 弱学习器数目  评分采用 neg_mean_squared_error
para_n_estimators={'n_estimators':np.arange(100,801,50)}
gSearch=GridSearchCV(estimator=GradientBoostingRegressor(learning_rate=0.01, min_samples_split=500,max_depth=5, min_samples_leaf=50,max_features='sqrt',subsample=0.8,random_state=10), param_grid = para_n_estimators,scoring='neg_mean_squared_error',cv=10)
gSearch.fit(eddyDataSets, yDataSets)
print(gSearch.grid_scores_, gSearch.best_params_, gSearch.best_score_)
#进行n_estimators最佳参数选择,并作为下面的输入#tuning max_depth 树深
param_max_depth = {'max_depth':np.arange(3,10,2), 'min_samples_split':np.arange(100,1001,100)}
gSearch=GridSearchCV(estimator=GradientBoostingRegressor(learning_rate=0.01, min_samples_leaf=50,n_estimators=400,max_features='sqrt',subsample=0.8,random_state=10), param_grid = param_max_depth,scoring='neg_mean_squared_error',cv=10)
gSearch.fit(eddyDataSets, yDataSets)
print(gSearch.grid_scores_, gSearch.best_params_, gSearch.best_score_)
#进行max_depth 最佳参数选择,并作为下面的输入#tuning 内部节点再划分所需最小样本数min_samples_split 叶子节点最少样本数min_samples_leaf
param_min_samples_split_leaf = {'min_samples_split':np.arange(100,1001,100), 'min_samples_leaf':np.arange(40,101,10)}gSearch=GridSearchCV(estimator=GradientBoostingRegressor(learning_rate=0.01, max_depth=5,n_estimators=400,max_features='sqrt',subsample=0.8,random_state=10), param_grid = param_min_samples_split_leaf,scoring='neg_mean_squared_error',cv=10)
gSearch.fit(eddyDataSets, yDataSets)
print(gSearch.grid_scores_, gSearch.best_params_, gSearch.best_score_)
#进行min_samples_split 和 min_samples_leaf最佳参数选择,并作为下面的输入#tuning max_features
param_max_features = {'max_features':np.arange(int(num_feature/2),num_feature,2)}
gSearch=GridSearchCV(estimator=GradientBoostingRegressor(learning_rate=0.01, max_depth=5,n_estimators=400,min_samples_split=600,min_samples_leaf=80,subsample=0.8,random_state=10), param_grid = param_max_features,scoring='neg_mean_squared_error',cv=10)
gSearch.fit(eddyDataSets, yDataSets)
print(gSearch.grid_scores_, gSearch.best_params_, gSearch.best_score_)
#进行max_features最佳参数选择,并作为下面的输入#tuning subsample
param_subsample = {'subsample':[0.6,0.7,0.75,0.8,0.85,0.9]}
gSearch=GridSearchCV(estimator=GradientBoostingRegressor(learning_rate=0.01, max_depth=5,n_estimators=400,min_samples_split=600,min_samples_leaf=80,max_features=10,random_state=10), param_grid = param_subsample,scoring='neg_mean_squared_error',cv=10)
gSearch.fit(eddyDataSets, yDataSets)
print(gSearch.grid_scores_, gSearch.best_params_, gSearch.best_score_)
#进行subsample最佳参数选择#可以减小步长learning_rate  增加基学习器数目n_estimators 保证泛化能力的基础上增加一些拟合程度
params = {'n_estimators': 450, 'max_depth': 5, 'min_samples_split': 600,'learning_rate': 0.006, 'min_samples_leaf': 80, 'max_features':10,'subsample':0.7}
clf = GradientBoostingRegressor(**params)
clf.fit(eddyDataSets, yDataSets)
joblib.dump(clf, "GBDT_train_model.m") #保存模型#加载模型
#clf = joblib.load("GBDT_train_model.m")
mse = mean_squared_error(yDataSets_test, clf.predict(eddyDataSets_test))
print("MSE: %.4f" % mse)

模型:利用Pytorch 框架建立深度神经网络模型,利用全连接网络和卷积网络

import torchmethod='conv' #or fc  conv
class myFcNet(torch.nn.Module):def __init__(self,inputDim):super(myFcNet, self).__init__()self.layer_fc1=torch.nn.Sequential(torch.nn.Linear(inputDim,256),torch.nn.Dropout(0.5),torch.nn.ReLU())self.layer_fc2=torch.nn.Sequential(torch.nn.Linear(256,640),torch.nn.Dropout(0.5),torch.nn.ReLU())self.layer_fc3=torch.nn.Sequential(torch.nn.Linear(640,1024),torch.nn.Dropout(0.5),torch.nn.ReLU())self.layer_fc4 = torch.nn.Linear(1024,1)def forward(self,y):y=self.layer_fc1(y)y=self.layer_fc2(y)y=self.layer_fc3(y)y=self.layer_fc4(y)return yclass myConvNet(torch.nn.Module):#conv1d+def __init__(self):super(myConvNet,self).__init__()self.layer_conv1=torch.nn.Sequential(torch.nn.Conv1d(1,32,3),torch.nn.MaxPool1d(2),torch.nn.ReLU())self.layer_conv2=torch.nn.Sequential(torch.nn.Conv1d(32,32,3),torch.nn.MaxPool1d(2),torch.nn.ReLU())self.layer_conv3=torch.nn.Sequential(torch.nn.Conv1d(32,64,1),torch.nn.MaxPool1d(2),torch.nn.ReLU())self.layer_conv4=torch.nn.Sequential(torch.nn.Conv1d(64,64,1),torch.nn.MaxPool1d(2),torch.nn.ReLU())self.layer_fc1=torch.nn.Sequential(torch.nn.Linear(64,256),torch.nn.Dropout(0.5),torch.nn.ReLU())self.layer_fc2 = torch.nn.Sequential(torch.nn.Linear(256,1024),torch.nn.Dropout(0.5),torch.nn.ReLU())self.layer_fc3 = torch.nn.Linear(1024,1)def forward(self,x):x=self.layer_conv1(x)x=self.layer_conv2(x)x=self.layer_conv3(x)x=self.layer_conv4(x)y=x.view(-1,64) #改变数据形状,进入全连接层y=self.layer_fc1(y)y=self.layer_fc2(y)y=self.layer_fc3(y)return yfeatureNum=eddyDataSets.shape[1]
eddyDataSets = torch.from_numpy(eddyDataSets).float()
if method=='conv':#batch channel 1D-FeatureeddyDataSets=eddyDataSets.view(-1,1,featureNum)
yDataSets=torch.Tensor(yDataSets).float()
yDataSets=torch.unsqueeze(yDataSets,1)
yDataSets=yDataSets-torch.mean(yDataSets)
eddyDataSets,yDataSets=torch.autograd.Variable(eddyDataSets),torch.autograd.Variable(yDataSets)#net parameters
num_epochs = 50
batch_size = 100
learning_rate = 0.001#定义网络/损失函数/优化器 myModel criterion optimizer
myModel = myConvNet() if method=='conv' else myFcNet(featureNum)
criterion=torch.nn.MSELoss()
optimizer=torch.optim.Adam(myModel.parameters(), lr=learning_rate, weight_decay=0.0)for epoch in range(num_epochs):#shuffleidx=torch.randperm(eddyDataSets.size()[0])eddyDataSets_epoch=torch.index_select(eddyDataSets,0,idx)yDataSets_epoch=torch.index_select(yDataSets,0,idx)#split for batch sizeeddyDataSets_epoch_loader=torch.split(eddyDataSets_epoch,batch_size,0)yDataSets_epoch_loader=torch.split(yDataSets_epoch,batch_size,0)#train batchfor i in range(len(eddyDataSets_epoch_loader)):datas=eddyDataSets_epoch_loader[i]labels=yDataSets_epoch_loader[i]#forward passoutputs=myModel(datas)loss=criterion(outputs,labels)#backword and optimizeoptimizer.zero_grad()loss.backward()optimizer.step()#        if (i+1)%2==0:
#            print('Epoch [{}/{}], Step [{}/{}], Loss:{:.4f}'.format(
#                    epoch+1,num_epochs,i+1,len(eddyDataSets_epoch_loader),loss.item()))#print loss of each epochprint('Epoch [{}/{}], Loss:{:.4f}'.format(epoch+1,num_epochs,loss.item()))print('=======Predicting========')
# 切换成验证模式,验证模式下DROPOUT将不起作用
myModel.eval()
result_test = torch.Tensor()#split for batch size
eddyDataSets_loader=torch.split(eddyDataSets_test,batch_size,0)
#test batch
for i in range(len(eddyDataSets_loader)):datas=eddyDataSets_loader[i]#forward passoutputs=myModel(datas)result_test = torch.cat((result_test,outputs),0)print("MSE: %.4f" % torch.mean((result_test-yDataSets_test)*(result_test-yDataSets_test)))
# Save the model checkpoint
torch.save(myModel.state_dict(), 'myModel.ckpt')

经过测试,发现基于深度学习模型的测试误差率远远高于传统模型SVR和GBDT。倒不是说深度学习不行,而是在我们的模型中只涉及到了浅层网络,后续可以加大网络深度,充分挖掘深度神经模型的拟合能力。而在这里,我们另辟蹊径采用时间序列模型建模我们的涡流信号数据,因为涡流电压信号是一个典型的时间序列。首先我们采用卷积网络进行时间点说的特征提取,再利用LSTM建模时间相关性,最后利用全连接进行回归。

import torchclass myLSTMNet(torch.nn.Module):#conv1d+lstm+fcdef __init__(self):super(myLSTMNet, self).__init__()self.layer_conv1=torch.nn.Sequential(torch.nn.Conv1d(1,32,3),#torch.nn.MaxPool1d(2),torch.nn.ReLU())self.layer_conv2=torch.nn.Sequential(torch.nn.Conv1d(32,16,1),#torch.nn.MaxPool1d(2),torch.nn.ReLU())self.layer_lstm=torch.nn.LSTM(input_size=16,hidden_size=64,batch_first=True)self.layer_fc1=torch.nn.Sequential(torch.nn.Linear(64,256),torch.nn.Dropout(0.5),torch.nn.ReLU())self.layer_fc2 = torch.nn.Sequential(torch.nn.Linear(256,1024),torch.nn.Dropout(0.5),torch.nn.ReLU())self.layer_fc3 = torch.nn.Linear(1024,1)def forward(self,x):x=self.layer_conv1(x)x=self.layer_conv2(x)#转换后两维,使数据排列为RNN的输入(bath,seq_len,input_size)x=x.permute(0,2,1)x,_=self.layer_lstm(x)#取隐层的最后一层作为序列的特征向量y=x[:,-1,:]y=self.layer_fc1(y)y=self.layer_fc2(y)y=self.layer_fc3(y)return yfeatureNum=eddyDataSets.shape[1]
eddyDataSets = torch.from_numpy(eddyDataSets).float()
eddyDataSets=eddyDataSets.view(-1,1,featureNum)
yDataSets=torch.Tensor(yDataSets).float()
yDataSets=torch.unsqueeze(yDataSets,1)
yDataSets=yDataSets-torch.mean(yDataSets)
eddyDataSets,yDataSets=torch.autograd.Variable(eddyDataSets),torch.autograd.Variable(yDataSets)#net parameters
num_epochs = 50
batch_size = 10
learning_rate = 0.001#定义网络/损失函数/优化器 myModel criterion optimizer  myConvNet myLSTMNet
myModel = myLSTMNet()
criterion=torch.nn.MSELoss()
optimizer=torch.optim.Adam(myModel.parameters(), lr=learning_rate, weight_decay=0.0)for epoch in range(num_epochs):#shuffleidx=torch.randperm(eddyDataSets.size()[0])eddyDataSets_epoch=torch.index_select(eddyDataSets,0,idx)yDataSets_epoch=torch.index_select(yDataSets,0,idx)#split for batch sizeeddyDataSets_epoch_loader=torch.split(eddyDataSets_epoch,batch_size,0)yDataSets_epoch_loader=torch.split(yDataSets_epoch,batch_size,0)#train batchfor i in range(len(eddyDataSets_epoch_loader)):datas=eddyDataSets_epoch_loader[i]labels=yDataSets_epoch_loader[i]#forward passoutputs=myModel(datas)loss=criterion(outputs,labels)#backword and optimizeoptimizer.zero_grad()loss.backward()optimizer.step()#        if (i+1)%2==0:
#            print('Epoch [{}/{}], Step [{}/{}], Loss:{:.4f}'.format(
#                    epoch+1,num_epochs,i+1,len(eddyDataSets_epoch_loader),loss.item()))#print loss of each epochprint('Epoch [{}/{}], Loss:{:.4f}'.format(epoch+1,num_epochs,loss.item()))print('=======Predicting========')
# 切换成验证模式,验证模式下DROPOUT将不起作用
myModel.eval()
result_test = torch.Tensor()#split for batch size
eddyDataSets_loader=torch.split(eddyDataSets,batch_size,0)
#test batch
for i in range(len(eddyDataSets_loader)):datas=eddyDataSets_loader[i]#forward passoutputs=myModel(datas)result_test = torch.cat((result_test,outputs),0)print("MSE: %.4f" % torch.mean((result_test-yDataSets)*(result_test-yDataSets)))

最后经过测试对比,这种时序模型有最小的均方误差0.2748,取得最佳的测试效果;次之是GBDT模型,SVR模型;最后是常规的卷积网络等。GUI用tkinter模块进行界面编写,使交互更加友好,便于用户使用,如下图所示:

其中treeview中双击某条目,会弹出对应测点的原始数据:

脉冲涡流信号的大数据分析技术相关推荐

  1. 大数据分析技术有哪些应用步骤

    大数据技术经过这么几年的发展,已经不像前几年那样给人一种难懂的感觉,现如今信息的大爆炸,各行各业的信息层出不穷.但是信息的爆炸也就意味着各类杂乱无章数据的诞生,因此要想在众多的数据中找到对于自身有用的 ...

  2. 大数据分析技术架构的通用模块

    对于企业来说,坐拥庞大的数据资源,想要实现大数据分析,首先要建立自己的大数据系统平台,每个公司都有自己的具体业务场景,因此对大数据平台的要求也不同.今天我们仅从通用的角度,来聊聊大数据分析需要什么技术 ...

  3. 大数据分析技术未来发展会如何

    庞大的数据也为企业发展带来了机遇,庞大的数据量与云计算技术强大的处理能力相结合,可以实现数据大规模的训练和执行制定的算法.未来数据分析技术的发展空间需求巨大,那么为来大数据分析计算的发展将会如何? 1 ...

  4. python运用在大数据中精准生活_大数据分析技术在生活中的广泛应用

    段雯琼++薛然++任亚丽 摘 要 文章介绍了大数据技术的即时性.准确性和预测性,并将大数据技术与公共交通.医药领域.移动通信网络优化相结合,从而方便了人们的生活,提高了人们的生活质量. [关键词]大数 ...

  5. 基于大数据分析技术在会计方面的研究

    第一节 摘 要 在现如今大数据时代的背景下,有越来越多的企业正经受着数据网络的考验,其中很突出的就是管理會计,作为企业财务中一个重要的组成部分,是持续为企业整合和加工财务资料的职务,管理会计正为企业发 ...

  6. 大数据分析技术与应用 1

    CDA数据分析研究院原创作品 一.大数据概念 大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化 ...

  7. 健康大数据分析技术有哪些?

    21世纪是以生命科学为主导.科学技术迅猛发展的世纪,科技竞争力已成为决定国家前途和命运的重要因素,是推动经济发展.促进社会进步和维护国家安全的关键所在.医学在生命科学中占有极其重要的地位,卫生科技的创 ...

  8. clickhouse大数据分析技术与实战_比Hive快500倍!大数据实时分析领域的黑马

    戳蓝字"小强的进阶之路"关注我们哦! 大数据实时分析领域的黑马是ClickHouse一个用于联机分析(OLAP)的列式数据库管理系统(DBMS). clickhouse背景 俄罗斯 ...

  9. 大数据分析技术有哪些类型

    数据分析技术使数据分析人员能够审查并回顾收集的数据,并根据信息进行推断或确定.大多数技术都侧重于应用定量技术来审查数据,一些比较常见的定量数据分析技术包括描述性统计.探索性数据分析和验证性数据分析.后 ...

最新文章

  1. TaxonKit工具:获取物种NCBI数据库的Taxonomy ID
  2. 如何使flexbox子代的父母高度为100%?
  3. 下边框_OPPO Find X2颜值有多高?超窄下边框+瀑布屏,看完大写的服气
  4. Unable to locate Attribute with the the given name [] on this ManagedType[com.XXX]
  5. WordPress主题:自媒体二号大前端模板
  6. “手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
  7. H.264参考软件JM12.2RC代码详细流程
  8. 基于Python实现相关分析案例
  9. Oracle EBS之把自定义concurrent加入Pick Release Document Set(All Pick Release Documents)的几个注意点...
  10. 哪些Mac快捷键可以精准定位光标位置
  11. 动手才能进步(冒泡法示例)
  12. 中考计算机wps题怎么做,WPS与ScienceWord联合制作理科试卷 -电脑资料
  13. 自己打羽毛球的若干问题
  14. Python进行拉勾网数据爬取框架与思路
  15. Springboot毕设项目M11463家居网9m26y(java+VUE+Mybatis+Maven+Mysql)
  16. 微信小程序游戏「跳一跳」高分秘籍
  17. 【论文笔记】Adversarial Multi-task Learning for Text Classification
  18. 代码生成MANIFEST.MF文件
  19. [1.2.0新功能系列:二] Apache Doris 1.2.0 JDBC外表 及 Mutil Catalog
  20. 自动创建 api 模拟数据

热门文章

  1. 如何利用python抓取免费的IP资源、并测试http代理是否可用
  2. ios版android wear下载,iPhone能用Android Wear?新版本全面对iOS兼容
  3. Android Wear 之 WearableListView
  4. 微信小程序官方示例 Demo 代码
  5. Objective-C多次push操作后快速连续返回问题
  6. 盒子四周加上阴影css
  7. Pytorch修改模型参数的方法
  8. 关于 AutoCAD ActiveX 技术 (ActiveX)
  9. 利用word2010中的“邮件”功能批量发送邀请函
  10. 智慧旅游建设的特点有哪些?