Phân biệt vị trí bằng từ trường trái đất

Nguyễn Hải Châu (nhchau@gmail.com)
Trường Đại học Công nghệ, ĐHQGHN

Đọc dữ liệu từ file CSV, hạn chế cột, xem cấu trúc

t1 <- read.csv('xemay.csv')
t1 <- t1[,c('datetime', 'wmagx', 'wmagy', 'wmagz')]
t1$datetime <- as.POSIXct(strptime(as.character(t1$datetime), "%a %Y.%m.%d %H:%M:%S"))
str(t1)
## 'data.frame':    87 obs. of  4 variables:
##  $ datetime: POSIXct, format: "2016-04-21 15:32:44" "2016-04-21 15:32:46" ...
##  $ wmagx   : num  2.24e-07 2.98e-08 5.81e-07 3.43e-07 -3.28e-07 ...
##  $ wmagy   : num  35.4 35.5 35.6 35.7 35.8 ...
##  $ wmagz   : num  -25.1 -24.6 -24.4 -24.2 -24 ...

Thêm cột vào data.frame

t1 <- cbind(t1, pos="xemay")
str(t1)
## 'data.frame':    87 obs. of  5 variables:
##  $ datetime: POSIXct, format: "2016-04-21 15:32:44" "2016-04-21 15:32:46" ...
##  $ wmagx   : num  2.24e-07 2.98e-08 5.81e-07 3.43e-07 -3.28e-07 ...
##  $ wmagy   : num  35.4 35.5 35.6 35.7 35.8 ...
##  $ wmagz   : num  -25.1 -24.6 -24.4 -24.2 -24 ...
##  $ pos     : Factor w/ 1 level "xemay": 1 1 1 1 1 1 1 1 1 1 ...

Đọc các file dữ liệu khác và ghép dữ liệu

t2 <- read.csv('ban1.csv')
t2$datetime <- as.POSIXct(strptime(as.character(t2$datetime), "%a %Y.%m.%d %H:%M:%S"))
t2 <- t2[,c('datetime', 'wmagx', 'wmagy', 'wmagz')]
t2 <- cbind(t2, pos="ban1")
t3 <- read.csv('ban2.csv')
t3$datetime <- as.POSIXct(strptime(as.character(t3$datetime), "%a %Y.%m.%d %H:%M:%S"))
t3 <- t3[,c('datetime', 'wmagx', 'wmagy', 'wmagz')]
t3 <- cbind(t3, pos="ban2")
tt <- rbind(t1, t2, t3)
str(tt)
## 'data.frame':    391 obs. of  5 variables:
##  $ datetime: POSIXct, format: "2016-04-21 15:32:44" "2016-04-21 15:32:46" ...
##  $ wmagx   : num  2.24e-07 2.98e-08 5.81e-07 3.43e-07 -3.28e-07 ...
##  $ wmagy   : num  35.4 35.5 35.6 35.7 35.8 ...
##  $ wmagz   : num  -25.1 -24.6 -24.4 -24.2 -24 ...
##  $ pos     : Factor w/ 3 levels "xemay","ban1",..: 1 1 1 1 1 1 1 1 1 1 ...

Xem dữ liệu đã ghép

head(tt)
##              datetime         wmagx    wmagy     wmagz   pos
## 1 2016-04-21 15:32:44  2.235174e-07 35.41002 -25.13505 xemay
## 2 2016-04-21 15:32:46  2.980232e-08 35.45082 -24.62355 xemay
## 3 2016-04-21 15:32:47  5.811453e-07 35.60850 -24.39498 xemay
## 4 2016-04-21 15:32:48  3.427267e-07 35.73122 -24.21489 xemay
## 5 2016-04-21 15:32:49 -3.278255e-07 35.84945 -24.03948 xemay
## 6 2016-04-21 15:32:50 -2.682209e-07 35.97459 -23.85183 xemay

Khảo sát dữ liệu

  • Có 3 kiểu dữ liệu:
    • Date/time
    • Numeric
    • Factor

Dữ liệu factor

table(tt$pos)
## 
## xemay  ban1  ban2 
##    87    71   233

Median và percentile

  • \(n\) percentile của một biến là giá trị nằm ở vị trí \(n\%\) của các giá trị của biến khi được sắp xếp tăng dần.
  • \(median\) của một biến = 50% percentile
w <- c(-9, 4, 8, 5, -1, 2, 3, 3, 10)
median(w)
## [1] 3
quantile(w, c(0.25, 0.5, 0.75))
## 25% 50% 75% 
##   2   3   5

Biểu đồ hộp boxplot

boxplot(w, main="Box-and-Whisker plot", ylab="w")

plot of chunk unnamed-chunk-7

Dữ liệu numeric

boxplot(tt$wmagx ~ tt$pos, main="So sánh thành phần x của từ trường", xlab="Vị trí", ylab="x")

plot of chunk unnamed-chunk-8

Dữ liệu numeric

par(mfrow=c(1,2))
boxplot(tt$wmagy ~ tt$pos, main="So sánh thành phần y của từ trường", xlab="Vị trí", ylab="y")
boxplot(tt$wmagz ~ tt$pos, main="So sánh thành phần z của từ trường", xlab="Vị trí", ylab="z")

plot of chunk unnamed-chunk-9

Giá trị x, y, z có khác nhau về thống kê?

  • Sử dụng ANOVA (Analysis of Variance)
fit1 <- lm(data=tt, wmagx~pos)
fit2 <- lm(data=tt, wmagy~pos)
fit3 <- lm(data=tt, wmagz~pos)

Thành phần \(x\)

summary(fit1)
## 
## Call:
## lm(formula = wmagx ~ pos, data = tt)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -3.275e-06 -3.388e-07  1.100e-08  3.063e-07  3.245e-06 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  6.509e-09  8.940e-08   0.073   0.9420  
## posban1     -2.614e-07  1.334e-07  -1.960   0.0507 .
## posban2     -1.001e-08  1.048e-07  -0.096   0.9239  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.339e-07 on 388 degrees of freedom
## Multiple R-squared:  0.01374,    Adjusted R-squared:  0.008656 
## F-statistic: 2.703 on 2 and 388 DF,  p-value: 0.06829

Thành phần \(y\)

summary(fit2)
## 
## Call:
## lm(formula = wmagy ~ pos, data = tt)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -15.0901  -1.5181   0.4514   4.7049  14.2619 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  37.1880     0.7908  47.027  < 2e-16 ***
## posban1      -3.1508     1.1797  -2.671  0.00788 ** 
## posban2      -4.1092     0.9267  -4.434 1.21e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.376 on 388 degrees of freedom
## Multiple R-squared:  0.04829,    Adjusted R-squared:  0.04339 
## F-statistic: 9.844 on 2 and 388 DF,  p-value: 6.758e-05

Thành phần \(z\)

summary(fit3)
## 
## Call:
## lm(formula = wmagz ~ pos, data = tt)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -30.122  -0.935   2.861   4.774  50.179 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -26.744      1.153 -23.185  < 2e-16 ***
## posban1       12.141      1.721   7.056 7.94e-12 ***
## posban2       21.927      1.352  16.221  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 10.76 on 388 degrees of freedom
## Multiple R-squared:  0.4107, Adjusted R-squared:  0.4077 
## F-statistic: 135.2 on 2 and 388 DF,  p-value: < 2.2e-16

Phân biệt các điểm bằng thuật toán KNN

  • KNN = k-nearest neigbours
nr <- nrow(tt)
set.seed(123456)
s1 <- sample(1:nr, 0.6*nr)
head(s1, 10)
##  [1] 312 294 153 133 140  77 206  38 379  65
trainset <- tt[s1,]
testset <- tt[-s1,]

Khảo sát trainset và testset

table(trainset$pos)
## 
## xemay  ban1  ban2 
##    55    41   138
table(testset$pos)
## 
## xemay  ban1  ban2 
##    32    30    95

Thực hiện KNN

library(class)
library(MLmetrics)

result <- knn(trainset[,-c(1,5)], testset[,-c(1,5)], trainset$pos, k=3, prob=FALSE)
head(result, 16)
##  [1] xemay xemay xemay xemay xemay xemay xemay xemay xemay xemay xemay
## [12] xemay xemay xemay xemay xemay
## Levels: xemay ban1 ban2

Tính toán các độ đo

ConfusionMatrix(y_pred=result, y_true=testset$pos)
##        y_pred
## y_true  xemay ban1 ban2
##   xemay    28    3    1
##   ban1      0   30    0
##   ban2      0    1   94
Accuracy(y_pred=result, y_true=testset$pos)
## [1] 0.9681529
Precision(y_pred=result, y_true=testset$pos)
## [1] 1

Công việc tiếp theo

  1. Tiếp tục thu thập dữ liệu đến hết tháng 9. Toàn bộ dữ liệu thu thập trong tháng 9 sẽ được dùng làm dữ liệu train
  2. Trong tháng 10 tiến hành thu thập dữ liệu lần 2 để làm dữ liệu test
  3. Sử dụng thuật toán KNN để phân biệt các điểm P, tính toán độ chính xác: ConfusionMatrix, Accuracy, Precision
  4. Với mỗi nhóm:
    • Phân biệt các điểm căn cứ trên dữ liệu riêng của nhóm
    • Phân biệt các điểm căn cứ trên dữ liệu của tất cả các nhóm gộp lại
    • So sánh kết quả
    • Xem xét sự thay đổi của các tham số của KNN đến độ chính xác của kết quả

Yêu cầu kết thúc môn

  1. Viết báo cáo gồm các phần:
    • Tổng quan về định vị trong nhà (IPS) bằng từ trường trái đất
    • Mục tiêu của báo cáo: Thử nghiệm định vị trong nhà bằng thiết bị Android
    • Mô tả thí nghiệm thu thập dữ liệu: Địa điểm, hệ tọa độ, các điểm cần phân biệt (P); (yêu cầu có ảnh chụp hiện trường thu thập dữ liệu) cách thu thập dữ liệu
    • Mô tả việc khảo sát dữ liệu đã thu thập được bao gồm cả tập train và tập test: cấu trúc dữ liệu, các biến... sử dụng thống kê mô tả và đồ thị
    • Tìm hiểu thuật toán KNN: Thuật toán, các tham số, ưu và nhược điểm của KNN
    • Thực hiện thuật toán KNN trên dữ liệu của từng nhóm và trên dữ liệu tổng hợp của tất cả các nhóm, phân tích kết quả
  2. Sản phẩm nộp cho cuối kỳ (max = 9 điểm), gửi qua email:
    • Báo cáo
    • 01 file dữ liệu train và 01 file dữ liệu test của từng nhóm (định dạng CSV)

Tùy chọn

  • Khuyến khích các nhóm thực hiện một app đơn giản để phân biệt các điểm tại hiện trường bằng từ trường trái đất (+1 điểm)
  • Mô tả ứng dụng trong báo cáo và URL để tải xuống và chạy thử