Upgrade to Pro — share decks privately, control downloads, hide ads and more …

センサーデータをSparkで機械学習してストリーミング処理してみた

 センサーデータをSparkで機械学習してストリーミング処理してみた

Creaters MeetUp #37 で発表したスライドです。
体に装着した加速度センサーの値から、立ち・座り状態の判定を機械学習でリアルタイムに判定してみました。
Apache Sparkを使って機械学習とストリーミングでの判定を行っています。

444e2dcf55cc85538b065d24e10eca35?s=128

Yoshihiro MIYAI

February 20, 2016
Tweet

Transcript

  1. ηϯαʔσʔλΛ4QBSLͰ ػցֶशͯ͠ετϦʔϛϯά ॲཧͯ͠Έͨ $SFBUFST.FFU6Q .JB !NJB@ :PTIJIJSP.*:"*

  2. ΞδΣϯμ

  3. *P5ͱػցֶशͷઆ໌ ࡞ͬͨγεςϜͷ঺հσϞ ֤ίϯϙʔωϯτͷৄࡉͳઆ໌ w &EJTPO w ,JOFTJT w 4QBSL

  4. *P5 ը૾IUUQTqJDLSQE3$+";

  5. *OUFSOFUPG5IJOHT w lϞϊͷΠϯλʔωοτzͱ༁͞ΕΔ w ,FWJO"TIUPOࢯ͕೥ʹఏএ͠ ͨ֓೦ ,FWJO"TIUPO5IBU*OUFSOFUPG5IJOHT5IJOH3'*%+PVSOBM +VO

  6. *OUFSOFUPG5IJOHT 3'*%͓Αͼηϯαʔٕज़ʹΑͬͯɺਓ ͷखΛआΓͣͱ΋ίϯϐϡʔλ͕ݱ࣮ ੈքΛ೺Ѳ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳ Ε͹ɺਓؒͷೝ஌ͷݶքʹґΒͣɺݱ ࣮ੈքʹ͓͚Δແବ΍࿘අΛݮΒ͢͜ ͱ͕Ͱ͖ΔͷͰ͸ͳ͍͔ ,FWJO"TIUPO5IBU*OUFSOFUPG5IJOHT5IJOH3'*%+PVSOBM +VO

  7. *OUFSOFUPG5IJOHT ༷ʑͳ෺͔ΒσʔλΛूΊΔ ݱ࣮ੈքΛσʔλʹམͱ͠ࠐΉ ࠷దԽΛߦ͍ͬͯ͘

  8. Πϯλʔωοτ αʔόʔ σόΠε εϚϗ F 8FC ऩू ஝ੵ ॲཧ ηϯαʔ

    ूܭ ϧʔϧϕʔε ػցֶश
  9. ػցֶश ը૾IUUQTqJDLSQH:-KY

  10. ػցֶश αϯϓϧͨ͠σʔλ͔Β
 ༗༻ͳنଇɾϧʔϧɾ஌ࣝදݱɾ ൑அج४ͳͲΛநग़͢Δٕज़ IUUQTKBXJLJQFEJBPSHXJLJ&"'&"#&"%"&#' ը૾IUUQTqJDLSQC;9R,C

  11. ྫܾఆ໦ ࣨԹ ࣪౓ ΤΞίϯ 0/ ΤΞίϯ 0/ ΤΞίϯ 0'' ˆҎ্

    ˆະຬ ະຬ Ҏ্
  12. ࣨԹ ࣪౓ ΤΞίϯ 0/ ΤΞίϯ 0/ ΤΞίϯ 0'' ˆҎ্ ˆະຬ

    ະຬ Ҏ্ ࣨԹˆ࣪౓ ܾఆͰ͖Δʂ ৽͍͠ঢ়گ
  13. πϦʔΛ࡞Γ͍ͨ ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0'' ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0'' ࣨԹˆ࣪౓ΤΞίϯ0'' ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0/

    ʜ աڈͷσʔλ ࣨԹ ࣪౓ 0/ 0/ 0'' Ͳ͏࡞Δ͔ʁ
  14. ࣨԹ ࣪౓  ˆະຬ ະຬ Ҏ্ πϦʔͷ࡞Γํ ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0'' ࣨԹˆ࣪౓ΤΞίϯ0/

    ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0'' ࣨԹˆ࣪౓ΤΞίϯ0'' ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0/ ʜ աڈͷσʔλ ˆҎ্ 0/ 0''   0/ 0'' 
  15. ࣨԹ ࣪౓  ˆະຬ ະຬ Ҏ্ πϦʔͷ࡞Γํ ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0'' ࣨԹˆ࣪౓ΤΞίϯ0/

    ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0'' ࣨԹˆ࣪౓ΤΞίϯ0'' ࣨԹˆ࣪౓ΤΞίϯ0/ ࣨԹˆ࣪౓ΤΞίϯ0/ ʜ աڈͷσʔλ ˆҎ্ 0/ 0''   0/ 0''  ࠾༻ ภΓͷେ͖͍ม਺ͰࢬΛ࡞͍ͬͯ͘
  16. ࣨԹ ࣪౓ ΤΞίϯ 0/ ΤΞίϯ 0/ ΤΞίϯ 0'' ˆҎ্ ˆະຬ

    ະຬ Ҏ্ πϦʔͷ࡞Γํ
  17. ࣨԹ ࣪౓ ΤΞίϯ 0/ ΤΞίϯ 0/ ΤΞίϯ 0'' ػցֶश αϯϓϧͨ͠σʔλ͔Β


    ༗༻ͳنଇɾϧʔϧɾ஌ࣝදݱɾ ൑அج४ͳͲΛநग़͢Δٕज़ IUUQTKBXJLJQFEJBPSHXJLJ&"'&"#&"%"&#'
  18. ࡞ͬͨγεςϜ

  19. ηϯαʔσʔλ Πϯλʔωοτ ػցֶश

  20. Ճ଎౓ηϯαʔ *OUFM&EJTPO "QBDIF4QBSL .-MJC4USFBNJOH ཱͪ࠲Γ ൑ఆ݁Ռ ग़ྗ "84,JOFTJT

  21. Ͳ͏΍ͬͯ൑ఆ͢Δ͔ Ճ଎౓ηϯαʔʹ͔͔ΔॏྗՃ଎౓ͷํ޲Ͱ ཱͪ࠲Γ͕Θ͔Δ

  22. ମ΁૷ண

  23. ॏྗՃ଎౓Ͱͷ൑ఆ Ճ଎౓ηϯαʔʹ͔͔ΔॏྗՃ଎౓ͷํ޲Ͱ ཱͪ࠲Γ͕Θ͔Δ

  24. Ճ଎౓ηϯαʔ *OUFM&EJTPO "QBDIF4QBSL .-MJC4USFBNJOH ཱͪ࠲Γ ൑ఆ݁Ռ ग़ྗ "84,JOFTJT ػցֶश ܾఆ໦

  25. ֤෦ͷઆ໌

  26. &EJTPO

  27. w 4%ΧʔυαΠζͷίϯϐϡʔλʔ w *OUFM੡ w -JOVY͕ಈ͘

  28. w εϖοΫ w $16ίΞ.)["UPNίΞ w ϝϞϦ(# w 8J'J()[()[

  29. w ηϯαʔͳͲΛ઀ଓ͢Δʹ͸
 ֦ுϘʔυ͕ඞཁ w εΠοναΠΤϯε൛&BHMFU w *0ిѹม׵ճ࿏͕౥ࡌࡁΈ w (SPWFγϦʔζ͕ར༻Մೳ

  30. ϥΠϒϥϦ w NSBB w (1*0 *$ 41* 6"35ͳͲΛѻ͏ w VQN

    w ֤छηϯαʔͳͲΛѻ͏ w ࠓճ࢖͏ηϯαʔ "%9- ΋͋Δ
  31. 1ZUIPOͰͷίʔυྫ import pyupm_adxl345 as adxl345
 
 adxl = adxl345.Adxl345(6) #

    Eaglet board Grove connector is connected to I2C_6
 
 while True:
 # get Acceleration
 adxl.update()
 force = adxl.getAcceleration()
 data = {'X': force[0], 'Y': force[1], 'Z': force[2]}
  32. ,JOFTJT

  33. "84,JOFTJT w σʔλετϦʔϛϯάαʔϏε w σʔλͷૹ৴ w Ұఆ࣌ؒσʔλΛ஝ੵ w ඞཁʹԠͯ͡σʔλΛऔಘ w

    ηϯαʔσʔλΛૹ৴ͯ͠4QBSL͔Β
 ಡΈࠐΉ࣌ͷΩϡʔͱͯ͠ར༻
  34. ,JOFTJTʹૹΔίʔυྫ import boto3
 import json
 
 from socket import gethostname


    
 kinesis = boto3.client('kinesis')
 
 while True:
 # send to Kinesis
 res = kinesis.put_record(
 StreamName=stream_name,
 Data=json.dumps(data),
 PartitionKey=gethostname() # as you like
 )
  35. 4QBSL

  36. "QBDIF4QBSL w େن໛෼ࢄσʔλॲཧϛυϧ΢ΣΞ w ΦϯϝϞϦͰ଎͍ w όονετϦʔϛϯάػցֶश͕ ಉ͡ΞϓϦέʔγϣϯ্Ͱ࣮ߦՄೳ IUUQTQBSLBQBDIFPSH

  37. "QBDIF4QBSL w ػցֶश w 4QBSL.-MJC w ετϦʔϛϯά w 4QBSL4USFBNJOH

  38. 4QBSL.-MJC w ػցֶश༻ͷϥΠϒϥϦ w ճؼɾ൑ผɾ෼ྨͳͲͷख๏͕Ұ௨ Γἧ͍ͬͯΔ IUUQTQBSLBQBDIFPSHEPDTMBUFTUNMMJCHVJEFIUNM WBMNPEFM%FDJTJPO5SFFUSBJO3FHSFTTPS TBNQMF ʜ

     NPEFMQSFEJDU OFX@EBUB
  39. ֶश݁Ռ : 9 ཱͪ ཱͪ ࠲Γ ໿ҎԼ ໿ ΑΓେ͖͍ ໿ҎԼ

    ໿ΑΓେ͖͍
  40. ͓͞Β͍ ͍Βͳ͍৚݅΋͋Δ͕େମ͋ͬͯͦ͏

  41. 4QBSL4USFBNJOH w ετϦʔϛϯάॲཧ w 5$14PDLFU ,BGLB 'MVNF  ,JOFTJT 5XJUUFS

    ;FSP.2 .255 IUUQTQBSLBQBDIFPSHEPDTMBUFTUTUSFBNJOHQSPHSBNNJOHHVJEFIUNM KinesisUtils.createStream(
 ssc,
 "spark-ml-adxl345-from-kinesis",
 streamName,
 "kinesis.ap-northeast-1.amazonaws.com",
 "ap-northeast-1",
 InitialPositionInStream.LATEST,
 Seconds(2),
 StorageLevel.MEMORY_AND_DISK_2
 ).map(s => new String(s))
  42. Ճ଎౓ηϯαʔ *OUFM&EJTPO "QBDIF4QBSL .-MJC4USFBNJOH ཱͪ࠲Γ ൑ఆ݁Ռ ग़ྗ "84,JOFTJT

  43. ·ͱΊ

  44. w *P5ͷσʔλͷྲྀΕΛҰ௨Γମݧ Ͱ͖ΔγεςϜΛ࡞੒ w ηϯαʔσʔλͷػցֶश͸೉͠ ͦ͏͕ͩطଘͷ෺Λ্ख͘࢖͏ͱ ؆୯

  45. ͋Γ͕ͱ͏͍͟͝·ͨ͠ #MPHɿIUUQNJBIBUFOBCMPHKQ 5XJUUFSɿ!NJB@

  46. ղઆɾίʔυ w ղઆهࣄ w IUUQRJJUBDPNNJB@JUFNT BFGGGF w ίʔυ w IUUQTHJUIVCDPNNJBFEJTPOBEYM

    UPLJOFTJT w IUUQTHJUIVCDPNNJBTQBSLNM BEYMGSPNLJOFTJT