Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
»ùÓÚÖÇÄÜÊÖ»ú´«¸ÐÆ÷Êý¾ÝµÄÈËÀàÐÐΪʶ±ð
 
À´Ô´£º InfoQ ·¢²¼ÓÚ£º 2017-6-2
  5790  次浏览      29
 

ÈËÀàÐÐΪʶ±ðµÄÄ¿µÄÊÇͨ¹ýһϵÁеĹ۲죬¶ÔÈËÀàµÄ¶¯×÷ÀàÐÍ¡¢ÐÐΪģʽ½øÐзÖÎöºÍʶ±ð£¬²¢Ê¹ÓÃ×ÔÈ»ÓïÑԵȷ½Ê½¶ÔÆä½øÐÐÃèÊöµÄ¼ÆËã»ú¼¼Êõ¡£ÓÉÓÚÈËÀàÐÐΪµÄ¸´ÔÓÐԺͶàÑùÐÔ£¬ÍùÍùʶ±ð³öµÄ½á¹ûÊǶàÑùÐԵ쬲¢ÇÒÁ¬´ø×ÅÐÐΪÀàÐ͵ĸÅÂÊÊä³öµÄ¡£Ëæ×ÅÐÅÏ¢¼¼ÊõµÄ·¢Õ¹£¬¸÷ÖÖÒÆ¶¯É豸ºÍ¿É´©´÷É豸ÕýÔÚÒÔ¼ÓËٶȵķ½Ê½Ôö³¤£¬ÆäÐÔÄܺÍǶÈëµÄ´«¸ÐÆ÷Ò²±äµÄ¶àÑù»¯£¬ÀýÈ磺¸ßÇåÏà»ú¡¢¹â´«¸ÐÆ÷¡¢ÍÓÂÝÒÇ´«¸ÐÆ÷¡¢¼ÓËÙ¶È´«¸ÐÆ÷¡¢GPSÒÔ¼°Î¶ȴ«¸ÐÆ÷µÈ¡£¸÷ÖÖ¸÷ÑùµÄ´«¸ÐÆ÷¶¼ÔÚʱ¿ÌµÄ¼Ç¼×ÅʹÓÃÕßµÄÐÅÏ¢£¬ÕâЩ¼Ç¼ÐÅÏ¢²»½ö¿ÉÒÔÓÃÓÚÓû§Î»ÖõÄÔ¤²â£¬Ò²¿ÉÒÔ½øÐÐÓû§ÐÐΪµÄʶ±ðµÈ¡£

±¾ÎÄʹÓÃÁËÖÇÄÜÉ豸¼ÓËÙ¶È´«¸ÐÆ÷µÄÊý¾Ý£¬½áºÏÖ§³ÖÏòÁ¿»úµÄÌØÐÔ½øÐÐÈËÀàÐÐΪʶ±ðÄ£Ð͵ÄÉè¼ÆºÍÓ¦Óá£

ÈçÉÏͼËùʾ£¬ÐźÅÊý¾ÝµÄ²É¼¯À´×ÔÓÚǶÈëÔÚÖÇÄÜÊÖ»úÖеļÓËÙ¶È´«¸ÐÆ÷£¬ÊµÑéÑ¡ÓÃÁËÈËÀàÈÕ³£ÐÐΪÖеÄÁùÀà³£¼ûÐÐΪ£¬·Ö±ðΪ£º×ß·¡¢ÂýÅÜ¡¢ÉÏÂ¥ÌÝ¡¢ÏÂÂ¥ÌÝ¡¢×ø¡¢Õ¾Á¢£¬Êý¾ÝÊÕ¼¯ºó£¬¶ÔÊý¾Ý½øÐÐÌØÕ÷³éÈ¡£¬³éÈ¡ºóµÄÌØÕ÷ʹÓÃÖ§³ÖÏòÁ¿»úµÄ·ÖÀ๦ÄܶÔÌØÕ÷½øÐзÖÀ࣬×îºóʶ±ð³öÈËÀàµÄÁùÀàÐÐΪ¡£

¹ØÓÚÖ§³ÖÏòÁ¿»ú£¨SVM£©

Ö§³ÖÏòÁ¿»ú(Support Vector Machine)ÊÇCortesºÍVapnikÓÚ1995ÄêÊ×ÏÈÌá³öµÄ£¬ËüÔÚ½â¾öСÑù±¾¡¢·ÇÏßÐÔ¼°¸ßάģʽʶ±ðÖбíÏÖ³öÐí¶àÌØÓеÄÓÅÊÆ£¬²¢Äܹ»ÍƹãÓ¦Óõ½º¯ÊýÄâºÏµÈÆäËû»úÆ÷ѧϰÎÊÌâÖС£SVMËã·¨ÊÇ»ùÓÚ¼ä¸ô×î´ó»¯µÄÒ»ÖּලѧϰËã·¨£¬°üº¬ÏßÐԺͷÇÏßÐÔÁ½ÖÖÄ£ÐÍ£¬¶ÔÓÚÏßÐÔ²»¿É·ÖÎÊÌ⣬ͨ³£»á¼ÓÈëºËº¯Êý½øÐд¦Àí¡£

Ö§³ÖÏòÁ¿»ú±¾ÖÊÉÏÊÇÒ»¸ö¶þÀà·ÖÀà·½·¨£¬ËüµÄ»ù±¾Ä£ÐÍÊǶ¨ÒåÔÚÌØÕ÷¿Õ¼äÉϵļä¸ô×î´ó»¯µÄÏßÐÔ·ÖÀàÆ÷£¬¼ä¸ô×î´ó»¯Ê¹ËüÓбðÓÚ¸ÐÖª»ú¡£¶ÔÓÚÏßÐÔ¿É·ÖµÄѵÁ·¼¯£¬¸ÐÖª»úµÄ·ÖÀë³¬Æ½ÃæÊDz»Î¨Ò»µÄ£¬»áÓÐÎÞÇî¸ö£¬¶øÖ§³ÖÏòÁ¿»ú»á¶Ô·ÖÀë³¬Æ½ÃæÔö¼ÓÔ¼ÊøÌõ¼þ£¬Ê¹µÃ·ÖÀà³¬Æ½ÃæÎ¨Ò»¡£

¼ÙÉèÎÒÃÇÓÐÒ»×é·ÖÊôÓÚÁ½ÀàµÄ¶þάµã£¬·Ö±ðÓÃÐǺÍÔ²±íʾ£¬ÕâЩµã¿ÉÒÔͨ¹ýÖ±Ï߷ָÎÒÃÇÐèÒªÕÒµ½Ò»Ìõ×îÓŵķָîÏß:

1.ÕÒµ½ÕýÈ·µÄ³¬Æ½Ã棨³¡¾°1£©£ºÕâÀÎÒÃÇÓÐÈý¸ö³¬Æ½Ãæ(A¡¢B¡¢C)£¬ÎÒÃÇÐèÒªÕÒµ½ÕýÈ·µÄ³¬Æ½ÃæÀ´·Ö¸îÐǺÍÔ²£º

ÎÒÃǵÄÄ¿µÄÊÇÑ¡Ôñ¸üºÃµØ·Ö¸îÁ½¸öÀàµÄ³¬Æ½Ã棬Òò´ËÉÏͼÖпÉÒÔ¿´µ½³¬Æ½Ãæ B ÒѾ­Äܹ»Íê³É·Ö¸îµÄ¹¤×÷¡£

2.ÕÒµ½ÕýÈ·µÄ³¬Æ½Ã棨³¡¾°2£©£ºÍ¬ÑùÓÐÈý¸ö³¬Æ½Ãæ(A¡¢B¡¢C)£¬ÎÒÃÇÐèÒªÕÒµ½ÕýÈ·µÄ³¬Æ½ÃæÀ´·Ö¸îÐǺÍÔ²£º

ÉÏͼÖУ¬Õë¶ÔÈÎÒâÒ»¸öÀ࣬×î´ó»¯×î½üµÄÊý¾ÝµãºÍ³¬Æ½ÃæÖ®¼äµÄ¾àÀ뽫ÓÐÖúÓÚÎÒÃÇÑ¡ÔñÕýÈ·µÄ³¬Æ½Ã棬Õâ¸ö¾àÀë³ÆÎª±ß¾à£¬ÈçÏÂͼ£º

¿ÉÒÔ¿´µ½£¬³¬Æ½ÃæC¾àÀëÁ½¸öÀà±ðµÄ±ßÔµ±ÈAºÍB¶¼Òª¸ß£¬Òò´ËÎÒÃǽ«³¬Æ½ÃæC¶¨Îª×îÓŵij¬Æ½Ã档ѡÔñ±ß¾à×î¸ßµÄ³¬Æ½ÃæµÄÁíÒ»¸öÖØÒªµÄÔ­ÒòÊdz°ôÐÔ£¬¼ÙÉèÎÒÃÇÑ¡Ôñ×îµÍ±ß¾àµÄ³¬Æ½Ã棬ÄÇô·ÖÀà½á¹ûµÄ´íÎóÂʽ«»á¼«´óµÄÉý¸ß¡£

3.ÕÒµ½ÕýÈ·µÄ³¬Æ½Ã棨³¡¾°3£©£ºÍ¬ÑùÓÐÈý¸ö³¬Æ½Ãæ(A¡¢B¡¢C)£¬ÎÒÃÇʹÓó¡¾°2µÄ¹æÔòѰÕÒÕýÈ·µÄ³¬Æ½ÃæÀ´·Ö¸îÐǺÍÔ²£º

¿ÉÄÜ¿´µ½ÉÏͼ£¬µÚÒ»Ó¡Ïó×îÓŵij¬Æ½ÃæÊÇB£¬ÒòΪËü±È³¬Æ½ÃæAÓиü¸ßµÄ±ß¾à¡£µ«ÊÇ£¬ÕâÀïÊÇÒ»ÖÖÒâÍâÇé¿ö£¬Ö§³ÖÏòÁ¿»ú»áÑ¡ÔñÔÚ½«±ß¾à×î´ó»¯Ö®Ç°¶ÔÀà½øÐо«È··ÖÀàµÄ³¬Æ½Ãæ¡£ÕâÀ³¬Æ½ÃæB¾ßÓзÖÀàÎó²î£¬³¬Æ½ÃæAÒѾ­ÕýÈ·µÄ·ÖÀ࣬Òò´Ë´ËÇé¿öÏ£¬×îÓų¬Æ½ÃæÔòÊÇA¡£

4.Äܹ»·ÖÀàÁ½¸öÀà±ð£¨³¡¾°4£©£ºÕë¶ÔÀûȺµãÇé¿ö£¬Ñ°ÕÒ×îÓų¬Æ½Ã棺

ÉÏͼÖУ¬Ò»¸öÐdzöÏÖÔÚÁËÔ²ËùÔÚµÄÇøÓòÄÚ£¬´ËÐǿɳÆÎªÀûȺµã¡£µ«ÊÇÖ§³ÖÏòÁ¿»ú¾ßÓкöÂÔÒì³£µã²¢ÕÒµ½¾ßÓÐ×î´ó±ß¾àµÄ³¬Æ½ÃæµÄÌØÕ÷£¬Òò´Ë£¬¿ÉÒÔ˵£¬Ö§³ÖÏòÁ¿»úÊdz°ôÐԵġ£×îÖÕ×îÓų¬Æ½ÃæÈçÏÂͼËùʾ£º

5.ÕÒµ½³¬Æ½Ãæ²¢·ÖÀࣨ³¡¾°5£©£ºÒÔÉϵij¡¾°¾ùÊÇÏßÐÔ³¬Æ½Ãæ¡£ÔÚÏÂÃæµÄ³¡¾°ÖУ¬ÎÒÃÇÎÞ·¨Ö±½ÓÔÚÁ½¸öÀàÖ®¼äÕÒµ½ÏßÐÔ³¬Æ½Ã棬ÄÇô֧³ÖÏòÁ¿»úÈçºÎ·ÖÀàÕâÁ½¸öÀàÄØ£¿

Ö§³ÖÏòÁ¿»ú¿ÉÒÔÇáËɵĽâ¾ö£¬ËüÒýÈëÁËһЩ¸½¼ÓµÄÌØÐÔÀ´½â¾ö´ËÀàÎÊÌâ¡£ÕâÀÎÒÃÇÌí¼ÓÒ»¸öеÄÌØÕ÷¡£ÖØÐ»æÖÆ×ø±êÖáÉϵÄÊý¾ÝµãÈçÏ£º

ÔÚÖ§³ÖÏòÁ¿»úÖУ¬ÒѾ­ºÜÈÝÒ×ÔÚÕâÁ½¸öÀàÖ±½ÓÕÒµ½ÏßÐÔ³¬Æ½ÃæÁË£¬µ«ÊÇ£¬³öÏÖµÄÁíÒ»¸öÖØÒªµÄÎÊÌâÊÇ£¬ÎÒÃÇÊÇ·ñÒªÊÖ¶¯´¦ÀíÕâÑùµÄÎÊÌâÄØ£¿µ±È»²»ÐèÒª£¬ÔÚÖ§³ÖÏòÁ¿»úÖУ¬ÓÐÒ»¸öºËº¯ÊýµÄ¼¼Êõ£¬Ëü»á½«µÍά¿Õ¼äµÄÊäÈëת»»Îª¸ßά¿Õ¼ä£¬ÐγÉÓ³Éä¡£Óɴ˻ὫijЩ²»¿É·ÖµÄÎÊÌâת»»Îª¿É·ÖÎÊÌ⣬Ö÷ÒªÓÃÓÚһЩ·ÇÏßÐÔ·ÖÀàÎÊÌâÖС£

µ±ÎÒÃDz鿴³¡¾°5Öеij¬Æ½ÃæÊÇ£¬¿ÉÄÜ»áÈçÏÂͼËùʾ£º

ÒÔÉϽö½öÊǹØÓÚÖ§³ÖÏòÁ¿»úµÄÒ»µã½éÉÜ£¬Ö§³ÖÏòÁ¿»úÓÐÕ⸴ÔÓµÄËã·¨ÒÔ¼°Í걸µÄÖ¤Ã÷£¬ÕâÀï²»ÔÙÀÛÊö£¬¿É²Î¿¼Support_vector_machine²é¿´Ñ§Ï°¡£

¶ÔÓÚÖ§³ÖÏòÁ¿»úÀ´Ëµ£¬±È½ÏÓÐÃûµÄÀà¿âµ±Êǫ̂Íå´óѧÁÖÖÇÈÊ(LinChih-Jen)½ÌÊÚËù¹¹½¨µÄLIBSVMÀà¿â£¬ÓÉÓÚLIBSVM³ÌÐòС£¬ÔËÓÃÁé»î£¬ÊäÈë²ÎÊýÉÙ£¬²¢ÇÒÊÇ¿ªÔ´µÄ£¬Ò×ÓÚÀ©Õ¹£¬Òò´Ë³ÉΪĿǰӦÓÃ×î¶àµÄÖ§³ÖÏòÁ¿»úµÄ¿â¡£ ÁíÍ⻹ÌṩÁ˶àÖÖÓïÑԵĽӿڣ¬±ãÓÚÔÚ²»Í¬µÄƽ̨ÏÂʹÓ㬱¾ÎÄÖÐʹÓõÄÒ²ÊÇÕâ¸öÀà¿â¡£ ¹ØÓÚMacÏ´ËÀà¿âµÄ±àÒë°²×°£¬Çë²Î¿¼ÎĵµInstall libsvm on Mac OSX£¬±¾ÎÄ»áÔÚMacϽøÐÐѵÁ·Êý¾ÝÔ¤´¦Àí¡¢Ä£ÐÍѵÁ·¡¢²ÎÊýµ÷Óŵȣ¬×îÖյõ½Ä£ÐÍ»áʹÓÃÔÚiOSÏîÄ¿ÖУ¬µ±È»¸ÃÄ£ÐÍÒ²¿ÉÒÔʹÓÃÔÚAndroidÒÔ¼°ÆäËûÈκοÉÒÔʹÓõĵط½¡£

Õë¶ÔÖ§³ÖÏòÁ¿»úÒÔ¼°LIBSVMÏêϸµÄ½éÉÜ£¬¿É²é¿´¹Ù·½¸ø³öµÄÎĵµ£ºPDF

´«¸ÐÆ÷Êý¾Ý¼¯

±¾ÎÄʹÓÃÁË WISDM (Wireless Sensor Data Mining) Lab ʵÑéÊÒ¹«¿ªµÄ Actitracker µÄÊý¾Ý¼¯¡£ WISDM ¹«¿ªÁËÁ½¸öÊý¾Ý¼¯£¬Ò»¸öÊÇÔÚʵÑéÊÒ»·¾³²É¼¯µÄ£»ÁíÒ»¸öÊÇÔÚÕæÊµÊ¹Óó¡¾°Öвɼ¯µÄ£¬ÕâÀïʹÓõÄÊÇʵÑéÊÒ»·¾³²É¼¯µÄÊý¾Ý¡£

1.²âÊԼǼ£º1,098,207 Ìõ

2.²âÊÔÈËÊý£º36 ÈË

3.²ÉÑùƵÂÊ£º20 Hz

4.ÐÐΪÀàÐÍ£º6 ÖÖ

×ß·

ÂýÅÜ

ÉÏÂ¥ÌÝ

ÏÂÂ¥ÌÝ

×ø

Õ¾Á¢

5.´«¸ÐÆ÷ÀàÐÍ£º¼ÓËÙ¶È

6.²âÊÔ³¡¾°£ºÊÖ»ú·ÅÔÚÒ¶µÀïÃæ

Êý¾Ý·ÖÎö

´ÓʵÑéÊҲɼ¯Êý¾ÝÏÂÔØµØÖ·ÏÂÔØÊý¾Ý¼¯Ñ¹Ëõ°ü£¬½âѹºó¿ÉÒÔ¿´µ½ÏÂÃæÕâЩÎļþ£º

readme.txt
WISDM_ar_v1.1_raw_about.txt
WISDM_ar_v1.1_trans_about.txt
WISDM_ar_v1.1_raw.txt
WISDM_ar_v1.1_transformed.arff

ÎÒÃÇÐèÒªµÄÊǰüº¬ RAW Êý¾ÝµÄWISDM_ar_v1.1_raw.txt Îļþ£¬ÆäËûµÄÊÇת»»ºóµÄ»òÕß˵Ã÷Îļþ¡£ÏÈ¿´¿´ÕâЩÊý¾ÝµÄ·Ö²¼Çé¿ö£º

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.metrics import precision _score, recall_score, f1_score, confusion _matrix, roc_curve, auc

if __name__ == "__main__":
column_names = ['user-id', 'activity',

'timestamp', 'x-axis', 'y-axis', 'z-axis']
df = pd.read_csv("WISDM_ar_v1.1_raw.txt

", header=None, names=column_names)
n = 10
print df.head(n)
subject = pd.DataFrame(df["user-id"]

.value_counts(), columns=["Count"])
subject.index.names = ['Subject']
print subject.head(n)
activities = pd.DataFrame(df["activity"]

.value_counts(), columns=["Count"])
activities.index.names = ['Activity']
print activities.head(n)
activity_of_subjects = pd.DataFrame(df

.groupby("user-id")["activity"].

value_counts())
print activity_of_subjects.unstack()

.head(n)
activity_of_subjects.unstack().

plot(kind='bar', stacked=True,

colormap='Blues', title="Distribution")
plt.show()

WISDM_ar_v1.1_raw.txt Îļþ²»ÊǺϷ¨µÄ CSV Îļþ£¬Ã¿ÐкóÃæÓиö ; ºÅ£¬Èç¹ûʹÓà Pandas µÄ read_csv·½·¨Ö±½Ó¼ÓÔØ»á³ö´í£¬ÐèÒªÏȽ«ÕâЩ·ÖºÅÈ«²¿É¾³ý¡£

²é¿´Êý¾Ý¼¯¸÷¸öÐÐΪµÄÕ¼±ÈÇé¿ö£¬»æÖƱýͼÈçÏ£º

¿ÉÒÔ¿´µ½´ËÊý¾Ý¼¯ÊÇÒ»¸ö²»Æ½ºâµÄÊý¾Ý¼¯£¬µ«ÊÇÕâÀïÔÝʱºöÂÔÆä²»Æ½ºâÐÔ¡£

Êý¾ÝÔ¤´¦Àí

ÔÚLIBSVMµÄ¹Ù·½ÎĵµÖпÉÒÔ¿´µ½£¬LIBSVMËùʹÓõÄÊý¾Ý¼¯ÊÇÓÐÑϸñµÄ¸ñʽ¹æ·¶£º

<label> <index1>:<value1> 
<index2>:<value2> ...

<label>£º¶ÔÓÚ·ÖÀàÎÊÌâ´ú±íÑù±¾µÄÀà±ð£¬Ê¹ÓÃÕûÊý±íʾ£¬Ö§³Ö¶à¸öÀà±ð£»¶ÔÓڻعéÎÊÌâ´ú±íÄ¿±ê±äÁ¿£¬¿ÉÒÔÊÇÈÎÒâʵÊý¡£

<index1>:<value1>£º±íÊ¾ÌØÕ÷Ïî¡£ÆäÖÐ <index> ´ú±íÌØÕ÷ÏîµÄ±àºÅ£¬Ê¹ÓÃ´Ó 1 ¿ªÊ¼µÄÕûÊý±íʾ£¬¿ÉÒÔ²»Á¬Ðø£»<value> ´ú±í¸ÃÌØÕ÷Ïî¶ÔÓ¦µÄÌØÕ÷Öµ£¬Ê¹ÓÃʵÊý±íʾ¡£ÔÚʵ¼ÊµÄ²Ù×÷ÖУ¬Èç¹ûÑù±¾È±ÉÙij¸öÌØÕ÷Ï¿ÉÒÔÖ±½ÓÊ¡ÂÔ£¬LIBSVM »á×Ô¶¯°Ñ¸ÃÏîµÄÌØÕ÷Öµ¸³Îª 0¡£

±êÇ©ºÍÿÏîÌØÕ÷Ö®¼äʹÓÿոñ·Ö¸î£¬Ã¿ÐÐÊý¾ÝʹÓÃ\n·Ö¸î¡£

Ö»ÓзûºÏÕâÑù¸ñʽµÄÊý¾Ý£¬²ÅÄܹ»±»LIBSVMʹÓ㬷ñÔò»áÖ±½Ó±¨´í¡£Õâ¶Ô×¼±¸ºÃµÄÊý¾Ý£¬´ËÀà¿â»¹ÌṩÁËÒ»¸ötools/checkdata.pyºË²é¹¤¾ß£¬ÒÔ±ãºË²éÊý¾Ý¼¯ÊÇ·ñ·ûºÏÒªÇó¡£Õë¶ÔÌØÕ÷µÄÌáÈ¡£¬ÎªÁ˼òµ¥£¬ÕâÀï½öÌáÈ¡ÎåÀàÌØÕ÷£º

1.ƽ¾ùÖµ

2.×î´óÖµ

3.×îСֵ

4.·½²î

×éºÏÈýÖáµÄ¼ÓËÙ¶ÈÖµ math.sqrt(math.pow(acc_x, 2)+math.pow(acc_y, 2)+math.pow(acc_z, 2))

Á˽âÁËËùÐèÒªµÄÊý¾Ý¸ñʽºó£¬¿ªÊ¼½øÐÐÊý¾ÝµÄÔ¤´¦Àí£¬²¢×ª»»ÎªËùÐèÒªµÄ¸ñʽÎļþ¡£½ÓÏÂÀ´·Ö±ð½«ÑµÁ·ºÍ²âÊÔÊý¾Ý¼¯½øÐÐÌØÕ÷³éÈ¡²¢°´ÕÕLIBSVMµÄÊý¾Ý¸ñÊ½ÖØ×飬´úÂëÈçÏ£º

import ast
import math
import numpy as np


FEATURE = ("mean", "max", "min",

"std")
STATUS = ("Sitting", "Walking",

"Upstairs", "Downstairs",

"Jogging", "Standing")

def preprocess(file_dir,

Seg_granularity):
gravity_data = []
with open(file_dir) as f:
index = 0
for line in f:
clear_line = line.strip().lstrip

().rstrip(';')
raw_list = clear_line.split(',')
index = index + 1
if len(raw_list) < 5:
continue
status = raw_list[1]
acc_x = float(raw_list[3])
acc_y = float(raw_list[4])
print index
acc_z = float(raw_list[5])

if acc_x == 0 or acc_y == 0

or acc_z == 0:
continue

gravity = math.sqrt(math.pow

(acc_x, 2)+math.pow(acc_y, 2)

+math.pow(acc_z, 2))
gravity_tuple = {"gravity":

gravity, "status": status}
gravity_data.append(gravity_tuple)

# split data sample of gravity
splited_data = []
cur_cluster = []
counter = 0
last_status = gravity_data[0]

["status"]
for gravity_tuple in gravity_data:
if not (counter < Seg_granularity

and gravity_tuple["status"] ==

last_status):
seg_data = {"status": last_status,

"values": cur_cluster}
# print seg_data
splited_data.append(seg_data)
cur_cluster = []
counter = 0
cur_cluster.append(gravity_tuple

["gravity"])
last_status = gravity_tuple["status"]
counter += 1
# compute statistics of gravity data
statistics_data = []
for seg_data in splited_data:
np_values = np.array(seg_data.pop

("values"))
seg_data["max"] = np.amax(np_values)
seg_data["min"] = np.amin(np_values)
seg_data["std"] = np.std(np_values)
seg_data["mean"] = np.mean(np_values)
statistics_data.append(seg_data)
# write statistics result into a

file in format of LibSVM
with open("WISDM_ar_v1.1_raw_svm.

txt", "a") as the_file:
for seg_data in statistics_data:
row = str(STATUS.index(seg_data

["status"])) + " " + \
str(FEATURE.index("mean")) + ":" +

str(seg_data["mean"]) + " " + \
str(FEATURE.index("max")) + ":" +

str(seg_data["max"]) + " " + \
str(FEATURE.index("min")) + ":" +

str(seg_data["min"]) + " " + \
str(FEATURE.index("std")) + ":" +

str(seg_data["std"]) + "\n"
# print row
the_file.write(row)

if __name__ == "__main__":
preprocess("WISDM_ar_v1.1_raw.txt", 100)
pass

³É¹¦×ª»»ºóµÄÊý¾Ý¸ñʽÐÎÈ磺

.
.
.
5 0:9.73098373254 1:10.2899465499 2:9 .30995703535 3:0.129482033438
5 0:9.74517171235 1:10.449291842 2:9. 15706284788 3:0.161143714697
5 0:9.71565678822 1:10.4324206204 2:9. 41070666847 3:0.136704694206
5 0:9.70622803003 1:9.7882020821 2:9. 60614907234 3:0.0322246639852
5 0:9.74443440742 1:10.2915256401 2:9 .28356073929 3:0.165543789197
0 0:9.28177794859 1:9.47500395778 2:8 .92218583084 3:0.0700079500015
0 0:9.27218416165 1:9.40427562335 2:9. 14709243421 3:0.0433805537826
0 0:9.27867211792 1:9.39755287296 2:9 .1369415014 3:0.037533026091
0 0:9.27434585368 1:9.33462907672 2:9 .21453200114 3:0.0263815511773
.
.
.

ÓÉÓÚ¸ÃÊý¾Ý¼¯²¢Î´Çø·ÖѵÁ·ºÍ²âÊÔÊý¾Ý¼¯£¬Òò´ËΪÁË×îÖÕµÄÄ£ÐÍÑéÖ¤£¬Ê×ÏÈÐèÒª·Ö¸î¸ÃÊý¾Ý¼¯ÎªÁ½·Ý£¬·Ö±ð½øÐÐѵÁ·ºÍÄ£ÐÍÑéÖ¤£¬·Ö¸î·½·¨¾ÍʹÓÃ×î¼òµ¥µÄ2\8Ô­Ôò£¬Ê¹ÓÃLIBSVMÌṩµÄ¹¤¾ßtools/subset.py½øÐÐÊý¾Ý·Ö¸î£º

¹¤¾ßʹÓýéÉÜ£º

Usage: subset.py [options] dataset
 subset_size [output1] [output2]

This script randomly selects

a subset of the dataset.

options:
-s method : method of selection (default 0)
0 -- stratified selection

(classification only)
1 -- random selection

output1 : the subset (optional)
output2 : rest of the data (optional)
If output1 is omitted, the subset

will be printed on the screen.

 

ʹÓù¤¾ß½øÐÐÊý¾Ý·Ö¸î£º

python subset.py -s 0 WISDM_ar_v1.1_raw
_svm.txt 2190 raw_test.txt raw_train.txt

!! ×¢Òâ !!

ÉÏÃæ´úÂë¶ÎÖеÄ2190¾ÍÊÇsubset.py¹¤¾ß×ÓÊý¾Ý¼¯µÄ´óС£¬¸Ã´óС²¢²»ÊÇÎļþµÄ´óС£¬¶øÊǸù¾ÝԭʼÎļþÖеÄÐÐÊý½øÐÐ2\8·ÖºóµÄÐÐÊý¡£subset.py»áËæ»ú³éÈ¡ËùÉèÖÃÐÐÊýµÄÊý¾Ýµ½Ö¸¶¨µÄÎļþÖС£

svm-train -b 1 raw_train.txt 
raw_trained.model

Íê³Éºó£¬ÎÒÃǾ͵õ½ÁËѵÁ·Êý¾Ý¼¯raw_train.txtºÍ²âÊÔÊý¾Ý¼¯raw_test.txt¡£

µ½´Ë£¬ËùÐèҪʹÓõÄÊý¾Ý¼¯ÒѾ­Íêȫת»»ÎªLIBSVMËùÐèÒªµÄ¸ñʽ£¬Èç¹û²»·ÅÐÄÊý¾Ý¸ñʽ£¬¿ÉÒÔʹÓÃtools/checkdata.py¹¤¾ß½øÐмì²é¡£

Ä£ÐÍ´´½¨ÓëѵÁ·

ÔÚ¹ØÓÚÖ§³ÖÏòÁ¿»ú²¿·Ö£¬Èç¹ûÒѾ­ÔÚMacÉϰ²×°ºÃÁËlibsvm£¬ÄÇôÔÚÄãµÄÃüÁîÐй¤¾ßÖÐÊäÈësvm-train£¬¼´¿É¿´µ½´ËÃüÁîµÄʹÓ÷½Ê½ºÍ²ÎÊý˵Ã÷£¬¼ÙÉèÎÒÃÇʹÓÃĬÈϵIJÎÊý½øÐÐÄ£ÐÍѵÁ·£º

svm-train -b 1 raw_train.txt
 raw_trained.model

ÆäÖÐ-b µÄº¬ÒåÊÇprobability_estimates£¬ÊÇ·ñѵÁ·Ò»¸öSVC»òÕßSVRÄ£ÐÍÓÃÓÚ¸ÅÂÊͳ¼Æ£¬ÉèÖÃΪ1£¬ÒÔ±ã×îÖÕµÄÄ£ÐÍÆÀ¹ÀʹÓá£

ѵÁ·¹ý³ÌµÄ¿ÉÄÜ»áÏûºÄÒ»µãʱ¼ä£¬Ö÷ÒªÔÚÓÚËùʹÓõÄѵÁ·Êý¾Ý¼¯µÄ´óС£¬ÑµÁ·Ê±µÄÈÕÖ¾Êä³öÐÎÈ磺

.
.
.
optimization finished, #iter = 403
nu = 0.718897
obj = -478.778647, rho = -0.238736
nSV = 508, nBSV = 493
Total nSV = 508
*
optimization finished, #iter = 454
nu = 0.734417
obj = -491.057723, rho = -0.318206
nSV = 518, nBSV = 507
Total nSV = 518
*
optimization finished, #iter = 469
nu = 0.722888
obj = -604.608449, rho = -0.360926
nSV = 636, nBSV = 622
Total nSV = 4136
.
.
.

ÆäÖУº#iter Êǵü´ú´ÎÊý£¬nu ÊÇÑ¡ÔñµÄºËº¯ÊýÀàÐ͵IJÎÊý£¬obj Ϊ SVM Îļþת»»ÎªµÄ¶þ´Î¹æ»®Çó½âµÃµ½µÄ×îСֵ£¬rho ΪÅоöº¯ÊýµÄÆ«ÖÃÏî b£¬nSV ÊDZê×¼Ö§³ÖÏòÁ¿¸öÊý£¨0 < a[i] < c£©£¬nBSV ÊDZ߽çÉϵÄÖ§³ÖÏòÁ¿¸öÊý£¨a[i] = c£©£¬Total nSV ÊÇÖ§³ÖÏòÁ¿×ܸöÊý¡£

ÕâÑùÎÒÃǾ͵õ½ÁËÄ£ÐÍÎļþraw_trained.model£¬Ê×ÏÈʹÓÃÄãËùÊìϤµÄÎı¾±àÒ빤¾ß´ò¿ª´ËÎļþ£¬ÈÃÎÒÃDz鿴һÏ´ËÎļþÖеÄÄÚÈÝ£º

svm_type c_svc      //ËùÑ¡ÔñµÄ svm 
ÀàÐÍ£¬Ä¬ÈÏΪ c_svc
kernel_type rbf //ѵÁ·²ÉÓÃµÄºË º¯ÊýÀàÐÍ£¬´Ë´¦Îª RBF ºË
gamma 0.333333 //RBF ºËµÄ gamma ϵÊý
nr_class 6 //Àà±ðÊý£¬ ´Ë´¦ÎªÁùÔª·ÖÀàÎÊÌâ
total_sv 4136 //Ö§³Ö ÏòÁ¿×ܸöÊý
rho -0.369589 -0.28443 -0.352834 -0.852275 -0.831555 0.267266 0.158289 -0.777357 -0.725441 -0.271317
-0.856933 -0.798849 -0.807448 -0.746674 -0.360926 //Åоöº¯ÊýµÄÆ«ÖÃÏî b
label 4 1 2 3 0 5 //Àà±ð±êʶ
probA -3.11379 -3.0647 -3.2177 -5. 78365 -5.55416 -2.30133 -2.26373 -6.05582 -5.99505 -1.07317 -4.50318
-4.51436 -4.48257 -4.71033 -1.18804
probB 0.099704 -0.00543388 -0.240146 -0.43331 -1.01639 0.230949 0.342831 -0.249265 -0.817104 -0.0249471
-0.209852 -0.691243 -0.0803133 -0.940074 0.272984
nr_sv 558 1224 880 825 325 324 //ÿ¸öÀàµÄÖ§³ÖÏòÁ¿»úµÄ¸öÊý
SV
//ÒÔÏÂΪ¸÷¸öÀàµÄȨϵÊý ¼°ÏàÓ¦µÄÖ§³ÖÏòÁ¿
1 0 0 0 0 0:14.384883 1:24. 418964 2:2.5636304 3:5.7143112
1 1 1 0 0 0:11.867873 1:23. 548919 2:4.5479318 3:4.5074937
1 0 0 0 0 0:14.647238 1:24. 192184 2:4.0759445 3:5.367968
1 0 0 0 0 0:14.374831 1:24 .286867 2:2.0045062 3:5.5710882
1 0 0 0 0 0:14.099495 1:24 .03442 2:2.42664 3:5.7580063
1 0 0 0 0 0:14.313538 1:25. 393975 2:1.9496137 3:5.6174387
...

µÃµ½Ä£ÐÍÎļþÖ®ºó£¬Ê×ÏÈÒª½øÐеľÍÊÇÄ£Ð͵IJâÊÔÑéÖ¤£¬»¹¼ÇµÃ¿ªÊ¼½øÐÐÊý¾Ý×¼±¸µÄʱºò£¬ÎÒÃÇ·Ö¸îÁËѵÁ·ºÍ²âÊÔÊý¾Ý¼¯Âð£¿ÑµÁ·Êý¾Ý¼¯½øÐÐÁËÄ£Ð͵ÄѵÁ·£¬½ÓÏÂÀ´¾ÍÊDzâÊÔÊý¾Ý¼¯·¢»Ó×÷ÓõÄʱºòÁË¡£

Ñé֤ģÐÍ£¬LIBSVMÌṩÁËÁíÒ»¸öÃüÁî·½·¨svm-predict£¬Ê¹ÓýéÉÜÈç

Usage: svm-predict [options] 
test_file model_file output_file
options:
-b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0);
for one-class SVM only 0 is supported
-q : quiet mode (no outputs)

주

ʹÓòâÊÔÊý¾Ý¼¯½øÐÐÄ£ÐÍÑéÖ¤£º

svm-predict -b 1 raw_test.txt
 raw_trained.model predict.out

Ö´ÐдËÃüÁîºó£¬LIBSVM»á½øÐÐʶ±ðÔ¤²â£¬ÓÉÓÚÎÒÃÇʹÓÃÁË-b 1²ÎÊý£¬Òò´Ë×îÖÕ»áÊä³ö¸÷¸öÀà±ðµÄʶ±ð¸ÅÂʵ½predict.outÎļþÖУ¬²¢ÇÒ»áÊä³öÒ»¸ö×ÜÌåµÄÕýÈ·ÂÊ£º

Accuracy = 78.4932% (1719/2190)
 (classification)

¿ÉÒÔ¿´µ½´ËʱÎÒÃÇѵÁ·µÄÄ£Ð͵Äʶ±ðÕýÈ·ÂÊΪ78.4932%¡£

predict.out ÎļþÄÚÈÝÐÎÈ磺

labels 4 1 2 3 0 5
4 0.996517 0.000246958 0.00128824 0.00123075 0.000414204 0.000303014
4 0.993033 0.000643327 0.00456298 0.00103339 0.000427387 0.000299934
1 0.0117052 0.773946 0.128394 0.0848292 0.00065714 0.0004682
1 0.0135437 0.484226 0.343907 0.156548 0.00105013 0.0007251
1 0.0117977 0.885448 0.0256842 0.0761578 0.000513167 0.000399136
3 0.00581106 0.380545 0.120613 0.490377 0.00179286 0.000861917
1 0.0117571 0.91544 0.0145561 0.0573158 0.000524352 0.000406782
1 0.0122297 0.811546 0.0824789 0.0924932 0.000704449 0.000547972

ÆäÖУ¬µÚÒ»ÐÐΪ±íÍ·£¬µÚÒ»ÁÐÊÇʶ±ð³öµÄÀà±ð±êÇ©£¬ºóÃæÒÀ´Î¸úן÷¸ö±êÇ©µÄʶ±ð¸ÅÂÊ¡£

ÄÇôÎÊÌâÀ´ÁË£¬ÄѵÀÄ£Ð͵Äʶ±ðÕýÈ·ÂʾÍÖ»Äܵ½Õâ¸ö³Ì¶ÈÁËÂð£¿ÎÒÃÇÔٴλعËsvm-trainÃüÁÆäÖÐÓкܶàµÄ²ÎÊýÎÒÃǶ¼Ê¹ÓÃÁËĬÈϵÄÉèÖ㬲¢Ã»ÓнøÐÐÌØ¶¨µÄÉèÖá£Í¨¹ý²é¿´LIBSVM¹Ù·½µÄÎĵµ£¬·¢ÏÖ¾¹È»ÌṩÁ˲ÎÊýѰÓŵŤ¾ßtools/grid.py£¬Í¨¹ý´Ë¹¤¾ß¿ÉÒÔ×Ô¶¯Ñ°ÕÒѵÁ·Êý¾Ý¼¯ÖеÄ×îÓŲÎÊýCϵÊýºÍgammaϵÊý£¬ÒÔÔÚѵÁ·µÄʱºòʹÓ᣾ßÌåÓ÷¨ÈçÏ£º

Usage: grid.py [grid_options] 
[svm_options] dataset

grid_options :
-log2c {begin,end,step | "null"}

: set the range of c (default -5,15,2)
begin,end,step -- c_range = 2^{begin

,...,begin+k*step,...,end}
"null" -- do not grid with c
-log2g {begin,end,step | "null"} :

set the range of g (default 3,-15,-2)
begin,end,step -- g_range = 2^{begin,

...,begin+k*step,...,end}
"null" -- do not grid with g
-v n : n-fold cross validation (default 5)
-svmtrain pathname : set svm

executable path and name
-gnuplot {pathname | "null"} :
pathname -- set gnuplot executable

path and name
"null" -- do not plot
-out {pathname | "null"} :

(default dataset.out)
pathname -- set output file path

and name
"null" -- do not output file
-png pathname : set graphic output

file path and name (default

dataset.png)
-resume [pathname] : resume the grid

task using an existing output

file (default pathname is dataset.out)
This is experimental. Try this

option only if some parameters

have been checked for the SAME data.

svm_options : additional options

for svm-train

ÓÖÊÇÒ»¶ÑµÄ²ÎÊý£¬µ«ÊDz»±Øµ£ÐÄ£¬¶ÔÓÚ³õѧÕßÀ´Ëµ£¬ÕâÀïµÄ´ó²¿·Ö²ÎÊý¶¼¿ÉÒÔ²»ÓÃÉèÖã¬Ö±½ÓʹÓÃĬÈÏÖµ¼´¿É£¬Èç¹ûÄãÐèÒª²é¿´²ÎÊýѰÓŵĹý³Ì£¬»¹ÐèÒª°²×°gnuplot²¢°´ÕÕ¹Ù·½ËµÃ÷ÅäÖá£

python /tools/grid.py -b 1 raw_train.txt

Ö´ÐдËÃüÁîºó£¬»á²»¶ÏµÄÊä³ö²»Í¬µÄCϵÊýºÍgammaϵÊýȡֵÇé¿öϵķÖÀà׼ȷÂÊ£¬²¢ÔÚ×îºóÒ»ÐÐÊä³ö×îÓŵIJÎÊýÑ¡Ôñ£º

... 
[local] 13 -15 73.1217 (best c=8192 .0, g=0.03125, rate=79.3446)
[local] 13 3 72.8477 (best c=8192 .0, g=0.03125, rate=79.3446)
[local] 13 -9 77.8488 (best c=8192 .0, g=0.03125, rate=79.3446)
[local] 13 -3 78.3741 (best c=8192 .0, g=0.03125, rate=79.3446)
8192.0 0.03125 79.3446

²¢ÇÒ»áÔÚµ±Ç°Ä¿Â¼ÏÂÉú³ÉÊä³öÎļþraw_train.txt.outºÍ¶ÔÓ¦µÄͼÐÎÎļþraw_train.txt.png£º

¾­¹ý×îÓŲÎÊýµÄѰÕÒ£¬×îÖÕ¸ø³öÁËCϵÊýΪ8192.0£¬gammaϵÊýΪ0.03125µÄÇé¿öÏ£¬Ä£ÐÍ·ÖÀàµÄ׼ȷÂÊ×î¸ß£¬Îª79.3446¡£

½ÓÏÂÀ´ÎÒÃÇÔÙ´ÎʹÓÃsvm-train·½·¨£¬²¢ÉèÖõ±Ç°×îÓÅCϵÊýÖµºÍgammaϵÊýÖµ£¬ÖØÐÂѵÁ·ÎÒÃǵÄÄ£ÐÍ£º

svm-train -b 1 -c  -g   raw_train.
txt raw_bestP_trained.model

ѵÁ·Íê³Éºó£¬µÃµ½ÐµÄÄ£ÐÍÎļþraw_bestP_trained.model£¬ÔÙ´ÎʹÓòâÊÔÊý¾Ý¼¯½øÐÐÑéÖ¤£º

svm-predict -b 1 raw_test.txt 
raw_bestP_trained.model bestP_predict.out

×îÖÕÊä³ö½á¹ûÈçÏ£º

Accuracy = 79.1324% (1733/2190) 
(classification)

¿ÉÒÔ¿´µ½Ä£Ð͵ÄÔ¤²âÕýÈ·ÂÊÃ÷ÏÔÌáÉýÁ˲»ÉÙ¡£ÉÏÃæµÄ²ÎÊýѰÓŽö½öÊÇʹÓÃÁËĬÈϵIJÎÊý½øÐÐѰÕÒ£¬ÄãÒ²¿ÉÒÔ¼ÌÐø³¢ÊÔÉèÖø÷¸ö²ÎÊý½øÐвÎÊýѰÓÅ£¬ÒÔ½øÒ»²½ÌáÉýÄ£ÐÍʶ±ðÕýÈ·ÂÊ£¬ÕâÀï²»ÔÚ½øÐнøÒ»²½µÄ²ÎÊýѰÓÅ¡£

С½á

¿ÉÒÔ¿´µ½SVM½øÐÐÓû§ÐÐΪʶ±ð£¬¿ÉÒԵõ½½ÏºÃµÄЧ¹û£¬±¾ÎÄÖÐʹÓõÄÊý¾ÝÊÇʵÑéÊÒÊý¾Ý£¬²¢ÇÒÌØÕ÷Ò²½ö½öÌáÈ¡ÁË»ù±¾µÄ¼¸¸ö£¬×¼È·Âʼ´¿É´ïµ½79%ÒÔÉÏ£¬´Ë·½°¸¿ÉÒÔ¼ÌÐø½øÐÐÓÅ»¯£¬Ê¹ÓÃÕæÊµÊÀ½ç²É¼¯µÄÊý¾Ý£¬½øÐиü¼ÓÏêϸµÄÌØÕ÷×¼±¸£¬Ìá¸ßѵÁ·Ê±µÄµü´ú´ÎÊýµÈ£¬½øÐÐÄ£ÐÍÖØÐÂѵÁ·ÓÅ»¯£¬×îÖÕ´ïµ½¸üºÃµÄ·ÖÀàЧ¹û¡£

ÏÂÃæ£¬ÎÒÃǽ«ÔÚiOSƽ̨Ϲ¹½¨Ó¦Ó㬲¢Ê¹ÓÃLIBSVMºÍ±¾ÎÄÖÐѵÁ·ËùµÃµ½µÄÄ£ÐÍ£¬½øÐÐ׼ʵʱÈËÀàÐÐΪʶ±ð¡£

Ç°Ãæ£¬ÎÒÃǼòµ¥½éÉÜÁËÖ§³ÖÏòÁ¿»úÒÔ¼°ÈçºÎʹÓÃLIBSVMÀà¿âºÍ¼ÓËÙ¶È´«¸ÐÆ÷Êý¾Ý½øÐÐÌØÕ÷µÄ³éÈ¡¡¢Ä£Ð͵ÄѵÁ·¡¢²ÎÊýµÄµ÷ÓźÍÄ£Ð͵IJâÊԵȣ¬ÔÚ±¾ÎÄÖУ¬½«Ê¹ÓÃÉÏÆª×îÖյõ½µÄÄ£ÐÍÎļþ£¬ÒÔ¼°LIBSVMÀà¿â£¬ÔÚiOSƽ̨Ϲ¹½¨Ò»¸öÄܹ»Ê¶±ðµ±Ç°¿Í»§¶ËÓû§µÄÐÐΪÀàÐ͵ÄÓ¦Óá£

Ëæ×ÅÒÆ¶¯ÖÕ¶ËÉ豸µÄÐÔÄÜÔ½À´Ô½¸ß£¬Æä¼¯³ÉµÄ´«¸ÐÆ÷É豸ҲԽÀ´Ô½¶à£¬Õì²â¾«¶ÈÔ½À´Ô½¸ßµÄÇé¿ö£¬Ó¦ÓÃÓÚÒÆ¶¯ÖÕ¶ËÉ豸ÉϵĻúÆ÷ѧϰӦÓÃÒ²¶àÁËÆðÀ´¡£ÔÚiOSƽ̨Ï£¬Æ»¹û¹Ù·½µÄºÜ¶àÓ¦ÓÃÖÐÒ²³ÊÏÖ³öÁË»úÆ÷ѧϰµÄÓ°×Ó¡£ÀýÈçiOS 10 ϵͳÖеÄÏà²á£¬Äܹ»½øÐÐÈËÁ³Ê¶±ð²¢½øÐÐÕÕÆ¬µÄ×Ô¶¯·ÖÀà¡¢ÓʼþÖеÄ×Ô¶¯À¬»øÓʼþ¹éÀà¡¢SiriÖÇÄÜÖúÀí¡¢½¡¿µÓ¦ÓÃÖеÄÓû§Ô˶¯ÀàÐÍ·ÖÀàµÈ¡£

Óû§µÄÔ˶¯ÀàÐÍ

ÔÚiOSϵͳµÄ½¡¿µÓ¦ÓÃÖУ¬¿ÉÒÔ¿´µ½ÄãµÄÔËÐÐÀàÐÍ£¬ÆäÖаüº¬ÁËÐÐ×ß¡¢Åܲ½¡¢ÅÀÂ¥ÌÝ¡¢²½Êý¡¢Æï×ÔÐгµµÈÀàÐÍ¡£

ÔÚiOS SDKÖÐÒ²ÌṩÁËÒ»¸öרÓÃÓÚÔ˶¯ÀàÐÍ»ñÈ¡µÄÀàCMMotionActivityManager£¬ÆäÖаüº¬ÁË

stationary 
walking
running
automotive
cycling
unknown

¼¸ÖÖÐÐΪÀàÐÍ£¬µ«ÊÇÔÚʹÓõĹý³ÌÖУ¬¿ÉÄÜ»áÓöµ½µ±Ç°ÐÐΪºÍ´ËÀà¸ø³öµÄ½á¹û²»Ïàͬ»òÕßͬһʱ¿ÌÓж«ÖÐÀàÐ͵ÄÇé¿ö£¬ÕâÀïÒýÓÃÆ»¹û¸ø³öµÄÒ»¶Î½áÂÛ£º

An estimate of the user's activity 
based on the motion of the device.

The activity is exposed as a set

of properties, the properties are not

mutually exclusive.

For example, if you're in a car

stopped at a stop sign the state might

look like:

stationary = YES, walking = NO,

running = NO, automotive = YES

Or a moving vehicle,

stationary = NO, walking = NO,

running = NO, automotive = YES

Or the device could be in motion

but not walking or in a vehicle.

stationary = NO, walking = NO,

running = NO, automotive = NO.

Note in this case all of the

properties are NO.

Òò´ËÓû§ÐÐΪµÄʶ±ð²¢²»ÊÇÑϸñÒâÒåÉϵÄ׼ȷµÄ£¬ÔÚ»úÆ÷ѧϰÁìÓò£¬Ô¤²â¶¼»áÓÐÒ»¸ö¸ÅÂʵÄÊä³ö£¬ÒýÉê³öµÄ¾ÍÊÇÕýÈ·ÂÊ£¬ÕýÈ·ÂÊÒ²ÊÇÆÀ¹ÀÒ»¸ö»úÆ÷ѧϰģÐ͵ıê×¼Ö®Ò»¡£

¹ØÓÚ¼ÓËÙ¶È´«¸ÐÆ÷

Æ»¹ûµÄÒÆ¶¯É豸ÖУ¬¼¯³ÉÁ˶àÖÖ´«¸ÐÆ÷£¬±¾ÎÄËùÑÝʾµÄ½ö½öʹÓüÓËÙ¶È´«¸ÐÆ÷£¬ÄãÒ²¿ÉÒÔÔö¼Ó´«¸ÐÆ÷ÀàÐÍ£¬Ìá¸ßÊý¾ÝµÄά¶ÈµÈ¡£

¼ÓËÙ¶È´«¸ÐÆ÷Êý¾Ý CMAccelerometerData µÄÀàÐÍΪCMAcceleration£¬ÌṩÁËÈýÖá¼ÓËÙ¶ÈÖµ£¬ÈçÏ£º

typedef struct {
double x;
double y;
double z;
} CMAcceleration;
// A structure containing 3-axis acceleration data.

´Ë¼ÓËÙ¶ÈÖµÊǵ±Ç°É豸×ܵļÓËÙ¶ÈÖµ£¬ÏëÒª»ñÈ¡¼ÓËÙ¶È·ÖÁ¿µÄʱºò£¬¿ÉÒÔʹÓÃCMDeviceMotion½øÐлñÈ¡¡£

¹¹½¨iOSÏîÄ¿£¬ÊÕ¼¯´«¸ÐÆ÷Êý¾Ý

ÔÚÉÏÆªÖУ¬ÎÒÃÇÒѾ­ÖªµÀ£¬LIBSVM¾ßÓжàÖÖÓïÑԵĽӿڣ¬ÕâÀïÎÒÃÇÖ±½ÓʹÓÃÆäCÓïÑÔ½Ó¿Ú£¬ÔÚiOSÏîÄ¿Öй¹½¨SVM·ÖÀàÆ÷¡£

1. ´«¸ÐÆ÷Êý¾ÝÊÕ¼¯

Ê×ÏÈÐèÒªÊÕ¼¯¼ÓËÙ¶È´«¸ÐÆ÷Êý¾Ý£¬²¢½øÐÐÊý¾ÝÌØÕ÷³éÈ¡ºÍÊý¾Ý×¼±¸£¬ÒÔ±ãSVMË㷨ʶ±ðʹÓá£ÔÚiOSµÄCoreMotion¿ò¼ÜÖУ¬ÒѾ­ÌṩÁË»ñÈ¡¼ÓËÙ¶È´«¸ÐÆ÷µÄAPI£¬¿ª·¢Õß¿ÉÒÔÖ±½Óµ÷ÓýӿڻñÈ¡¼ÓËÙ¶È´«¸ÐÆ÷Êý¾Ý£º

  CMMotionManager *motionManager 
= [[CMMotionManager alloc] init];
if ([motionManager isAccele rometerAvailable]) {
[motionManager setAccele rometerUpdateInterval:0.02];

startTime = [[NSDate date]

timeIntervalSince1970];
[motionManager startAccelerometer

UpdatesToQueue:[NSOperationQueue

mainQueue] withHandler:^(CMAcce

lerometerData * _Nullable

accelerometerData, NSError

* _Nullable error) {
if (error) {
NSLog(@"%@", error.description);
}else{
[self handleDeviceAcc:accelerometerData];
}
}];
}

2. Êý¾ÝÅúÁ¿»¯´¦Àí

ÎÒÃÇÔÚ±¾ÎÄ¿ªÊ¼½éÉÜѵÁ·Êý¾Ý¼¯µÄʱºò£¬Ìáµ½ÁËÊý¾ÝµÄ²É¼¯ÆµÂÊÊÇ 20 Hz£¬Òò´ËÎÒÃÇÔÚ½øÐÐÊý¾Ý²É¼¯µÄʱºòÒ²ÐèҪͬÑùµÄƵÂÊ£¬²¢ÇÒ½«´«¸ÐÆ÷Êý¾Ý½øÐÐÅúÁ¿»¯´¦Àí£¬ÒÔ±ãÓÚÄ£ÐÍʶ±ðʱ¾ßÓкÏÊÊÊýÁ¿µÄÊý¾Ý¡£

  NSArray *valueArr = @[
@(accelerometerData. acceleration.x * g_value),
@(accelerometerData .acceleration.y * g_value),
@(accelerometerData .acceleration.z * -g_value)];

NSMutableDictionary *sample =

[NSMutableDictionary dictionary];
[sample setValue:currenStatus

forKey:@"status"];
[sample setValue:@"acc" forKey

:@"sensorName"];
[sample setValue:@([self

getTimeStampByMiliSeconds])

forKey:@"timestamp"];
[sample setValue:valueArr

forKey:@"values"];

if (sampleDatas == nil) {
sampleDatas = [NSMutableArray

array];
}

if ([sampleDatas count]

== 256) {
NSArray *readySamples =

[NSArray arrayWithArray:sampleDatas];
sampleDatas = nil;
[self stopMotionAccelerometer];

[self recognitionData:

[readySamples copy]];
}else{
[sampleDatas addObject:sample];
}

3. ÌØÕ÷³éÈ¡

ÔÚ¿ªÊ¼´Ë²½Öè֮ǰ£¬ÎÒÃÇÐèÒªµ¼ÈëLIBSVMµÄÀà¿âµ½ÏîÄ¿¹¤³ÌÖУ¬ÕâÀï½öÐèÒªµ¼Èësvm.hºÍsvm.cppÁ½¸öÎļþ¼´¿É¡£

ÔÚѵÁ·Ä£Ð͵Äʱºò£¬ÎÒÃÇʹÓÃÁËÎåÖÖÌØÕ÷£¬×îÖÕÉú³ÉËùÐèÒªµÄÊý¾Ý¸ñʽ£¬ÕâÀïͬÑù£¬ÎÒÃÇÒ²ÐèÒªÕë¶ÔÊý¾Ý½øÐÐÌØÕ÷ÌáÈ¡£¬²¢ÖØÐÂ×éºÏÊý¾Ý³ÉΪLIBSVMËùÒªÇóµÄÊý¾Ý¸ñʽ£º

 for (NSUInteger index = 0; 
index < [raw_datas count]; index++) {
NSDictionary *jsonObject = raw_datas[index];
NSArray *valuesArray = jsonObject[@"values"];
if (!valuesArray || valuesArray.count <= 0) {
break;
}
id acc_x_num = valuesArray[0];
id acc_y_num = valuesArray[1];
id acc_z_num = valuesArray[2];

acc_x_axis[index] = acc_x_num;
acc_y_axis[index] = acc_y_num;
acc_z_axis[index] = acc_z_num;

gravity[index] = @(sqrt(pow

([acc_x_num doubleValue], 2)

+ pow([acc_y_num doubleValue],

2) + pow([acc_z_num doubleValue], 2)));

}

NSMutableArray *values =

[NSMutableArray array];
/* mean Feature */{
struct svm_node node_x_mean = {0,

[StatisticFeature mean:acc_x_axis]};
NSValue *node_x_mean_value = [NSValue

valueWithBytes:&node_x_mean objCType:

@encode(struct svm_node)];
[values addObject:node_x_mean_value];

struct svm_node node_y_mean = {1,

[StatisticFeature mean:acc_y_axis]};
NSValue *node_y_mean_value = [NSValue

valueWithBytes:&node_y_mean objCType

:@encode(struct svm_node)];
[values addObject:node_y_mean_value];

struct svm_node node_z_mean = {2,

[StatisticFeature mean:acc_z_axis]};
NSValue *node_z_mean_value = [NSValue

valueWithBytes:&node_z_mean objCType

:@encode(struct svm_node)];
[values addObject:node_z_mean_value];

struct svm_node node0 = {3,

[StatisticFeature mean:gravity]};
NSValue *value0 = [NSValue valueWithBytes:&node0 objCType:@encode(struct svm_node)];
[values addObject:value0];
}
/* max Feature */{
struct svm_node node_x_max = {4,

[StatisticFeature max:acc_x_axis]};
NSValue *node_x_max_value = [NSValue

valueWithBytes:&node_x_max objCType

:@encode(struct svm_node)];
[values addObject:node_x_max_value];

struct svm_node node_y_max = {5,

[StatisticFeature max:acc_y_axis]};


NSValue *node_y_max_value = [NSValue

valueWithBytes:&node_y_max objCType

:@encode(struct svm_node)];
[values addObject:node_y_max_value];

struct svm_node node_z_max = {6,

[StatisticFeature max:acc_z_axis]};
NSValue *node_z_max_value = [NSValue

valueWithBytes:&node_z_max objCType

:@encode(struct svm_node)];
[values addObject:node_z_max_value];

struct svm_node node1 = {7, [Statis

ticFeature max:gravity]};
NSValue *value1 = [NSValue valueWithBytes:&node1 objCType:@encode(struct svm_node)];
[values addObject:value1];
}
/* min Feature */{
struct svm_node node_x_min = {8,

[StatisticFeature min:acc_x_axis]};
NSValue *node_x_min_value = [NSValue

valueWithBytes:&node_x_min objCTyp

e:@encode(struct svm_node)];
[values addObject:node_x_min_value];

struct svm_node node_y_min = {9,

[StatisticFeature min:acc_y_axis]};
NSValue *node_y_min_value = [NSValue

valueWithBytes:&node_y_min objCTyp

e:@encode(struct svm_node)];
[values addObject:node_y_min_value];

struct svm_node node_z_min = {10,

[StatisticFeature min:acc_z_axis]};
NSValue *node_z_min_value = [NSValue

valueWithBytes:&node_z_min objCType

:@encode(struct svm_node)];
[values addObject:node_z_min_value];

struct svm_node node2 = {11,

[StatisticFeature min:gravity]};
NSValue *value2 = [NSValue

valueWithBytes:&node2 objCType:

@encode(struct svm_node)];
[values addObject:value2];
}
/* stev Feature */{
struct svm_node node_x_stev = {12,

[StatisticFeature stev:acc_x_axis]};
NSValue *node_x_stev_value = [NSValue

valueWithBytes:&node_x_stev objCType

:@encode(struct svm_node)];
[values addObject:node_x_stev_value];

struct svm_node node_y_stev = {13,

[StatisticFeature stev:acc_y_axis]};
NSValue *node_y_stev_value = [NSValue

valueWithBytes:&node_y_stev objCType:

@encode(struct svm_node)];
[values addObject:node_y_stev_value];

struct svm_node node_z_stev = {14,

[StatisticFeature stev:acc_z_axis]};
NSValue *node_z_stev_value = [NSValue

valueWithBytes:&node_z_stev objCType

:@encode(struct svm_node)];
[values addObject:node_z_stev_value];

struct svm_node node3 = {15,

[StatisticFeature stev:gravity]};
NSValue *value3 = [NSValue

valueWithBytes:&node3 objCType

:@encode(struct svm_node)];
[values addObject:value3];
}

ÕâÀïÐèҪעÒâµÄÊÇ£¬ÌØÕ÷µÄ˳Ðò±ØÐëºÍÄ£ÐÍѵÁ·Ê±ÑµÁ·Êý¾Ý¼¯ÖеÄÌØÕ÷˳ÐòÒ»Ö£¬·ñÔòÔ¤²âµÄ½á¹û½«³öÏÖÑÏÖØµÄÆ«²î¡£

4. µ¼ÈëÄ£ÐÍÎļþ²¢¼ÓÔØ

Íê³ÉÁËÊý¾Ý×¼±¸Ö®ºó£¬ÎÒÃǵ¼Èë֮ǰѵÁ·ºÃµÄÄ£ÐÍÎļþraw_bestP_trained.modelµ½ÏîÄ¿ÖУ¬È»ºóʹÓÃLIBSVMÌṩµÄÄ£ÐͼÓÔØ·½·¨£¬¼ÓÔØÄ£Ð͵½svm_model½á¹¹Ìå¶ÔÏó£º

    struct svm_model * model = 
svm_load_model([model_dir UTF8String]);

if (model == NULL) {
NSLog(@"Can't open model file:

%@",model_dir);
return nil;
}
if (svm_check_probability_model

(model) == 0) {
NSLog(@"Model does not support

probabiliy estimates");
return nil;
}

5. ÐÐΪʶ±ð

LIBSVMÌṩÁ˶à¸ö·½·¨½øÐÐÔ¤²â£¬ÎªÁË×îÖÕ¿´µ½Ô¤²âµÄ¸ÅÂÊ£¬ÎÒÃÇʹÓÃ

double svm_predict_probability
(const struct svm_model *model, 
const struct svm_node *x,
double* prob_estimates);

·½·¨£¬ÔÚÊä³öÔ¤²â½á¹ûµÄʱºò£¬»á´øÓжÔÓ¦µÄ¸ÅÂÊ£º

  //Type of svm model
int svm_type = svm_get_ svm_type(model);
//Count of labels
int nr_class = svm_get _nr_class(model);
//Label of svm model
int *labels = (int *) malloc(nr_class*sizeof(int));
svm_get_labels(model, labels);

// Probability of each

possible label in result
double *prob_estimates =

(double *) malloc(nr_

class*sizeof(double));
// Predicting
// result of prediction including:
// - Most possible label
// - Probability of each

possible label
double label = 0.0;
if (svm_type == C_SVC ||

svm_type == NU_SVC) {
label = svm_predict_probability

(model, X, prob_estimates);
NSLog(@"svm_predict_probability

label: %f",label);
}else{
NSLog(@"svm_type is not support !!!");
return nil;
}

ͨ¹ýÒÔÉϵÄÔ¤²âÖ®ºó£¬×îÖÕµÄÔ¤²â½á¹û¾ÍÊÇlabel£¬²¢ÔÚ»áÔÚprob_estimatesÖÐÊä³ö¸÷¸ö·ÖÀà±êÇ©µÄÔ¤²â¸ÅÂÊ¡£

£¡£¡×¢Òâ £¡£¡

** prob_estimates Öнö½ö»áÊä³ö¸ÅÂÊ£¬²¢²»»áÊä³ö¸ÅÂʺͱêÇ©µÄ¶ÔÓ¦¹ØÏµ¡£prob_estimatesÖеĸÅÂÊ˳ÐòÊǺÍÄ£ÐÍÖеÄÊäÈë±êǩ˳ÐòÒ»Öµģ¬ÐèҪעÒ⣡ **

×îÖÕµÄÔ¤²â½á¹ûÈçÏ£º

label: 4 -- prob: 0.491513 
label: 1 -- prob: 0.285421
label: 2 -- prob: 0.119973
label: 3 -- prob: 0.096848
label: 0 -- prob: 0.002580
label: 5 -- prob: 0.003665

¹ØÓÚÄ£ÐÍµÄÆÀ¹À

·ÖÀàÄ£Ð͵ĶÈÁ¿Óкܶ෽ʽ£¬ÀýÈç»ìÏý¾ØÕó£¨Confusion Matrix£©¡¢ROCÇúÏß¡¢AUCÃæ»ý¡¢Lift£¨ÌáÉý£©ºÍGain£¨ÔöÒæ£©¡¢K-Sͼ¡¢»ùÄáϵÊýµÈ£¬ÕâÀïÎÒÃÇʹÓÃROCÇúÏ߯À¹ÀÎÒÃÇ×îÖյõ½µÄÄ£ÐÍ£¬ÒԲ鿴ģÐ͵ÄÖÊÁ¿£¬×îÖÕµÄROCÇúÏßͼÈçÏ£º

¿ÉÒÔ¿´µ½¸ÃÄ£ÐÍÕë¶ÔijЩÐÐΪµÄʶ±ðÄÜÁ¦½ÏºÃ£¬ÀýÈçÕ¾Á¢¡¢ÂýÅÜ£¬µ«ÊǶÔÁíһЩÐÐΪµÄʶ±ðÈ´²»ÔõôºÃÁË£¬ÀýÈçÏÂÂ¥ÌÝ¡£

×ܽá

¿ÉÒÔ¿´µ½SVMÔÚ·ÖÀàÎÊÌâÉÏÄܹ»ºÜºÃµÄʶ±ðÌØÕ÷½øÐÐÀà±ðÇø·Ö¡£ÓÉÓÚÆª·ùÔ­Òò£¬±¾ÎÄÖв¢Ã»ÓжÔÊý¾ÝµÄÌØÕ÷½øÐиü¼ÓϸÖµÄÑ¡ÔñºÍ³éÈ¡£¬¿ÉÄܻᵼÖÂһЩÐÐΪÀàÐ͵Äʶ±ð²»ÄÜ´ïµ½ÀíÏëµÄЧ¹û£¬µ«ÊÇÏàÐÅÔÚ×ãÁ¿µÄÊý¾ÝÏ£¬½øÐиü¼ÓϸÖµÄÌØÕ÷¹¤³Ìºó£¬ÀûÓÃSVMÔÚ·ÖÀàÄÜÁ¦ÉϵÄÓÅÊÆ£¬Äܹ»¹¹½¨³ö¸ü¼ÓÓÅÐãµÄÈËÀàÐÐΪÀàÐÍʶ±ðµÄÖÇÄÜÓ¦Óá£

   
5790 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

»ùÓÚͼ¾í»ýÍøÂçµÄͼÉî¶Èѧϰ
×Ô¶¯¼ÝÊ»ÖеÄ3DÄ¿±ê¼ì²â
¹¤Òµ»úÆ÷ÈË¿ØÖÆÏµÍ³¼Ü¹¹½éÉÜ
ÏîĿʵս£ºÈçºÎ¹¹½¨ÖªÊ¶Í¼Æ×
 
Ïà¹ØÎĵµ

5GÈ˹¤ÖÇÄÜÎïÁªÍøµÄµäÐÍÓ¦ÓÃ
Éî¶ÈѧϰÔÚ×Ô¶¯¼ÝÊ»ÖеÄÓ¦ÓÃ
ͼÉñ¾­ÍøÂçÔÚ½»²æÑ§¿ÆÁìÓòµÄÓ¦ÓÃÑо¿
ÎÞÈË»úϵͳԭÀí
Ïà¹Ø¿Î³Ì

È˹¤ÖÇÄÜ¡¢»úÆ÷ѧϰ&TensorFlow
»úÆ÷ÈËÈí¼þ¿ª·¢¼¼Êõ
È˹¤ÖÇÄÜ£¬»úÆ÷ѧϰºÍÉî¶Èѧϰ
ͼÏñ´¦ÀíËã·¨·½·¨Óëʵ¼ù