关于回归技术的 MATLAB 代码的问题
Issue Regarding MATLAB code for regression technique
我正在研究测量方向盘绝对角度的方向盘角度传感器。由于转向角传感器使用完全与硬件相关的齿轮和多个接头,因此尽管校准开始时由于使用机械部件以及由于某些环境和道路条件而随着时间的推移传感器值会出现一些错误(例如偏移、相变、信号平坦化、延迟)。
简而言之,由于测量中的这些错误,我们的目标会分心意味着如果我正在查看速度与时间曲线,那么如果在原始或校准传感器中接近理想条件传感器,我的速度显示振幅峰值但由于测量信号中的误差(滞后),我没有在速度曲线上达到峰值,或者我正在使曲线变平,因此这会影响我的最终任务。
我有一个容差,比如说 1.20 度的滞后,这就是为什么我对我的信号有详细的了解,并且想观察我的信号是否有一些变化意味着我的信号是否发生了偏移、延迟、降低。这不仅会让我知道是减少用于我的任务的传感器数量,还是对传感器的硬件进行一些更改以减少滞后量或采取其他措施来减少它。
到目前为止我做了什么,我不确定我是对还是错。我得到了一些滞后值,但我对我正在使用的一种技术几乎没有疑问。如果有人向我提供有关如何改进此技术或为我提供更好方法的想法,那将是很好的指导。
我有一个理想的传感器信号(在我们想要的理想条件下)和来自 1 个传感器的值我有来自汽车的 6 个不同驱动器的数据。我只是在解释我的第一个驱动器的一个示例及其与我的参考传感器数据的关系。
给定大小为 1x1626100 和 1 x 1626100 的数据参考信号和传感器信号数据,对于来自传感器的一个读数,但在从理想信号和测量信号 w.r.t 到时间的所有读数中都是相同的。
简而言之,我想找出传感器信号与测量信号的滞后差异。
在这个方法中,我应用了回归线技术(在差异信号的上下值上)。
我对我的信号进行了区分(Ref – 对信号施加限制后的信号测量值)。
应用回归技术,我自己在差值信号的上方和下方设置一个阈值,分别在上限值和下限值上,上限值和下限值回归线之间的差异称为滞后(损失)。请查看图 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
您可以尝试 k-means algorithm 的一维版本。 k-means 将数据集分成 k 组(称为簇) - 在你的情况下 k = 3 (中点,上点,下点) - 就它们的接近程度而言彼此。
可以使用Matlab提供的kmeans()函数。这是 2D 版本 AFAIK,但您可以通过将每个点的第一个(即时间)坐标设置为 0 来降低问题的维度,只留下 "y"(即信号)值。
在 k-means 完成后 select 点,其平均值是最低和最高的,这会给你高点和低点。您可以使用此版本的函数获取每个集群的方法(请参阅链接文档):
[idx,C] = kmeans(___)
矩阵C将包含均值,idx显示哪个点属于哪个集合(簇)。
然后将线拟合到您选择的点集。
我正在研究测量方向盘绝对角度的方向盘角度传感器。由于转向角传感器使用完全与硬件相关的齿轮和多个接头,因此尽管校准开始时由于使用机械部件以及由于某些环境和道路条件而随着时间的推移传感器值会出现一些错误(例如偏移、相变、信号平坦化、延迟)。
简而言之,由于测量中的这些错误,我们的目标会分心意味着如果我正在查看速度与时间曲线,那么如果在原始或校准传感器中接近理想条件传感器,我的速度显示振幅峰值但由于测量信号中的误差(滞后),我没有在速度曲线上达到峰值,或者我正在使曲线变平,因此这会影响我的最终任务。
我有一个容差,比如说 1.20 度的滞后,这就是为什么我对我的信号有详细的了解,并且想观察我的信号是否有一些变化意味着我的信号是否发生了偏移、延迟、降低。这不仅会让我知道是减少用于我的任务的传感器数量,还是对传感器的硬件进行一些更改以减少滞后量或采取其他措施来减少它。
到目前为止我做了什么,我不确定我是对还是错。我得到了一些滞后值,但我对我正在使用的一种技术几乎没有疑问。如果有人向我提供有关如何改进此技术或为我提供更好方法的想法,那将是很好的指导。
我有一个理想的传感器信号(在我们想要的理想条件下)和来自 1 个传感器的值我有来自汽车的 6 个不同驱动器的数据。我只是在解释我的第一个驱动器的一个示例及其与我的参考传感器数据的关系。
给定大小为 1x1626100 和 1 x 1626100 的数据参考信号和传感器信号数据,对于来自传感器的一个读数,但在从理想信号和测量信号 w.r.t 到时间的所有读数中都是相同的。
简而言之,我想找出传感器信号与测量信号的滞后差异。
在这个方法中,我应用了回归线技术(在差异信号的上下值上)。
我对我的信号进行了区分(Ref – 对信号施加限制后的信号测量值)。
应用回归技术,我自己在差值信号的上方和下方设置一个阈值,分别在上限值和下限值上,上限值和下限值回归线之间的差异称为滞后(损失)。请查看图 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
您可以尝试 k-means algorithm 的一维版本。 k-means 将数据集分成 k 组(称为簇) - 在你的情况下 k = 3 (中点,上点,下点) - 就它们的接近程度而言彼此。
可以使用Matlab提供的kmeans()函数。这是 2D 版本 AFAIK,但您可以通过将每个点的第一个(即时间)坐标设置为 0 来降低问题的维度,只留下 "y"(即信号)值。
在 k-means 完成后 select 点,其平均值是最低和最高的,这会给你高点和低点。您可以使用此版本的函数获取每个集群的方法(请参阅链接文档):
[idx,C] = kmeans(___)
矩阵C将包含均值,idx显示哪个点属于哪个集合(簇)。
然后将线拟合到您选择的点集。