如何使人类 Activity 识别在 Android 中不那么敏感
How to make Human Activity Recognition less sensitive in Android
我正在开发一个 Android 应用程序,它可以识别 activity 我们每 3 秒执行一次的用户(必须设计得如此频繁)(例如静态、步行、运行).我的数据库中有一个 Activity table 递增以下值:
private int activeTime;
private int longestInactivityInterval;
private int currentInactivityInterval;
private int averageInactInterval;
这些在片段中呈现。目前,非常"sensitive"。例如,如果用户是静止的(即躺在他们的床上)并且他们将他们的 phone 从口袋里拉出来,它将识别 activity 就像 "walking"。已识别活动的历史记录如下所示:
static
static
walking
static
static
如何确保这个附带的 "walking" 被识别为 activity 被识别为 "static"。有什么办法可以纠正吗?
这是正在执行 Activity 监控的 class(递增值取决于 activity 被识别的内容。
public class ActivityMonitor implements Observer, IActivityMonitor {
private User mUser;
private IActivityDataManager mDataManager;
public ActivityMonitor(IActivityDataManager dataManager) {
mDataManager = dataManager;
}
@Override
public void update(Observable observable, Object activity) {
monitorActivity(activity);
}
private void monitorActivity(Object activityClass) {
switch ((int) activityClass) {
case 0:
//activity = "walking";
case 1:
//activity = "running";
case 3:
//activity = "cycling";
mDataManager.incActiveTime();
mDataManager.clearCurrentInacInterval();
break;
case 2:
//activity = "static";
mDataManager.incCurrentInacInterval();
break;
}
}
我自己找到了解决问题的方法。我正在使用 apache 的通用 CircularFifoQueue 并将大小设置为 2。
我的解决方案是这样的:
private void monitorActivity(Object activityClass) {
int activityInt = (int) activityClass;
correctionList.add(activityInt);
int correctResult = applyCorrection(activityInt);
if (correctResult == correctionList.size()) {
mDataManager.incActiveTime();
mDataManager.clearCurrentInacInterval();
} else {
mDataManager.incCurrentInacInterval();
}
}
private int applyCorrection(int classInt) {
int count = 0;
for (int item : correctionList) {
if (item == 0 || item == 1 || item == 3) {
count++;
}
}
return count;
}
基本上,它添加了 classInt,它可以是 (0,1,2 or 3) - walking = 0, 运行 = 1, cycling = 3 and static = 2. applyCorrection
方法查看大小为 2 的队列(这起到了因子的作用,2 对我来说非常有用)并对整数进行计数和检查。如果返回的计数 correctResult
是 2,这意味着 activity 肯定是 ACTIVE (1,2,3) 而不是 STATIC (2)。
我正在开发一个 Android 应用程序,它可以识别 activity 我们每 3 秒执行一次的用户(必须设计得如此频繁)(例如静态、步行、运行).我的数据库中有一个 Activity table 递增以下值:
private int activeTime;
private int longestInactivityInterval;
private int currentInactivityInterval;
private int averageInactInterval;
这些在片段中呈现。目前,非常"sensitive"。例如,如果用户是静止的(即躺在他们的床上)并且他们将他们的 phone 从口袋里拉出来,它将识别 activity 就像 "walking"。已识别活动的历史记录如下所示:
static
static
walking
static
static
如何确保这个附带的 "walking" 被识别为 activity 被识别为 "static"。有什么办法可以纠正吗?
这是正在执行 Activity 监控的 class(递增值取决于 activity 被识别的内容。
public class ActivityMonitor implements Observer, IActivityMonitor {
private User mUser;
private IActivityDataManager mDataManager;
public ActivityMonitor(IActivityDataManager dataManager) {
mDataManager = dataManager;
}
@Override
public void update(Observable observable, Object activity) {
monitorActivity(activity);
}
private void monitorActivity(Object activityClass) {
switch ((int) activityClass) {
case 0:
//activity = "walking";
case 1:
//activity = "running";
case 3:
//activity = "cycling";
mDataManager.incActiveTime();
mDataManager.clearCurrentInacInterval();
break;
case 2:
//activity = "static";
mDataManager.incCurrentInacInterval();
break;
}
}
我自己找到了解决问题的方法。我正在使用 apache 的通用 CircularFifoQueue 并将大小设置为 2。
我的解决方案是这样的:
private void monitorActivity(Object activityClass) {
int activityInt = (int) activityClass;
correctionList.add(activityInt);
int correctResult = applyCorrection(activityInt);
if (correctResult == correctionList.size()) {
mDataManager.incActiveTime();
mDataManager.clearCurrentInacInterval();
} else {
mDataManager.incCurrentInacInterval();
}
}
private int applyCorrection(int classInt) {
int count = 0;
for (int item : correctionList) {
if (item == 0 || item == 1 || item == 3) {
count++;
}
}
return count;
}
基本上,它添加了 classInt,它可以是 (0,1,2 or 3) - walking = 0, 运行 = 1, cycling = 3 and static = 2. applyCorrection
方法查看大小为 2 的队列(这起到了因子的作用,2 对我来说非常有用)并对整数进行计数和检查。如果返回的计数 correctResult
是 2,这意味着 activity 肯定是 ACTIVE (1,2,3) 而不是 STATIC (2)。