无监督智能地震速度拾取(matlab实现)

三维k-means无监督智能地震速度拾取(matlab实现)

本文从三个方向探究了叠加速度拾取智能化的方法。
首先是速度谱预处理方面,经过统一阈值筛选后的速度谱往往忽略了浅层的能量团,而且深层速度的聚焦性差。故设计了一种随深度的变化,阈值也相应变化的滑动窗来实现阈值的灵活筛选,使浅层的速度也能被拾取,深层速度的拾取更加准确。
其次是聚类算法的升级,传统的二维k means聚类算法,得的中心是截面的几何中心,而非真正速度谱的能量中心。特创新出三维k means聚类,使拾取的结果更加接近于真实的能量团,从而得自动更加准确的叠加速度来进行动校正。
最后是其他聚类算法对聚类结果的比较,k means聚类算法需要人工设置聚类中心个数和最大循环次数,db-scan聚类算法不需要设置聚类中心个数,只需要调节限制圆的半径和圆内最小点数,在算法运行的过程中就可以获得聚类中心个数。在本次科创过程中探究了这两种算法的优缺点更好地改进对速度拾取算提出更好的改进措施。

叠加速度拾取原理

利用速度谱方法求取叠加速度是目前生产单位提取速度参数的重要手段。所谓叠加速度,是指对道集内某个反射波同相轴用不同的速度进行动校正并分析校正后的叠加效果,其中叠加效果最好的那个速度就是该反射波的叠加速度。
为了得到叠加速度,需要将原始地震道集和界面反射系数褶积得到叠加速度谱,用阈值对速度谱进行筛选,用算法对筛选后的速度谱进行聚类处理,处理得到的聚类中心的坐标对应的就是不同深度的叠加速度大小。
用拾取的地震速度对地震道集进行动校正,就可以将双曲线拉直,再进行后期的水平叠加。
在这里插入图片描述

K-means聚类原理简介

1.输入一聚类簇数为k的样本集,样本集大小为m*n的矩阵 在样本集中随机抽取k个样本作为初始均值向量(cluster center);
2.计算每个样本点与各均值向量的距离d 根据距离d将每个样本点划入与之最近的簇中,此时均值向量发生改变 ;
3.对簇中每个样本求和/簇中样本个数求得新的均值向量;
4.更新均值向量,当均值向量不再改变时停止迭代 ,输出将样本集最后划分的k个簇 ;在这里插入图片描述
为了探究出一组最合适的参数,我们调节了不同的阈值和聚类中心个数,研究其对聚类效果的影响:在这里插入图片描述
从上图可以明显的发现,阈值过大会丢失大部分的能量团数据使浅层的速度拾取效果不佳;阈值过不断地调试大量的噪音。经过不断的调试最后选择95为最佳阈值。
在这里插入图片描述

从上图可以发现不同聚类中心的个数也会影响聚类效果,其中12个聚类中心的效果是最佳的。

自适应滑窗预处理

用统一阈值对速度谱进行筛选时固定的阈值使其拾取精度在一定程度上受到速度能量团聚焦性的制约,而且容易忽略弱反射速度的能量团。故在筛选速度谱时,加入随时间变化的滑动窗,来实现对能量的灵活筛选。我们设计的滑动窗口的窗函数为
在这里插入图片描述(其中i为第i时刻,d-win为窗长)。随着时间i的增大,滑动窗口从速度谱的浅部向深部移动,每一时刻窗内的阈值为在这里插入图片描述
。(其中都为窗长)。可以发现滑动窗内的阈值会随时刻i的变化而变化,这就实现了阈值的灵活改变。
在这里插入图片描述
从图中可以看出加了自适应滑窗后的速度谱的识别效果在浅层和深层明显更优于无滑窗预处理的拾取效果。

二/三维聚类效果对比

传统的k-means算法拾取速度谱是对速度谱设定统一的阈值,大于阈值的部分设定为1,小于阈值的部分设定为0。再对筛选后的二维速度谱进行聚类,由于聚类的对象是二维平面,所以聚类的标准——距离的公式也是二维的距离公式即在这里插入图片描述
二维k-means聚类后的结果是速度谱以阈值做截面后的几何中心而不是真正的能量中心。创新后的三维k-means算法将经过统一阈值筛选后的0,1速度谱再乘以原来的速度谱得到三维的速度谱,再该谱进行聚类。聚类过程中的距离公式变为在这里插入图片描述

三维聚类后的结果在物理意义上相较于二维聚类更加接近于速度谱的能量中心,也更加准确。
结果图如下:在这里插入图片描述
三维k-means聚类算法 :

% clear all
% clc
% close all
FONTSIZE=24;   FONTNAME='Times New Roman'; LINEWIDTH=2;
%%%%%%%%%%%%Auto Semblance Spectrum Picking
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%forward model
%% 生成速度模型
load stack_velspec.mat; %改变速度谱    速度谱私信我拿
nt=749;
CMP_num=1;
[nt1,n_vel]=size(VEL_SPEC);
x=200:50:2000;
%(1) Thresholding the velocity spectrum
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:CMP_num
vel_spec=VEL_SPEC;
vel_spec2=zeros(size(vel_spec));
per_max=95;
per_min=95;
per_interval=per_max-per_min;
d_win=40;
per_dv=200;
start=40;
ultimate=nt1;
thres=97;%%阈值百分数。


%求整体阈值的百分比
thres_value = prctile(prctile(vel_spec,thres),thres);  % Set the threshold value 表示被调群体中有n%的数据小于此数值(thres_value是阈值的的具体数)
VEL_SPEC2=(vel_spec>thres_value);                % Filter out small value


%(2) Build the training set. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
central_initial=cell(CMP_num,1);
dv=(vmax-vmin)/n_vel;
tic%%%计时
for m=1:CMP_num
 
vel_spec2=VEL_SPEC2.*VEL_SPEC;
vel_spec=VEL_SPEC;
n_point=sum(sum(vel_spec2~=0));  
train_set=zeros(n_point,2); %%train-set是不为零的数的位置。 Each example in the training set has two features,
                         
i_point=1;                  % Build the training set 
for ix=1:n_vel
    for iz=1:nt1
        if(vel_spec2(iz,ix)>0)
           train_set(i_point,1)=ix;
           train_set(i_point,2)=iz;
           i_point=i_point+1;
        end
    end
end
train_set(all(train_set==0,2),:)=[]
n_point=size(train_set,1)
%(3) Training...
%%%%%%%%%%%%%%%%%

%(3.1) Initialize
%%%%%%%%%%%%%%%%%
num_cluster=12;                    % Set the initial number of cluster
dx=floor(n_vel/(num_cluster+1));  
dz=floor(nt1/(num_cluster+1));
central=zeros(num_cluster,2);      
maxiter=10; %%%%%%%最大循环次数                      
Max_Stretch=80;


for ik=1:num_cluster               % Initialize each cluster central
    central(ik,1)=dx*ik;
    central(ik,2)=dz*ik;
end
central_initial{m}=central;%%%%%%%找出开始的聚类中心
% figure;
% imagesc(vel_spec);
% hold on
% plot(central(:,1),central(:,2),'r*');
%(3.2) Interation start...
%%%%%%%%%%%%%%%%%%%%%%%%%%


for iter=1:maxiter
    % Plot each cluster central on the velocity spectrum
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%     figure;
%     imagesc(vel_spec)
%     hold on
%     plot(central(:,1),central(:,2),'r*');pause(1);hold off
    

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    res=0.0;
    Y=zeros(n_point,1);
    for ip=1:n_point        
        
        % Compute the distance of each points to the first cluster central
        dist1=(train_set(ip,1)-central(1,1))^2+(train_set(ip,2)-central(1,2))^2+(vel_spec2(train_set(ip,1),train_set(ip,2))-vel_spec2(central(1,1),central(1,2)))^2;
        Y(ip)=1;
        
        % Compute the distance of each points to the each cluster central
        for ik=2:num_cluster  % Loop over each cluster central %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%(特别注意!!!!!!自己改的)   
            dist_temp=(train_set(ip,1)-central(ik,1))^2+(train_set(ip,2)-central(ik,2))^2+(vel_spec2(train_set(ip,1),train_set(ip,2))-vel_spec2(central(ik,1),central(ik,2)))^2;
            if(dist1>dist_temp)
               dist1=dist_temp;
               Y(ip)=ik;%%%%%%%%%Y矩阵里是数据集不为零的点到每个新中心点的最近距离划分的类别
            end
        end
        res=res+dist1;        % Compute residual
    end 
    
    fprintf('iter= %d res = %f\n',iter,res)
    RES(iter)=res;
    % Compute the new central of each cluster
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    num_K=zeros(num_cluster,1);
    central_temp=zeros(size(central));
    for ip=1:n_point
        central_temp(Y(ip),1)=central_temp(Y(ip),1)+train_set(ip,1);
        central_temp(Y(ip),2)=central_temp(Y(ip),2)+train_set(ip,2);
        num_K(Y(ip))=num_K(Y(ip))+1;
    end

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算新的聚类中心
    for ik=1:num_cluster
        if(num_K(ik)==0) 
           num_K(ik)=1; 
        end
    end
    
    % Compute the average
    %%%%%%%%%%%%%%%%%%%%%
    for ik=1:num_cluster
        central_temp(ik,1)=floor(central_temp(ik,1)/num_K(ik));
        central_temp(ik,2)=floor(central_temp(ik,2)/num_K(ik));
    end 
    central=central_temp;%%%%%%central 是新的聚类中心
    central(all(central==0,2),:)=[]
    num_cluster=size(central,1)
    
   central2=central


end


%(4) postprocessing



% velocity field 

vnmo=vmin+central2(:,1)*dv;
tnmo=central2(:,2)*dt*dR;
CENTRAL=central2;
  
 
end
end
toc


%%%%%Plot Figure
xx=vmin:dv:vmax;
zz=(1:nt)*dt;


figure;
subplot(1,2,1);imagesc(xx,zz,VEL_SPEC2);
xlabel('Velocity(m/s)')
ylabel('Time (s)');ylim([0 1.5]);
set(gca,'tickdir','out','Fontname',FONTNAME,'Fontsize',FONTSIZE);

subplot(1,2,2);imagesc(xx,zz,VEL_SPEC);
hold on;
plot(vmin+CENTRAL(:,1)*dv,CENTRAL(:,2)*dt*dR,'r','linewidth',2)
hold on;plot(vmin+CENTRAL(:,1)*dv,CENTRAL(:,2)*dt*dR,'r*');
%plot(vrms(:,K),t0,'g','linewidth',2);
xlabel('Velocity(m/s)')
ylabel('Time (s)')
ylim([0 1.5]);
set(gca,'tickdir','out','Fontname',FONTNAME,'Fontsize',FONTSIZE);

`


猜你喜欢

转载自blog.csdn.net/m0_67495624/article/details/128631866
今日推荐