【问题标题】:Issue Regarding MATLAB code for regression technique关于回归技术的 MATLAB 代码的问题
【发布时间】:2018-01-09 07:27:53
【问题描述】:

我正在研究测量方向盘绝对角度的方向盘角度传感器。由于转向角传感器使用完全与硬件相关的齿轮和几个关节,因此尽管由于使用机械部件以及由于某些环境和道路条件而随着时间的推移进行校准,但传感器的值会出现一些错误(例如偏移、相位变化、信号平坦化、延迟)。

简而言之,由于测量中的这些错误,我们的目标会分心,这意味着如果我正在查看速度与时间的曲线,那么如果在原始或校准传感器中简而言之接近理想条件传感器,我的速度会显示振幅峰值,但由于测量信号中的误差(滞后) 我没有在速度曲线上达到峰值,或者我的曲线变平了,所以这会影响我的最终任务。

我对滞后有 1.20 度的容差,这就是为什么我对我的信号有详细的了解,并想观察我的信号是否有一些变化意味着我的信号中是否发生了偏移、延迟、降低。这不仅会为我提供一个想法,即是减少用于我的任务的传感器数量,还是对传感器的硬件进行一些更改以减少滞后量,或者采取一些其他措施来减少滞后量。

到目前为止我所做的事情我不确定我是对还是错。我得到了一些滞后值,但我对我正在使用的一种技术几乎没有疑问。如果有人向我提供有关如何改进此技术的想法或为我提供更好的方法,那将是很好的指导。

我有一个理想的传感器信号(在我们想要的理想条件下)和来自 1 个传感器的值我有来自汽车的 6 个不同驱动器的数据。我只解释了我的第一个驱动器的一个示例及其与我的参考传感器数据的关系。

给定数据参考信号和大小为 1x1626100 和 1 x 1626100 双倍的传感器信号数据,从传感器读取一个读数,但在所有读数中,理想信号和测量信号相对于时间的所有读数都相同。

简而言之,我想找出传感器信号与测量信号的滞后差异。

在这种方法中,我应用了回归线技术(关于差分信号的上限和下限)。

我对我的信号进行了差分(参考 - 对信号施加限制后的信号测量值)。

应用回归技术,我自己在差异信号的上下设置一个阈值,分别在上限值和下限值上,上下值回归线之间的差异称为滞后(损失)。请看图 3 和图 4 以获得清晰的视图。

这种技术的问题在于,在查看 up= 0.4、low= -0.4 等数据后,我自己定义了上下回归线的值。

问题:

是否有可能我可以编写一个程序来自行决定最佳拟合线而不是给出阈值?

意味着有什么方法可以让我的代码为上述值绘制最佳回归线,为较低值绘制最佳回归线并计算滞后。

我将非常感谢大家,因为我仍然无法找到解决此问题的方法。

感谢期待。

         clear all
         clc
         drv(6)=load('20170420__142024.mat');
          t=drv(6).q_T0;
          ref=drv(6).Pos;
          lws_7=drv(6).SteeringWheelAngle;
          swav=drv(6).SteeringWhellRotSpd;
          vel=drv(6).KBI_angez_Geschw;

          sig_diff=ref-lws_7;
          mean_sig_diff = mean(sig_diff);
          offset_removed_sig_diff = detrend(sig_diff ,'constant' );
          offset_removed_mean_sig_diff = detrend(mean_sig_diff ,'constant');

           figure(1)
         ax11=subplot(321);
          histfit(sig_diff)
        dum=['Drive ' num2str(i) ': Differnce Signal With offset Removed for drive '];
        title(dum)
         hold on
         plot([mean_sig_diff  mean_sig_diff],[0 10000],'r')

         hold off

        ax12=subplot(322);
        histfit(offset_removed_sig_diff)
        dum=['Drive ' num2str(i) ': Differnce Signal With offset Removed'];
         title(dum)
         hold on
          plot([offset_removed_mean_sig_diff  offset_removed_mean_sig_diff],[0 10000],'r')
            hold off


           swvel_thres=20; 
           vehvel=60;  
           SAmax=90;

         t_lim=t(((lws_7<SAmax)&(lws_7>-SAmax)&(swav<swvel_thres)&(vel>vehvel)));

          sig_diff_lim = sig_diff((lws_7<SAmax)&(lws_7>-SAmax)&             (swav<swvel_thres)&(vel>vehvel));
           offset_rem_sig_diff_lim = detrend(sig_diff_lim,'constant');
            mean_sig_diff_lim = mean(sig_diff_lim);
            offsetmean_sig_diff_lim = detrend(mean_sig_diff_lim,'constant');


          figure(2)
         ax21=subplot(321);
          histfit(sig_diff_lim)
         dum=['Drive ' num2str(i) ': Limited Differnce Signal With offset Removed for drive '];
        title(dum)
          hold on
        plot([ mean_sig_diff_lim    mean_sig_diff_lim],[0 10000],'r')
        hold off

        ax22=subplot(322);
       histfit(offset_rem_sig_diff_lim )
        dum=['Drive ' num2str(i) ': Limited Differnce Signal With offset Removed'];
         title(dum)
        hold on
        plot([offsetmean_sig_diff_lim   offsetmean_sig_diff_lim],[0 10000],'r')
        hold off

      up=0.4;
      low=-up;
      stats_up =   regstats(offset_rem_sig_diff_lim((offset_rem_sig_diff_lim>up)),t_lim((offset_rem_sig_diff_lim>up)), 'linear', {'beta'}); %calculate linear regression for upper values
     intercept_up=stats_up.beta(1);
    slope_up=stats_up.beta(2);
    stats_low = regstats(offset_rem_sig_diff_lim((offset_rem_sig_diff_lim<low)),t_lim((offset_rem_sig_diff_lim<low)), 'linear', {'beta'}); %calculate linear regression for upper values
    intercept_low=stats_low.beta(1);
    slope_low=stats_low.beta(2);
    Hysteresis_LinReg = abs(intercept_low)+abs(intercept_up);

   figure(4)
    % ax31=subplot(321);
   plot(t_lim, offset_rem_sig_diff_lim ,t_lim,      t_lim*slope_up+intercept_up, t_lim ,t_lim*slope_low+intercept_low);grid
    legend('diff','reg up','reg low')
    title(' Limited Differnce Signal With offset Removed with regression lines for drive  ')

   figure(5)
  histfit(offset_rem_sig_diff_lim)
  dum=['Drive ' num2str(i) ':Offset Removed Limited Difference Signal  with Regression Lines for drive '];
    title(dum)

    hold on
   plot([ intercept_up   intercept_up],[0 12000],'r')
    hold off

    hold on
     plot([intercept_low   intercept_low],[0 12000],'r')
       hold off

【问题讨论】:

  • 我不确定我是否理解 - 您是否需要帮助获取带有“三角形”的绘图下方的绘图或获取它不是问题,您只想自动分隔绘图上的点在它下面以适合两条线?
  • 没有这个三角形的图片上传只是为了理解。我附上了另一张图片,希望它有助于理解我的问题。实际上在这个图中有一条绿色和红色的线。现在从我的代码中我提到了一个值 0.4 来绘制这些线并执行计算,但我想编写一个自动代码,它将自行选择最适合的线并绘制这些线而无需手动处理代码。
  • 我尝试计算平均值、标准偏差、最大值,但仍然无法找到解决方案。如果您需要更多说明,请提出问题,我会解释更多。谢谢期待。
  • 新添加的图片是带有回归线的差分信号图
  • 在代码中,我使用了 up = 0.4 和 low = -up 来绘制这些线,但这是手动方式,我想以自动方式执行此操作,代码检测最佳线并给我滞后的结果。

标签: matlab statistics signals signal-processing regression


【解决方案1】:

您可以尝试k-means algorithm 的一维版本。 k-means 将数据集划分为 k 个集合(称为集群) - 在您的情况下 k = 3 (中点、上点、下点) - 就它们彼此的接近程度而言。

您可以使用 Matlab 提供的kmeans() 函数。这是 2D 版本的 AFAIK,但您可以通过将每个点的第一个(即时间)坐标设置为 0 来减少问题的维度,只留下“y”(即信号)值。

k-means 完成后,只需选择平均值最低和最高的点,这将为您提供上点和下点。您可以使用此版本的函数获取每个集群的方法(请参阅链接文档):

[idx,C] = kmeans(___)

矩阵 C 将包含均值,idx 显示哪个点属于哪个集合(簇)。

然后将线拟合到您选择的点集。

【讨论】:

  • 首先非常感谢您的宝贵时间和出色的回复,但不幸的是,这种技术仅用于通过制作集群来区分数据,但我想问的是在 2 个信号之间找到错误。跨度>
  • 只是小解释:我正在做的是我有一个参考信号,我有传感器信号数据。我想计算我的测量值传感器信号数据与参考信号有多大不同,所以我对其应用了回归技术,这意味着我自己在这项技术上定义了阈值。这种技术为数据放置了一条最佳拟合线,上下线之间的差异是错误的。但是根据我的知识,K均值分类仅用于通过形成聚类来对数据进行分类,是指基于选择的均值在一个聚类中彼此相似的数据。
  • 我真的很抱歉,但我真的很感谢你的时间和精力,感谢你,如果你对我的问题有一些解决方案,请告诉我关于回归的方法我请求你的专家意见。谢谢又来了很多。
  • 坦率地说,我可能不知道如何根据 K 均值聚类找到 2 个信号之间的差异,或者如果我错了,请在这种情况下纠正我,因为我不是机器学习专家
  • 根据您的描述,您可以使用 k-means 计算误差。 K-means 会让你过滤掉中间点,因为它们将在不同的集群中。较高的点将有自己的集群,较低的点也将有自己的、不同的集群。您可以将线拟合到仅包含较高点的集群,然后拟合仅包含较低点的线,并计算线之间的距离,这将为您提供所需的误差。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
相关资源
最近更新 更多