Assignment Linear Regression


Programming Excerise 1: Linear Regression

The file structure is as bellow.

ex1.m - Octave/MATLAB script that steps you through the exercise
ex1 multi.m - Octave/MATLAB script for the later parts of the exercise
ex1data1.txt - Dataset for linear regression with one variable
ex1data2.txt - Dataset for linear regression with multiple variables
submit.m - Submission script that sends your solutions to our servers
[] warmUpExercise.m - Simple example function in Octave/MATLAB
[
] plotData.m - Function to display the dataset
[] computeCost.m - Function to compute the cost of linear regression
[
] gradientDescent.m - Function to run gradient descent
[†] computeCostMulti.m - Cost function for multiple variables
[†] gradientDescentMulti.m - Gradient descent for multiple variables
[†] featureNormalize.m - Function to normalize features
[†] normalEqn.m - Function to compute the normal equations

* indicates files you will need to complete
 indicates optional exercises

warmUpExercise.m

This is wam up excerise.
Just make indentity matric 5x5.

open the files and write A=eye(5).
Then submit files to the server.

I am done for firt problem according to instruction of course.

>> warmUpExercise()

ans =

     1     0     0     0     0
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1

>> submit()
== Submitting solutions | Linear Regression with Multiple Variables...
Login (email address): leejaymin@gmail.com
Token: QthyIC5bQxQOPOXf
== 
==                                   Part Name |     Score | Feedback
==                                   --------- |     ----- | --------
==                            Warm-up Exercise |  10 /  10 | Nice work!
==           Computing Cost (for One Variable) |   0 /  40 | 
==         Gradient Descent (for One Variable) |   0 /  50 | 
==                       Feature Normalization |   0 /   0 | 
==     Computing Cost (for Multiple Variables) |   0 /   0 | 
==   Gradient Descent (for Multiple Variables) |   0 /   0 | 
==                            Normal Equations |   0 /   0 | 
==                                   --------------------------------
==                                             |  10 / 100 | 
== 

Linear regression with one variable

Suppose you are the CEO of restaurant franchise and are considering different cities for opning a new branch.

You'd like to use this data to help you select which city to expand to next.

The file ex1data1.txt contains the dataset for our linear regression problem.
The first column is the population of a city and the second column is the profit of a food truck in that city.
A negative value for profit indicates loss.

6.1101,17.592
5.5277,9.1302
8.5186,13.662
7.0032,11.854
5.8598,6.8233
8.3829,11.886
7.4764,4.3483
8.5781,12

2.1 Plotting the Data

plot(x, y, 'rx', 'MarkerSize', 10); % Plot the data
ylabel('Profit in $10,000s'); % Set the y−axis label
xlabel('Population of City in 10,000s'); % Set the x−axis label

2.2 Gradient Descent

In this part, you will fit the linear regression parameters $\theta$ to our dataset using gradient descent.

2.2.1 Update Equations

The objective of linear regression is to minimize the cost function:

$$J(\theta)=\frac{ 1 }{ 2m } \sum_{ i=1 }^{ m }{ ( h_{\theta}(x^{(i)}) - y^{(i)})^{2}}$$

where the hypothesis $h_{\theta}(x)$ given by the linear model

hθ(x) = θT x = θ0 + θ1x1

Recall that the parameters of your model are the θj values. 
These are the values you will adjust to minimize cost J(θ). One way to do this is to use the batch gradient descent algorithm. 
In batch gradient descent, each iteration performs the update

$$\theta_{j} := \theta_{j} - \alpha \frac{1}{m} \sum_{i=1}^{m}{(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)}}$$

(simultaneously update $\theta_{j}$ for all j).

With each step of gradient descent, your parameters \theta_{j} come closer to the optimal values that will achieve the lowest cost $J(\theta)$.

2.2.2 Implementation

In ex1.m, we have already set up the data for linear regression.
In the following lines, we add another dimension to our data to accomodate the $\theta{0}$ intercept term.
We also initialize the initial parameters to 0 and the learning rate alpha to 0.01.

X = [ones(m, 1), data(:,1)]; % Add a column of ones to x
theta = zeros(2, 1); % initialize fitting parameters
iterations = 1500;
alpha = 0.01;

2.2.3 Computing the cost $J(\theta)$
As you perform gradient descent to learn minimize the cost function J(\theta),
it is helpful to monitor the convergence by computing the cost.
In this section, you will implement a function to calculate $J(\theta)$ so you can check the convergence of your gradient descent implementation.

Your next task is to complete the code in the file computeCost.m, which
is a function that computes J(θ). As you are doing this, remember that the
variables X and y are not scalar values, but matrices whose rows represent
the examples from the training set.
Once you have completed the function, the next step in ex1.m will run
computeCost once using θ initialized to zeros, and you will see the cost
printed to the screen.

You should expect to see a cost of 32.07.

solution is as below:

function J = computeCost(X, y, theta)
%COMPUTECOST Compute cost for linear regression
%   J = COMPUTECOST(X, y, theta) computes the cost of using theta as the
%   parameter for linear regression to fit the data points in X and y

% Initialize some useful values
m = length(y); % number of training examples

% You need to return the following variables correctly 
J = 0;

% ====================== YOUR CODE HERE ======================
% Instructions: Compute the cost of a particular choice of theta
%               You should set J to the cost.

J = 1/(2*m) * (X * theta - y)' * (X * theta - y); % vectorized form


% =========================================================================
end

apostrophe means that a matrix will be transposed. 
Finally, above equation is equal to $J(\theta)=\frac{ 1 }{ 2m } \sum_{ i=1 }^{ m }{ ( h_{\theta}(x^{(i)}) - y^{(i)})^{2}}$

If you don't remember vertorized form, below lecture can make you to be getting better understanding.
For full contents, go back to the linear algebra lecuture.

%% =================== Part 3: Gradient descent ===================
fprintf('Running Gradient Descent ...\n')

X = [ones(m, 1), data(:,1)]; % Add a column of ones to x
theta = zeros(2, 1); % initialize fitting parameters

% Some gradient descent settings
iterations = 1500;
alpha = 0.01;

% compute and display initial cost
computeCost(X, y, theta)

The result

>> computeCost(X, y, theta)

ans =

   32.0727

Submit()

>> submit()
== Submitting solutions | Linear Regression with Multiple Variables...
Use token from last successful submission (leejaymin@gmail.com)? (Y/n): Y
== 
==                                   Part Name |     Score | Feedback
==                                   --------- |     ----- | --------
==                            Warm-up Exercise |  10 /  10 | Nice work!
==           Computing Cost (for One Variable) |  40 /  40 | Nice work!
==         Gradient Descent (for One Variable) |   0 /  50 | 
==                       Feature Normalization |   0 /   0 | 
==     Computing Cost (for Multiple Variables) |   0 /   0 | 
==   Gradient Descent (for Multiple Variables) |   0 /   0 | 
==                            Normal Equations |   0 /   0 | 
==                                   --------------------------------
==                                             |  50 / 100 | 

2.2.4 Gradient descent

Next, you will implement gradient descent in the file gradientDescent.m.
The loop structure has been written for you, and you only need to supply the updates to θ within each iteration.

As you program, make sure you understand what you are trying to optimize and what is being updated. 
Keep in mind that the cost J(θ) is parameterized by the vector θ, not X and y. 
That is, we minimize the value of J(θ) by changing the values of the vector θ, not by changing X or y. Refer to the equations in this handout and to the video lectures if you are uncertain.

A good way to verify that gradient descent is working correctly is to look at the value of J(θ) and check that it is decreasing with each step. 
The starter code for gradientDescent.m calls computeCost on every iteration and prints the cost. 
Assuming you have implemented gradient descent and computeCost correctly, your value of J(θ) should never increase, and should converge to a steady value by the end of the algorithm.

After you are finished, ex1.m will use your final parameters to plot the linear fit. 
The result should look something like Figure 2:

Your final values for θ will also be used to make predictions on profits in areas of 35,000 and 70,000 people. 
Note the way that the following lines in ex1.m uses matrix multiplication, rather than explicit summation or looping, to calculate the predictions.
This is an example of code vectorization in
Octave/MATLAB.

predict1 = [1, 3.5] * theta;
predict2 = [1, 7] * theta;
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
%GRADIENTDESCENT Performs gradient descent to learn theta
%   theta = GRADIENTDESENT(X, y, theta, alpha, num_iters) updates theta by 
%   taking num_iters gradient steps with learning rate alpha

% Initialize some useful values
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);

for iter = 1:num_iters

    % ====================== YOUR CODE HERE ======================
    % Instructions: Perform a single gradient step on the parameter vector
    %               theta. 
    %
    % Hint: While debugging, it can be useful to print out the values
    %       of the cost function (computeCost) and gradient here.
    %
    Update = 0;
    for i=1:m,
        Update = Update + alpha/m * (theta' * X(i,:)' - y(i)) *  X(i,:)';
    end

    theta = theta - Update;

    % ============================================================

    % Save the cost J in every iteration    
    J_history(iter) = computeCost(X, y, theta);

end

end

what is meaning of :.
It is that selected all elements.

So, two eqautions are same.
$$\theta_{j} := \theta_{j} - \alpha \frac{1}{m} \sum_{i=1}^{m}{(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)}}$$

    for i=1:m,
        Update = Update + alpha/m * (theta' * X(i,:)' - y(i)) *  X(i,:)';
    end

without loop, we can implement above function using vectorization.

That is as below:

% or a better way
H_theta = X * theta;
grad = (1/m).* x' * (H_theta - y);
theta = theta - alpha .* grad;

submit()

>> submit()
== Submitting solutions | Linear Regression with Multiple Variables...
Use token from last successful submission (leejaymin@gmail.com)? (Y/n): Y
== 
==                                   Part Name |     Score | Feedback
==                                   --------- |     ----- | --------
==                            Warm-up Exercise |  10 /  10 | Nice work!
==           Computing Cost (for One Variable) |  40 /  40 | Nice work!
==         Gradient Descent (for One Variable) |  50 /  50 | Nice work!
==                       Feature Normalization |   0 /   0 | 
==     Computing Cost (for Multiple Variables) |   0 /   0 | 
==   Gradient Descent (for Multiple Variables) |   0 /   0 | 
==                            Normal Equations |   0 /   0 | 
==                                   --------------------------------
==                                             | 100 / 100 | 
== 
>> 


PyCharm을 우분투 14.04설치 하는 방법


https://launchpad.net/~mystic-mirage/+archive/ubuntu/pycharm


There’s a PPA repository for Ubuntu based users that contains both professional (30-day free trial) and community version of PyCharm packages. So far, Ubuntu 15.04, Ubuntu 14.04, Ubuntu 12.04 and their derivatives are supported.


1. To add the PPA, open terminal from the Dash, Launcher, or via Ctrl+Alt+T shortcut keys. When it opens, run command:


sudo add-apt-repository ppa:mystic-mirage/pycharm


2. After adding the PPA, update system package cache and install the IDE via Synaptic Package Manager. Or just run below commands one by one in terminal:


sudo apt-get update

sudo apt-get install pycharm


You may replace last command via sudo apt-get install pycharm-community to install the community version which is free.


3. How to run


pycharm-community


4. Remove Pyharm


# for community edtion

sudo apt-get remove pycharm-community


# for professional version

sudo apt-get remove pycharm


Afterward, use the command below to remove the PPA from the source list:


sudo add-apt-repository --remove ppa:mystic-mirage/pycharm



본인의


텀프로젝트 Github은 아래와 같다.

https://github.com/leejaymin/practical_machine_learning


그리고 작성문서는 아래의 파일과 같다.

급하게 작성하느라 문법적 오류가 많은것으로 판단된다.

작성한지 꽤 된 내용이지만 필요한 사람이 있을것 같아서 이곳에 업로드 한다.



practical_machine_learning.html


practical_machine_learning.Rmd


'MOOC > Practical Machine Learning (r programing)' 카테고리의 다른 글

Certification and Comments  (0) 2015.12.04
Week 04: Regularized Regression  (0) 2015.11.24
Week03: Model based prediction  (0) 2015.11.23
Week03: Boosting  (0) 2015.11.23
Week 03: Random Forests  (0) 2015.11.23


추가적인 의미 부여

능력

추측

요청

허가

의무

충고



<would = wish to> ~하고 싶다.


How who would make a complaint must first do his duty.

불평을 하고자 하는 사람은 우선 자신의 의무부터 다 해야 한다.



<과거 습관> ~하곤 했다.

He would often go fishing with me

그는 어렸을 때 나와 자주 낚시를 가곤했다.



<과거의 강한 거절/거부>

She would not listen to my advice

그녀는 내 충고를 들으려고 하지 않았다.

(기록 보관용) IPython 및 Jupyter를 Window에 설치 및 설정

새로운 버전 Jupyter가 나왔으므로 이것을 사용하자.

IPython Notebook

기존 IPython Notebook 설치명령어는 아래와 같다.
debian 명령어와, pip 둘중 아무거나 하나를 쓰면 된다.

apt-get install ipython-notebook
pip install ipython[notebook]

실행 명령어

ipython notebook

참고사이트: http://opentechschool.github.io/python-data-intro/core/notebook.html

Jupyter와 IPython window에 설치

Window에서 쉽게 IPython을 설치하는 방법은 Anaconda를 이용하는 방법이다.
해당 설치파일을 받아서 install하면 Python 필수 package들과 Jupyter가 모두 설치 된다.

설치하면 자동으로 환경 변수 및 모든게 설정 된다.
아래와 같이 CMD창에 입력하면, IPython console과 Jupyter가 모두 실행되는 것을 볼 수 있다.

IPython Notebook을 Window에서 원격 서버로 설정하는 방법

C:\Users\justin>ipython profile create myipythonserver
[ProfileCreate] Generating default config file: u'C:\\Users\\justin\\.ipython\\p
rofile_myipythonserver\\ipython_config.py'
[ProfileCreate] Generating default config file: u'C:\\Users\\justin\\.ipython\\p
rofile_myipythonserver\\ipython_kernel_config.py'

윈도우에서 c:\Users\username.ipython 폴더에 profile_myipythonserver 폴더가 생성되었음을 알 수 있다. (profile을 삭제하려면 해당 폴더를 삭제하면 된다.) 이 폴더 아래의 파일 ipython_notebook_config.py를 열어 내용을 다음과 같이 수정한다. (주의 python은 대소문자 구별있음)

c=get_config()

c.NotebookApp.ip = 'localhost'                    # 외부접속을 허용하고싶다면 접속가능한 IP리스트
c.NotebookApp.pylab = 'disabled' 'inline'            # 그래프 코드를 창안에서 실행
c.NotebookApp.port = 8888                                 # 원하는 포트번호로 변경
c.NotebookApp.open_browser = True False         # 웹브라우저

웹서버를 통해 외부에서 ipython notebook을 이용할 것이라면 비밀번호 설정이 필요하다.
cmd창에서 ipython에 접속하여 비밀번호를 생성한다

c:\>ipython
... 
In [1]:from IPython.lib import passwd
In [2]:passwd()
Enter password:
Verify password:
Out [2]: 'sha1:~~~~~'
In [3]:exit

참고사이트: 
http://durst.tistory.com/242
https://ipython.org/ipython-doc/3/config/intro.html


markdown 사용법


편집기의 경우


MarkdownPad 2를 사용한다.


code 블럭을 변경하기 위해선


/* CODE
=============================================================================*/

precodett {
  font-size: 12px;
  font-family: Consolas, "Liberation Mono", Courier, monospace;
  
}

codett {
  margin: 0px 0px;
  padding: 1px 5px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px;
  color: #c90000;    
}


의 코드를 수정 한다.

css 문법이며


이곳에서 code, tt에서 padding을 변경하면 순서대로 수직, 수평의 padding 값을 나타낸다.

Missing Value

How do I replace NA values with zeros in R

> m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
> d <- as.data.frame(m)
   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  3 NA  3  7  6  6 10  6   5
2   9  8  9  5 10 NA  2  1  7   2
3   1  1  6  3  6 NA  1  4  1   6
4  NA  4 NA  7 10  2 NA  4  1   8
5   1  2  4 NA  2  6  2  6  7   4
6  NA  3 NA NA 10  2  1 10  8   4
7   4  4  9 10  9  8  9  4 10  NA
8   5  8  3  2  1  4  5  9  4   7
9   3  9 10  1  9  9 10  5  3   3
10  4  2  2  5 NA  9  7  2  5   5

> d[is.na(d)] <- 0

> d
   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  3  0  3  7  6  6 10  6   5
2   9  8  9  5 10  0  2  1  7   2
3   1  1  6  3  6  0  1  4  1   6
4   0  4  0  7 10  2  0  4  1   8
5   1  2  4  0  2  6  2  6  7   4
6   0  3  0  0 10  2  1 10  8   4
7   4  4  9 10  9  8  9  4 10   0
8   5  8  3  2  1  4  5  9  4   7
9   3  9 10  1  9  9 10  5  3   3
10  4  2  2  5  0  9  7  2  5   5

listwise deletion of missing values

# create new dataset without missing data 
newdata <- na.omit(mydata)

na.locf 함수 사용

zoo package에 구현되어 있는 함수이다.

Last Observation Carried Forward

Generic function for replacing each NA with the most recent non-NA prior to it.

x <- c(NA,NA, "A","A", "B","B","B", NA,NA, "C", NA,NA,NA, "A","A","B", NA,NA)
na.locf(x)
x

출력 결과

 [1] "A" "A" "B" "B" "B" "B" "B" "C" "C" "C" "C" "A" "A" "B" "B" "B"

참고 사이트: http://www.cookbook-r.com/Manipulating_data/Filling_in_NAs_with_last_non-NA_value/


ggplot2: 그래픽 라이브러리

RStudio의 리더 Hadley Wickham이 ggplot2도 이끌고 있다.
개인홈페이지
Github 페이지

ggplot2

ggplot2의 Github 주소: https://github.com/hadley/ggplot2

버전에 따른 변경 이력

axis.line.x and axis.line.y work, but not axis.line #1567

2.1.0에서는 axis.line은 동작하지 않는다.

이전 버전에서 axis.line만 사용할 경우 
theme(panel.border = element_blank(), axis.line = element_line(colour="black"))
를 하면 x,y축에만 검정색 선이 생겼었다.

하지만 문제는 border를 공백처리하고 새로 선을 긋는것이기 때문에 새롭게 긋는 element_line이 너무 굵다면 
일부부만 겹치는 문제가 존재 했다.
theme(panel.border = element_blank(), axis.line = element_line(colour="black", size=4))
이러한 문제를 해결하기 위해서 추가적으로 lineend="square"옵션을 사용 했었다.
theme(panel.border = element_blank(), axis.line = element_line(colour="black", size=4, lineend="square"))

새로운 버전에서는 아래와 같이 하나 하나 설정 해줘야 한다.

mytheme <- theme_bw() + 
    theme(panel.border = element_blank(), axis.line.x = element_line(size = 1),
          axis.line.y = element_line(size = 1)) +







'AI > R ggplot2' 카테고리의 다른 글

CDF stat_ecdf  (0) 2016.12.21
R에서 EPS 이미지 생성  (0) 2015.06.16
ggplot2 package를 이용한 Graph 그리기  (0) 2015.02.16
R 그래프 페키지 종류  (0) 2014.11.05

DeepMind's AlphaGo

Whatever the outcome may be, the winner will be humanity. said Schmidt.

Teachning computers to master Go has been kind of a holy grail for artifical intelligence scientists.
There are more possible configurations of the board than there are atoms in the universe, siad Demis Hassabis, CEO of Google DeepMind, which developed AlphaGo.

"Go is the most profound game that mankind has ever devised," Hassabis said. "Go is a game primarily about intuition and feel rather than brute calculation, which is what makes it so hard for computers to play well."

CNN 원문
http://money.cnn.com/2016/03/09/technology/google-deepmind-go/index.html


Caret의 이해

Caret pakcage에 대해서 좀 더 알아 본다.

이전 포스
공식 사이트

Ch.11 Improving Model Performance

트레이닝 조건의 셋의 최적화 지점을 체계적으로 찾아서 모델의 성능을 튜닝하는 방법을 어떻게하면 자동으로 하는지를 배운다.

모델을 하나의 그룹으로 연합시키는 방법이다.

결정 트리의 variant

Tuning Stock Models for Better Performance

Machine Learning 알고리즘을 선택하는 만큼이나,
Parameter를 선택하는 것도 중요하고 어려운 문제이다.
Caret pakcage는 이러한 parameter 튜닝을 쉽게 하기위해서 grid search를 제공 한다.

Parameter tuning
This process of adjusting the model options to identify the best fit is called parameter tuning.

각 모델에서 필요한 파라메터를 바꿔 가면서 모델링을 수행 할 수 있다.

지원하는 모든 모델의 리스트는 아래 URL에서 확인 가능하다.
https://topepo.github.io/caret/modelList.html

특정 모델의 지원 파라메터를 잊었을 경우 아래 명령어로 확인 할 수 있다.

> modelLookup("nb")
  model parameter              label forReg forClass probModel
1    nb        fL Laplace Correction  FALSE     TRUE      TRUE
2    nb usekernel  Distribution Type  FALSE     TRUE      TRUE

Searching a set of cndidate models comprasing a matrix, or gride, of paremter combinations is impractical.
So, only a subset of possibilities is used to construc the grid.
By default, caret searches at most three values for each of the p parameters.
This means that at most $3^p$ cnadidate models will be tested.

하지만 이렇게 default tuning matrix을 쓰는것은 그다지 scientific하지 않다.

튜닝 파라메터를 주고 그중에서 최적의 모델을 선택 할수도 있다.

아래와 같은 코드에서 grid 방식으로 $ 4 \times 4$의 경우의 수가 존재하게 된다.
이것들을 하나하나 적용하면서 가장 정확도가 높은 model을 자동으로 선택하게 된다.
모델의 평가 방식은 10-folds cross validation 방식을 따른다.

set.seed(12358)
library(foreach)
library(caret)
ctrl <- trainControl(method="cv", 10)
grid <- data.frame(.fL=c(0,0,1,1), .usekernel=c(FALSE,TRUE,FALSE,TRUE))
sms_model1 <- train(dfList, factorClassList, method="nb",trControl = ctrl, tuneGrid = grid)

Variable Importance

Variable Importance

two class problems
만약 Model에서 제공해주는 importance 측정 방법이 존재 하지 않는다면
각 predictor의 importance는 filter를 적용해서 평가 되어 질 수 있다.

ROC Curve분석을 각각의 predictor에 적용하게 된다.

trapezoidal rule을 이용해서 ROC curve의 면적을 계산 한다. 그리고 이 면적의 값이variable importance가 된다.

Multi-class problems
각각의 클래스를 분리한다.
그렇게해서 class들간의 쌍을 만든다.

class1 vs class2
class2 vs claass3
이런 형식이다.

이러한 각 class들에 대해서 최대 curve 면적 값을 가지는 것을 variable importance로 규정 한다.

regression

t-value의 기울기 절대치를 이용하거나
R^2를 이용 한다.

Example

sacle=FALSE 이면 정규화를 하지 않는다.
scale=TRUE로 설정하면 0~100 사이의 score로만 표현된다.

varImp(sms_model1, scale=FALSE)

                    Importance
df.title                0.7292
df.hours                0.6968
df.app_name             0.5589
df.recentPhoneUsage     0.5360

filterVarImp

the area under the ROC curve를 각각의 predictor에 대해서 구하고 싶을 경우, filterVarImp를 사용하게 된다.

RocImp <- filterVarImp(x = training[, -ncol(training)], y = training$Class)
RocImp
          M         R
V1 0.6273646 0.6273646
V2 0.5765656 0.5765656
V3 0.5999674 0.5999674
V4 0.6614481 0.6614481
V5 0.6520711 0.6520711
V6 0.5923842 0.5923842

위와 같이 각 feature들을 1개씩 적용 했을 때의 각각의 class에 대한 ROC 면적을 알 수 있다.

Bayes Classifier의 경우 scale을 FALSE로 설정할 경우 varImp와 filterVarImp의 결과는 같게 된다.

VI <- varImp(sms_model1, scale=FALSE)
VI["importance"][[1]][[1]]

RocImp <- filterVarImp(x = dfList[[1]], y = factorClassList[[1]])
RocImp

실행 결과

> RocImp
      FALSE.     TRUE.
X1 0.9085812 0.9085812
X2 0.5491523 0.5491523
X3 0.6975939 0.6975939
X4 0.4907589 0.4907589
X5 0.4425584 0.4425584
X6 0.5000964 0.5000964
X7 0.4230355 0.4230355
X8 0.5114213 0.5114213

> VI["importance"][[1]]
      FALSE.     TRUE.
X1 0.9085812 0.9085812
X2 0.5491523 0.5491523
X3 0.6975939 0.6975939
X4 0.4907589 0.4907589
X5 0.4425584 0.4425584
X6 0.5000964 0.5000964
X7 0.4230355 0.4230355
X8 0.5114213 0.5114213

이전 POST: ROC 정의

그래프 그리기

plot(varImp(sms_model1, scale=FALSE))


병렬화를 통한 연산 성능 향상


성능 측정 방법: system.time과 R profiler

특정함수에 대한 시간만 보고싶으면 간단하게 system.time함수를 이용한다.

아래와 같이 do.call ldply의 성능을 비교한 것이다.
user, sys, elapsed이 세가지 관점으로 시간을 나타내주게 된다.

> ptList <- list(1:100000)
> system.time(do.call(rbind,ptList))
 사용자  시스템 elapsed 
      0       0       0 
> system.time(ldply(ptList,rbind))
 사용자  시스템 elapsed 
   0.17    0.00    0.17

사용자(user): 시간의 경우 프로그램 코드 자체를 R에서 수행한 시간이다.

시스템(sys): 시간의 경우 운영체제(OS)가 대신 작업을 처리하는데 걸린 시간이다. 예를 들면 save()또는 load()함수의 경우 sys 시간이 더 길게 된다. 이는 OS 작업을 통해서 파일 입출력을 수행하기 때문이다.
sys 시간이 크다면 메모리 부족도 의심해 봐야한다. R은 기본적으로 메모리에 모든 오브젝트를 로드하고 처리하므로 만약 메모리가 부족할경우 페이지 폴트가 지속적으로 발생해서 성능저하의 원인이 된다.

경과(elapsed): 시간는 가장 이해하기 쉬운 개념으로 프로그램 시작할 때 시간을 측정해서 끝날 때 종료한 시간 차이이다.

병렬 프로세싱 (doParallel, Window도 가능)

doMC는 내부적으로 fork()를 이용하기 때문에 linux에서 동작 하게 된다.
doParallel는 윈도우에서 사용 할 수 있는 package를 의미한다.

상세 관련 문서 vignette(“gettingstartedParallel”)

doParallel은 내부적으로 multicore, foreach, snow를 사용하기 때문에snow의 기능인 다수의 머신에 클러스터를 구현하는 기능을 제공하므로 doMC보다 더 막강하다고 할 수 있다.

install.packages("doParallel")
library(doParallel)

프로세스의 수 설정

코어의 수를 설정 한다.

registerDoParallel(cores=4)

작업관리자를 보면, Rscript.exe가 존재 하는 것을 알 수 있다.

plyr의 병렬화

{adl}{adl_}ply

형태의 함수들의 도움말을 살펴보면 .parallel 옵션이 있다. 이 옵션 값이 TRUE로 설정 되면
registerDoParallel()을 사용해 설정한 만큼의 프로세스가 동시에 실행되어 데이터를 병렬적으로 처리한다.

foreach의 병렬화

이미 for보다는 apply 계열의 함수가 더 빠르다는 것을 알고 있다.
foreach는 이러한 apply보다 더 빠른 loop연산 함수 이다.
그 이유가 바로 간단한 병렬화를 지원하기 때문이다.

foreach()는 기본적으로 %do를 사용해 실행할 명령의 블록을 지정해야 한다.
만약 foreach()에서 블록 내 명령을 병렬로 수행하고자 한다면registerDoParallel()을 한 뒤 foreach() %do% 대신 %dopar%를 지정하면 된다.

registerDoParallel로 core 수를 결정하면 실행 중인 프로세스 목록에 Rscript.exe라는 프로세스들이 설정한 코어 갯수 만큼 생성된것을 알 수 있다. 반복적으로registerDoParallel을 실행하면 해당 프로세스가 계속해서 늘어나기 때문에 이를 막기 위해서 명시적으로 stopImplicitCluster()를 해주는 것이 좋다.R-session을 종료하면 자동으로 정리해 주긴 하지만 말이다.

foreach는 apply()계열의 함수와 for()를 대체할 수 있는 루프문을 위한 함수 이다.
for문과의 가장 큰 차이는 반환 값이 있다는 점이다. 또한 {}가 아닌 %do%문을 사용해 블록을 지정한다는 점이다.

foreach::foreach(
    ... # 표현식 ex에 넘겨줄 인자
    # .combine은 ex에서의 반환 값을 어떻게 합칠지 지정한다. cbind(컬럼 방향으로 합친 데이터 프레임 반환),
    # rbind(행 방향으로 합친 데이터 프레임 반환), c(벡터로 반환) 등이 그예다. 기본값은 결과를 리스트로 합친다.
    .combine
    %do% ex # ex는 평가할 표현식
)

단순히 foreach만 사용할 경우

system.time(l1 <- rnorm(10000000))

library(foreach)
system.time(l2 <- foreach(i=1:4, .combine = 'c')
            %do% rnorm(2500000))

> system.time(l1 <- rnorm(10000000))
 사용자  시스템 elapsed 
   0.75    0.00    0.75 
> 
> library(foreach)
> system.time(l2 <- foreach(i=1:4, .combine = 'c')
+             %do% rnorm(2500000))
 사용자  시스템 elapsed 
   0.78    0.00    0.78

오히려 속도가 느려지는 것을 알 수 있다.

doParallel과 같이 이용
좀더 차이를 주기위해서 이전 예제보다 10대 갯수를 증가 시켰다.

> system.time(l1 <- rnorm(100000000))
 사용자  시스템 elapsed 
   7.38    0.14    7.55 
> 
> library(foreach)
> system.time(l2 <- foreach(i=1:4, .combine = 'c')
+             %do% rnorm(25000000))
 사용자  시스템 elapsed 
   8.28    0.28    8.58 

> library(doParallel)
> registerDoParallel(cores = 8)
> system.time(l3p <- foreach(i=1:10, .combine = 'c')
+             %dopar% rnorm(10000000))
 사용자  시스템 elapsed 
   1.54    2.25    5.15 
> stopImplicitCluster()

> length(l1)
[1] 100000000
> length(l2)
[1] 100000000
> length(l3p)
[1] 100000000

코어를 8개로 병렬화 했지만 8배까지는 아니고 2배정도 향상된것 같다.
데이터 분할 및 병합 overhead 때문에 발생하는 통상의 문제이다.
또한 i7-processor 특징상 물리적으로는 4-cores 지만 HT기술을 고려해서 논리적으론 8개로 잡았다.

작업이 끝나면 stopImplicitCluster()를 실행해서 closing doParallel cluster를 수행 시켜 주자.

하지만, stopImplicitCluster()을 수행할경우 apply()계열의 함수들이 connection error가 발생 하므로
모든 작업이 끝난 다음에 한번만 호출해 주자.

foreach 기타 옵션들

foreach값이 return하는 list/data.frame에 이름을 부여하고 싶을 경우
.final = function(x) setName(x, names(foo))를 이용한다.
.final은 마지막에 한번만 호출되게 된다.

foo <- list(a = 1, b = 2)
bar <- foreach (x = foo, .final = function(x) setNames(x, names(foo))) %do% {
    x * 2
    }

병렬 프로세싱 (Parallel package, Linux 전용)

set up worker processes that can complete tasks simultaneously.

It does this by including components of the multicore and snow packages, each taking a different approach towards multitasking.

To determine the number of cores your machine has, use the detectCores()function as follows.

An easy way to get started with the multicore functionality is to use themclappy() function, which is a parallel version of lapply().

mclapply {parallel}

mclapply(X, FUN, ..., mc.preschedule = TRUE, mc.set.seed = TRUE,
         mc.silent = FALSE, mc.cores = 1L,
         mc.cleanup = TRUE, mc.allow.recursive = TRUE)

참고자료

http://www.exegetic.biz/blog/2013/08/the-wonders-of-foreach/


위도,경도를 주소로 변환 ggmap package를 이용한 (geocoding and revgeocode in R)


GGMAP package

geocode

geocode함수는 latitude와 longitude를 가지고 location으로 변환 하는것을 말한다.
이것은 Google Map을 이용하게 된다.

Usage

geocode(location, output = c("latlon", "latlona", "more", "all"),
source = c("google", "dsk"), messaging = FALSE, force = ifelse(source ==
"dsk", FALSE, TRUE), sensor = FALSE, override_limit = FALSE,
client = "", signature = "", nameType = c("long", "short"), data)
geocodeQueryCheck(userType = "free")

예제

library(ggmap)

gc <- as.numeric(geocode('Baylor University'))
revgeocode(gc, output = 'more')
revgeocode(gc, output = 'all')

as.numeric(dfLocation[3,])
revgeocode(as.numeric(dfLocation[2:3,]),output = 'more')
revgeocode(latlng,output = 'more')
revgeocode(latlng, ics = 'WGS-84', api = 'google', output = 'address')

data.frame에 기록된 longitude와 latitude를 이용해서 Place로 변환하는 코드이다.

place <- adply(dfLocation, 1,function(x){
    revgeocode(as.numeric(x),output = 'more')
    }
)

test code

Using Google Maps API and R

library(RCurl)
library(RJSONIO)
library(plyr)

url <- function(address, return.call = "json", sensor = "false") {
    root <- "http://maps.google.com/maps/api/geocode/"
    u <- paste(root, return.call, "?address=", address, "&sensor=", sensor, sep = "")
    return(URLencode(u))
}

geoCode <- function(address,verbose=FALSE) {
    if(verbose) cat(address,"\n")
    u <- url(address)
    doc <- getURL(u)
    x <- fromJSON(doc,simplify = FALSE)
    if(x$status=="OK") {
        lat <- x$results[[1]]$geometry$location$lat
        lng <- x$results[[1]]$geometry$location$lng
        location_type  <- x$results[[1]]$geometry$location_type
        formatted_address  <- x$results[[1]]$formatted_address
        return(c(lat, lng, location_type, formatted_address))
        Sys.sleep(0.5)
    } else {
        return(c(NA,NA,NA, NA))
    }
}
address <- geoCode("The White House, Washington, DC")


'AI > R Basic' 카테고리의 다른 글

Missing Value  (0) 2016.03.20
병렬화를 통한 연산 성능 향상 및 성능 측정 방법  (0) 2016.03.06
Do.call()  (0) 2016.02.05
날짜 시간 변환 (Date-Time Conversion Function in R)  (0) 2015.12.14
JSON in R using jsonlite  (0) 2015.12.12

Cross Validation


Ch.10 Evaluating Model Performance
k-fold cross-validation에 대해서 다룬다.

K는 통상 10을 선택 한다.
After the process of training and evaluating the model has occured for 10 times (with 10 different training/testing combinations), the average performance across all the folds is reported.

k가 너무 크면, leave-one-out method 방법이다. 이 방법은 training에 사용할 데이터가 너무 적을 때 사용하는 방법이다.

createFolds

아래의 함수를 이용해서 k-fold를 수행 할 수 있다.

createFolds(y, k = 10, list = TRUE, returnTrain = FALSE)

createFolds를 사용하기 위해서는 입력 y의 타입이 vector type이어야 한다.
그리고 chronological order야만 한다.

# 10-fold cross validation with implementation
set.seed(12358)
folds <- createFolds(dfList_jemin[[2]]$app_name, k = 10, returnTrain = TRUE)

cv_results <- lapply(folds, function(x) {
    training <- data.frame(df[x, ])
    testing <- data.frame(df[-x, ])

    classTraining <- class[x]
    classtesting <-  class[-x]


    sms_model1 <- train(training, classTraining, method="nb")

    credit_pred <- predict(sms_model1, testing)

    cm1 <- confusionMatrix(credit_pred, classtesting, positive="TRUE")

    return(cm1$overall[[1]])
})

str(cv_results)
mean(unlist(cv_results))

실행 결과

> str(cv_results)
List of 10
 $ Fold01: num 0.886
 $ Fold02: num 0.793
 $ Fold03: num 0.788
 $ Fold04: num 0.676
 $ Fold05: num 0.5
 $ Fold06: num 0.719
 $ Fold07: num 0.688
 $ Fold08: num 0.719
 $ Fold09: num 0.788
 $ Fold10: num 0.788
> mean(unlist(cv_results))
[1] 0.7343925

Caret control option을 이용한 방법: trControl=ctrl

caret package의 control 함수를 이용해서도 위의 cross-validation 방법을 수행 할 수 있다.

# 10-fold cross validation  with caret
ctrl <- trainControl(method="cv", 10, verbose = TRUE)

set.seed(12358)
sms_model1 <- train(df,class, method="nb", trControl=ctrl)
sms_model1

실행 결과

Naive Bayes 

325 samples
  1 predictor
  2 classes: 'FALSE', 'TRUE' 

No pre-processing
Resampling: Cross-Validated (10 fold) 
Summary of sample sizes: 292, 293, 293, 292, 292, 292, ... 
Resampling results across tuning parameters:

  usekernel  Accuracy   Kappa      Accuracy SD  Kappa SD 
  FALSE      0.7321481  0.4587484  0.07483437   0.1433968
   TRUE      0.7321481  0.4587484  0.07483437   0.1433968

Tuning parameter 'fL' was held constant at a value of 0
Accuracy was used to select the optimal model using  the largest value.
The final values used for the model were fL = 0 and usekernel = FALSE. 


'AI > Machine Learning with R' 카테고리의 다른 글

Feature Selection with Caret (Auto)  (0) 2016.11.20
Caret의 이해  (0) 2016.03.06
Ensemble method: Bagging (bootstrap aggregating)  (0) 2015.11.19
Bootstrapping  (0) 2015.11.19
Principal Component Analysis (PCA)  (0) 2015.11.18

사전에는 명사적 용법으로만 설명 되어 있지만 동사적 표현으로 많이 사용된다.



영영 사전 


leverage:

use (something) to maximum advantage

-> 최대 이익을 위해 (~을) 이용하다.

use (something valuable) to achieve a desired result

-> 바다라던 결과를 이루기 위해 (가치있는 ~을) 이용하다.


최대한 한국어로 의역하면

`~을 (최대한 잘) 활용하다`

위와 같이 긍정의 의미로 잘 활용한다는 뜻으로 해석될 것 같다.


ex) Leverage phone's resource for wearable

-> phone의 자원을 웨어러블을 위해서 최대한 잘 활용 한다.


'영어 > 영문법' 카테고리의 다른 글

not only but also 와 as well as 사용법 및 차이점  (2) 2016.06.19
조동사 정리  (0) 2016.04.07
복합관계대명사 & 복합관계부사  (0) 2015.07.28
전치사 + 관계대명사  (0) 2015.04.28
efficiently and effectively  (0) 2015.03.02

Do.call()


데이터는 리스트 구조에 담겨져 있다.
이 데이터를 어떤 함수로 전달하고 싶지만 그 함수는 리스트를 인자로 받을 수 없는 구조이다.

해결책
1. 리스트를 벡터로 변환한다.
2. do.call함수로 리스트를 개별 인자들로 분해한 쓰려고 하는 함수에 적용 한다.

do.call(function, list)

예제 아래와 같이 중첩 리스트(nested list)일 경우에 데이터행렬로 변경하기가 골치아프게 된다.

> list <- list(col1 = list (1,2,3), col2 = list(3,4,5), col3 = list(6,7,8))
> list
$col1
$col1[[1]]
[1] 1

$col1[[2]]
[1] 2

$col1[[3]]
[1] 3


$col2
$col2[[1]]
[1] 3

$col2[[2]]
[1] 4

$col2[[3]]
[1] 5


$col3
$col3[[1]]
[1] 6

$col3[[2]]
[1] 7

$col3[[3]]
[1] 8

# cbind를 수행해도 원하는 않는 코드가 생성 된다.
> cbind(list)
     list  
col1 List,3
col2 List,3
col3 List,3


# data.frame()을 수행해도 이상한 결과이다.
> as.data.frame(list)
  col1.1 col1.2 col1.3 col2.3 col2.4 col2.5 col3.6 col3.7 col3.8
1      1      2      3      3      4      5      6      7      8

> unlist(list)
col11 col12 col13 col21 col22 col23 col31 col32 col33 
    1     2     3     3     4     5     6     7     8 

> cbind(unlist(list))
      [,1]
col11    1
col12    2
col13    3
col21    3
col22    4
col23    5
col31    6
col32    7
col33    8

#비로써 적절히 행과 열이 나뉘어서 합쳐지는 것을 볼 수 있다.
> do.call(cbind,list)
     col1 col2 col3
[1,] 1    3    6   
[2,] 2    4    7   
[3,] 3    5    8 


파일 및 이미지 전송 Android 에서 JSP Tomcat6 on uBuntu Server


Multipart는 이미지 전송에 특화된 것이다.
requset 개념과 httpPost 객체 개념이 혼합된 것이다.

1. 안드로이드

MultipartEntity라는 객체를 이용하게 된다. 이 객체는 파일 형식으로 데이터를 보내게 된다.

multipart를 사용하면 쉽게 문자열과 파일들을 묶어서 한번에 전송 할 수 있다.
하지만 안드로이드에서 기본적으로 지원하는 HttpClient에서는 Multipart가 지원되지 않는다.
따라서 Multipart를 사용하기 위해서는 Apache HttpComponents에서 받아야 한다.
하지만 최신 버전 4.5.*는 안드로이드 에서 동작하지 않는다.

필자는 4.3.1을 사용 한다.
httpclienthttpcorehttpmine이 세개가 핵심이다.

해당 코드를 사용해서 구현한 App은 NetworkUsage이다.
하지만, Android 2.3.3에서는 정상적으로 동작 하지만, 5.0에서는 오류가 발생 한다.

코드분석

String sdcard = Environment.getExternalStorageDirectory().getPath();                    
// 파일을 서버로 보내는 부분
try {
    HttpClient client = new DefaultHttpClient(); // httpClient 생성
    String url = "서버주소/실행.jsp";
    HttpPost post = new HttpPost(url); // httpPost 생성

    // FileBody 객체를 이용해서 파일을 받아옴
    File glee = new File(sdcard+"/glee.jpg"); // file 객체 생성
    FileBody bin = new FileBody(glee); // FileBody 생성           

    MultipartEntity multipart = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

    multipart.addPart("images", bin); //실제 파일을 multipart에 넣는다.

    post.setEntity(multipart); // Multipart를 post 형식에 담음
    client.execute(post);   // post 형식의 데이터를 서버로 전달

Deplicate된 것을 사용하지 않고 Builder를 이용하는 방법
4.3이상의 httpmine을 사용할경우 Builder를 사용하라고 지시하게 되어 있다.

@Override
protected String doInBackground(String... params) {
    String sdcard = Environment.getExternalStorageDirectory().getPath();

    // 파일을 서버로 보내는 부분
    HttpClient client = new DefaultHttpClient();    
    HttpPost post = new HttpPost(url);

    File glee = new File(sdcard+"/my.db");  
    FileBody bin = new FileBody(glee);  

    MultipartEntityBuilder meb = MultipartEntityBuilder.create();
    meb.setCharset(Charset.forName("UTF-8"));
    meb.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    meb.addPart("database", bin);
    HttpEntity entity = meb.build();

    post.setEntity(entity);

    try {
        HttpResponse reponse = client.execute(post);
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } // post 형식의 데이터를 서버로 전달

    return "SUCCESS";
}

2. Tomcat6 Server (JSP)

클라이언트에서 파일을 서버에 업로드 하기위한 <form>태그는 아래와 같은 형식을 따라야 한다.

<form action="???.jsp" method="post" enctype="multipart/form-data">

method는 반드시 POST 방식
전송할 데이터의 인코딩 방식은 multipart/form-data
GET 방식의 경우 URL에 데이터를 삽입하는 방식으로 255개의 문자만 전송이 가능하므로 파일 전송에는 적합하지 않다.

enctype의 경우에도 Default 값은 urlencoded방식을 사용하게 된다. 하지만 파일의 경우 ASCII파일 뿐만 아니라 이진 파일의 내용도 전송해야 하므로 multipart/form-data방식으로 인코딩 하고 <input>태그에서 type 속성을 file로 지정해서 전송 해야 한다.

파일 업로드 : <input type="file" name="upload"><br>
<input type="submit" value="업로드">

파일업로드 구현시에는 아래의 방법을 많이 사용한다. 가장 쉬운 방법이기 때문이다.
JSP에서 MultipartRequest를 사용하기 위해서는
com.oreilly.servlet을 import 해야 한다.

Download Link
필자는 cos-26Dec2008.zip를 다운 받았다.

설치방법

/var/lib/tomcat6/webapps/ROOT/AppRating

/WebContent/WEB-INF/lib

cos-26Dec2008.zip압축 해제후 cos.jar 파일을 lib위치로 이동 시킨다.

소스코드

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page
    import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy,java.util.*,java.io.*"%>
<%
    //주의사항. 파일저장 정확한 경로아래에 폴더가 만들어져 있어야한다.
    //폼에서 넘길때 enctype="multipart/form-data"

    //정확한경로의 설정및 확인방법은 다음과같으며...
    String realFolder = ""; //파일경로를 알아보기위한 임시변수를 하나 만들고,
    String saveFolder = "filestorage"; //파일저장 폴더명을 설정한 뒤에...
    String encType = "euc-kr"; //인코딩방식도 함께 설정한 뒤,
    int maxSize = 100 * 1024 * 1024; //파일 최대용량까지 지정해주자.(현재 100메가)
    ServletContext context = getServletContext();
    realFolder = context.getRealPath(saveFolder);
    System.out.println("the realpath is : " + realFolder); // file path

    File dir = new File(realFolder); // 디렉토리 위치 지정
    if (!dir.exists()) { // 디렉토리가 존재하지 않으면
        dir.mkdirs(); // 디렉토리 생성.!
    }
    // print current time
    Date today = new Date();
    System.out.println(today);

    try {
        //멀티파트생성과 동시에 파일은 저장이 되고...
        MultipartRequest multi = null;
        multi = new MultipartRequest(request, realFolder, maxSize,
                encType, new DefaultFileRenamePolicy());
        //이 시점을기해 파일은 이미 저장이 되었다.

        //폼에서 넘어왔던파일 파라메터들을 가져오려면 이렇게.
        Enumeration params = multi.getParameterNames();

        //그리고 가져온 파라메터를 꺼내는 방법...
        while (params.hasMoreElements()) {
            String name = (String) params.nextElement();//파라메터이름을 가져온뒤
            String value = multi.getParameter(name);//이름을 이용해  값을가져온다
            System.out.println(name + " = " + value);
            application.log(name + " = " + value); // logManager
        }

        //이번엔 파일과 관련된 파라메터를 가져온다.
        Enumeration files = multi.getFileNames();

        //이번엔 파일관련 파라메터를 꺼내본다...
        while (files.hasMoreElements()) {
            String name = (String) files.nextElement();//파라메터이름을 가져온뒤
            String filename = multi.getFilesystemName(name);//이름을 이용해 저장된 파일이름을 가져온다.
            String original = multi.getOriginalFileName(name);//이름을이용해 본래 파일이름도 가져온다.
            String type = multi.getContentType(name);//파일타입도 가져올수있다.
            File f = multi.getFile(name);//파일 용량을 알아보기위해서는 이렇게...
            System.out.println("Parameter Name: " + name);
            System.out.println("Real File Name: " + original);
            System.out.println("Saved File Name: " + filename);
            System.out.println("File Type: " + type);
            if (f != null) {
                System.out.println("File Size: " + f.length());
            }

            System.out.println("-------------------------------");

        }
    } catch (IOException ioe) {
        System.out.println(ioe);
    } catch (Exception ex) {
        System.out.println(ex);
    }
%>

결론

Apache HTTPClient 방법은 Android에서 정식으로 지원하는 방법이 아니므로 버전과 환경에 너무 민감하다.
권장하고있는 HttpURLConnection 방법으로 구현하는게 맞는것 같다.
하지만 Stream 처리를 해야하므로 아무래도 좀더 코드양도 많고 귀찮기는 하다.

참고사이트

http://derveljunit.tistory.com/5
http://derveljunit.tistory.com/entry/JSP%EC%97%90%EC%84%9C-DB-%EC%97%B0%EA%B2%B0-%EB%B0%A9%EB%B2%95
http://blog.hansune.com/289
http://yoongi.tistory.com/87


JSP 로그 생성 방법 Eclipse tomcat 6 uBuntu 11.04 (미완성)


application.log()를 사용해도 로그파일이 생성되지 않는다.
이클립스에서는 사용자가 임의로 로그를 생성할 수 있는 라이브러리 2종과 실행환경 옵션이 빠졌기 때문이다.

이클립스에서 실행한 톰켓이 아니라, 로컬에 따로 설치된 독립 톰캣의 경우 로그가 잘 출력 된다.

Consol output을 이용하는 방법

Run Configurations -> Common -> check file -> write path for saving logfile -> check append option

이것과 함께 
system.out.println()을 사용하면 메시지를 consol에 나오게 하며 이것은 자동으로 
위 설정에 의해서 파일에 기록 되어 진다.

사용법

System.out.println("Debugging message");

이클립스로 JSP 개발시 log 메시지 출력하기

1. 사용자 로그 파일을 생성하는데 필요한 라이브러리 다운
라이브러리 이름: Apache log4j
사용된 버전: 1.2.17
다운로드 링크

라이비러리 이름: commons-logging-1.*bin.tar.gz
다운로드 링크

2. 압출풀고 *.jar 파일을 lib 디렉터리로 이동
압축을 해제한다음 각각의 디렉터리에서
commons-logging-1.2.jar과 log4j-1.2.17.jar파일을
현재 이클립스에서 작업하고 있는 디렉터리에서
WEB-INF->lib에다가 두개의 .jar파일을 복사한다.

/다운로드/apache-log4j-1.2/log4j-1.2.jar
/다운로드/commons-logging-1.2/commons-logging-1.2.jar
/이클립스워크스페이스/WEB-INF/lib/log4j-1.2.jar
/이클립스워크스페이스/WEB-INF/lib/commons-logging-1.2.jar

3. 톰켓 실행시 추가한 라이브러리를 사용하도록 옵션을 추가

Run Configurations-> Arguments -> VM argumensts

아래의 설정을 보면 홈디렉토리는 Tomcat6가 설치된 경로로 잡혀있지만,
설정과 관련된 base디렉토리는 Eclipse에서 자체적으로 plugin을 관리하는 임시파일 디렉터리에 저장되는 것을 알 수 있다.

즉, 톰켓 자체는 현재 설치된 버전을 사용하지만, 
설정 값들은 이클립스에서 독자적으로 관리한다는 뜻이 된다.
따라서 톰켓 자체의 설정 값을 변경해도 Eclipse로 톰켓을 실행하면 해당 설정이 전혀 반영이 안되는 것이다.
어쩌면 충돌을 막기위한 당연한 조치일 것이다.

-Dcatalina.base="/var/lib/tomcat6/webapps/ROOT/.metadata/.plugins/org.eclipse.wst.server.core/tmp0" 

-Dcatalina.home="/usr/share/tomcat6" 

-Dwtp.deploy="/var/lib/tomcat6/webapps/ROOT/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps" 

-Djava.endorsed.dirs="/usr/share/tomcat6/endorsed" 

-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 

-Djava.util.logging.config.file="/root/tomcat6Log(Eclipse)/logging.properties"

참고 사이트

http://blog.mezeet.com/2015/01/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4%EB%A1%9C-jsp-%EA%B0%9C%EB%B0%9C%EC%8B%9C-log-%EB%A9%94%EC%8B%9C%EC%A7%80-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0/

디버깅 JSP 방법: http://www.tutorialspoint.com/jsp/jsp_debugging.htm


Android Plot Libraries


정식 API로는 그래프를 그려주는 기능은 없다.
기존의 open-source project를 살펴 보자.

크게 Client-side libraries와 web기반의 Google Charts로 나뉜다.

Client-side libraries
Pros
● Open source
● Self-contained
● Easy to integrate
Cons
● Limited features
● Older platform
versions
● Look & feel
● Customization hard
● Lack of support

Google Charts
Pros
● Feature rich
● Simple API
● Customizable
● Responsive design
● Interactive
Cons
● Network connection
● Load time
● Backward
compatibility

MPAndroidChart

가장 최근까지 활발히 업데이트 되는 프로젝트이다.
그래프도 나름 이쁘다.
MyphoneandMe에서 사용함

https://github.com/PhilJay/MPAndroidChart

GrapView

NotifyME에서 사용하는것
https://github.com/jjoe64/GraphView
http://www.android-graphview.org/

Google Charts

Hello Pizza Chart
https://github.com/ecgreb/hello-pizza-chart


'Computer Science > Android Application' 카테고리의 다른 글

이벤트 (Event)  (0) 2017.08.04
Gradle  (0) 2016.06.03
Android wear app  (0) 2015.08.25
Android Studio 자동 import 기능  (0) 2015.07.15
Android Wear 개발환경 구축  (0) 2015.07.15

Nexus 5x bootloader unlock, TWRP recovery, decrypt, and Rooting


marshmallow android (6.0)이 업데이트 되면서 
Nexus 5x의 rooting이 이전들의 reference phone과 다르게 좀 새로운 것들이 포함된다.
이유는 SELinux의 전격 도입에 따른 문제 같다.
항상 Android는 Security 부분에서 많은 학계 논문들이 출간 되었는데 그동안 부분적으로 체택한 걱에 반해서 이번 버전에서는 전격적으로 모두 도입한것 같다. 따라서 여러번 해본 Rooting이지만 조금은 오랜만에 자세히 다뤄 본다.

현재까지 출시된 Nexus 5x version

bullhead" for Nexus 5X
6.0.0 (MDA89E)
6.0.0 (MDB08I)
6.0.0 (MDB08L
6.0.0 (MDB08M)
6.0.1 (MMB29K)
6.0.1 (MMB29P)

rooting 순서

Prerequisites

  1. Nexus 5x usb drives installation
  2. ADB and Fastboot installation
  3. USB debugging mode enable > Go to Settings > About device. Locate build no. and tap on it 7-8 times or until you get toast notification saying you’re now a developer’

Bootloader OEM Unlock

Enable OEM Unlock in developer options
go to Seetings > Developer Options -> Enable OEM Unlock

adb reboot bootloader

Bootloader로 reboot 된다. 그러면 아래의 두 메시지를 볼 수 있다.
SECURE BOOT - enabled
DEVICE STATE - locked

root@jemin-virtual-machine:~# fastboot oem unlock
...
OKAY [  8.031s]
finished. total time: 8.031s

DEVICE STATE - unlocked
boot loader unlcok을 하면, your softweare can't be checked for corruption. 이라는 메시지가 나오게 된다. unlock을 했으므로 보안에 취약한 것은 어쩔수 없다.

Flash modified bootloader image

이부분이 기존과 다른데 수정된 boot loader image를 올리지 않으면 루팅을 할 수 없게 된다.
자신의 build number에 맞춰서 다운 받는다.
boot image: http://forum.xda-developers.com/showpost.php?p=63781454&postcount=143

공식사이트: http://forum.xda-developers.com/apps/supersu/wip-android-6-0-marshmellow-t3219344

# fastboot flash boot boot.img 
target reported max download size of 536870912 bytes
sending 'boot' (11472 KB)...
OKAY [  1.506s]
writing 'boot'...
OKAY [  0.199s]
finished. total time: 1.705s

decrypt 확인
Setting -> Security -> Encrpt phon
팝업창으로 해당폰을 encrypt하라고 나온다면 정상적으로 decrypt된 것이다.
이제 SuperSU를 recovery 모드에서 찾을 수 있다.
이것이 안되면 Recovery mode에서 SuperSU.zip 파일이 보이지 않으니 반드시 이부분을 확인 해야 한다.

어째서 Modified boot.img를 flash 해야하는지에 대한 이유가 이 부분이다.

TWRP recovery mode 설치

공식사이트: https://twrp.me/devices/lgnexus5x.html
사용된 버전: twrp-2.8.7.0-bullhead.img

# adb reboot bootloader
# fastboot flash recovery twrp-2.8.7.0-bullhead.img
target reported max download size of 536870912 bytes
sending 'recovery' (16240 KB)...
OKAY [  2.084s]
writing 'recovery'...
OKAY [  0.264s]
finished. total time: 2.348s

WIPE
Wipe -> Format Data -> enter "yes" in the form
reboot -> do not install

swipe to factory reset의 경우 default 기능으로 user data from the phone, including your installed apps, cache, and dalvik cache를 초기화 한다. 하지만, This will not effect the internal or SD card storage area of your phone, meaning your documents, downloads, pictures, music, videos and other files will stay safe.
위에 언급한 부분까지 모두 wipe 하고 싶다면, Format Data를 사용 한다.

SuperSU

공식 사이트: http://forum.xda-developers.com/showthread.php?t=1538053
버전 변화 정보: http://forum.xda-developers.com/showpost.php?p=23427824&postcount=3
How-To SU: http://su.chainfire.eu/

SuperSU 2.66 beta 버전을 sdcard로 이동 시킴.
USB typeC 이므로 위에서 data transfer로 설정을 해줘야 SDCard가 인식 된다.

adb push BETA-SuperSU-v2.66-20160103015024.zip /sdcard/
975 KB/s (4272471 bytes in 4.275s)

결과

최종적으로 root checker basic app을 다운받아 확인해보면 아래와 같이 루팅이 성공한 것을 알 수 있다.

encrypt도 decrypt 되었으므로 성능 degradation 사라졌다.
Congratulations!

기타 자료

Recovery Mode

2014년만 해도 ClockworkMod (a.k.a CWM)이 거의 대부분 사용하는 custom recovery 모드 였다.

CWM recovery

최근, TeamWin Recovery Project(aka TWRP)에 의해서 완벽한 touch based custom recovery가 구현 되어졌다. 초반에는 단지 Nexus 계열의 장치만을 지원 하다가 최근에 들어서는 셀수 없이 많은 smartphone을 지원하기 시작 했다.

공식사이트: https://twrp.me/devices/lgnexus5x.html

TWRP recovery

Reference

YouTube: https://www.youtube.com/watch?v=mUq1xdJ-7-E#t=143
How to Root: http://forum.xda-developers.com/nexus-5x/general/guide-how-to-install-custom-recovery-t3231143
How To guide For Beginners: http://forum.xda-developers.com/nexus-5x/general/guides-how-to-guides-beginners-t3206930


Week 02: Octave Tutorial


목차

  1. Basic operations
  2. Moving Data Around
  3. Computing on Data
  4. Plotting data
  5. For while if statements and functions
  6. Vectorization

Basic operations

make 2x3 matrix, containing one values.

>> ones(2,3)

ans =

     1     1     1
     1     1     1

make 2x3 matrix, containing zero values.

>> zeros(2,3)

ans =

     0     0     0
     0     0     0

Computing on data

element-wise multiplication of two matrices.

A .* B

If you want to buy A transposed, the way to do that
apostrophe(')

A'

Vectorization

고속 linear alrgebra comptuing을 통해서
고속 병렬 처리를 수행 할 수 있다.
parallel hardware에 잘 적용이 되어 질 수도 있다.

아래와 같이 vectorized implementation으로 구현할 경우
코드의 길이가 절대적으로 줄어드는것은 물론
속도면에서도 많은 향상을 가져 온다.

다른 programming language에서는 해당 언어 syntax에 맞춰서 그렇게 처리하면 된다.

좀 더 복잡한 예제인 Gradient Descent를 보자.
j의 값은 0,1,2 로서 2차원 이라고 가정 하자.
그리고 아래와 같을때 모든 Theta는 simultaneously update 되어야 한다.

풀어서보면 vector끼리의 substraction의 형태로 처리 될 수 있다.

각각을 아래와 같이 간소화된 vector 연산으로 줄일 수 있다.
$$ \theta := \theta - \alpha \delta $$


Computing Parameters Analytically


Normal Equation

아래와 같이 점점 느리게 converge 하는 문제를 normal equation을 통해서 해결할 수 있다고 한다.


X는 training set vector를 의미한다.
Y는 prediction 할려는 vector를 의미한다.

X는 m by (n+1) dimensional matrix이다.
Y는 m-dimensional vector 이다.

m은 number of examples 이고
n은 number of features 이다.


https://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)
https://en.wikipedia.org/wiki/Gramian_matrix


Linear Regression with multiple variables


multiple features

다중 feature와 다중 variable에 대해서 어떻게 linear regression을 적용하는지 알아 보겠다.

Gradient descent for multiple variables

아래와 같이 각각을 편미분(partial derivative)해서 동시에 업데이트하면서 최적화를 시키면 된다.
중요한것은 $X_0$를 항상 0으로 인지하기 때문에 $\theta_0$가 달라지지 않게 된다.
따라서 new algorithm 공식과 같이 간소화하여 작성할 수 있게 된다.

Gradient descent in pratice 1: Feature Scaling

이장에서는 pratical trick을 학습한다. 그것은 gradient descent를 잘 동작하게 하는 알고리즘이다.

서로다른 scale을 가지는 feature들에 대해서 feature scale을 비슷하게 해줄 경우 
Gradient descent algorihtm을 실행 했을때 좀 더 빠르게 converge 하게 된다.

서로다른 scale일 경우 아래의 그림과 같이 매우 Cost function J의 contour skinny elliptical shape을 가지게 된다.
이때 약간의 trick을 적용하면 좀더 circle스럽게 되고 금방 converge 된다.

좀 더 일반적으로 수식을 정리해 보자.

간단 수업 퀴즈

Gradient descent in practice 2: Learning rate

또 다른 TIP인 Learning Rate에서 다루겠다.

두가지 관점이 존재한다.

  • Debugging: How to make sure gradient descent is working correctly.
  • How to choose learning rate a.

아래의 그래프를 보면 이전에는 X축이 $\theta$ 이지만 현재는 그것이 아닌 interation이다.
$J(\theta)$ should decrease after every interation.
400 interation 이후로는 converge step의 정도가 줄어들게 된다.

하지만 이렇게 얼마만큼의 iteration 이후에 converge 될지를 예측하는 것은 매우 어려운 작업이다.



대부분의 경우에 대해서 x axis를 # of iterations로 설정 함으로써 gradient descent의 learning rate을 조절 할 수 
있게 된다.

Features and polynomial regression

적합한 featrue를 선택하는 방법에 대해서 다룬다.

Housing price를 prediction하는 문제에 대해서 생각해 보자.
아래와 같이 frontage와 depth 두개의 feature들이 있다고 생각해보자.
frontage는 앞부분 길이고 depth는 위에서 부터 아래까지의 길이를 의미한다.
따라서 두개의 feature를 그대로 반영해서 쓰는것보단 두개를 하나로 묶어서
$$ Area = frontage \times depth$$
로 계산하는 것이 좋다.

Polynomial regression

Quadratic model: $\theta_0+\theta_1x+\theta_2x^2$
하지만 qudratic model은 타당하지 않다. 왜냐면 다시 값이 내려가기 때문이다.
집 크기가 커진다고 가격이 작아질수는 없기 때문이다.

그럼 다른 삼차함수(cubic function)을 생각해 볼 수도 있다.
$$\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3$$


위와 같이 서로다르게 size 값이 작용하므로 주의 있게 사용 해야 한다.

하지만 cubic 모델을 qudratic 모델의 대안으로 사용하는 것이 아닌 다른 방법을 생각해 볼 수도 있다.
square root(제곱근)함수를 사용 할 수도 있다.
급격히 올라가지만 그렇다고 다시 내려가지는 않게 된다.


Week 01 Linear Algebra Review


1.Matrices and Vectors

아래와 같이 $R^4$즉 4차원 Vector를 4행 1열 matrix로 표현할 수 있다.
그리고 각각의 값은 0으로 시작할수도 있고 1로 시작할 수도 있다.
마지막으로 대문자 A,B,C,X 와 같은것들은 보통 Vector를 나타내며, 소문자 a,b,c,x는 scalar를 나타낸다.

3.Matrix Vector Multiplication

Matrix 연산을 통해서 Hyposis fucntion의 연산을 한줄로 아래와 같이 끝낼 수 있다.
Computationably efficient 하다고 할 수 있다.

4.Matrix Vector Multiplication

matrix 곱하기 matrix의 공식은 아래와 같다.

Matrix 곱하기 Matrix을 이용해서
hypothesis 함수들의 연산을 효율적으로 할 수도 있다.

3개의 hypotheses 함수들에 대해서 4개의 house size 인자를 넣어서 각각 빠르게 계산할 수 있다.

5.Matrix Multiplication Properties

matrix multiplication은 하나의 연산으로 여러 연산들을 함축 할 수 있기 때문에 매우 강력한 연산 스타일이다.
하지만 여기서는 주의해서 사용해야할 부분들을 다루도록 한다.

교환법칙 (commutative law) 성립 안
결합법칙 (Associative law) 성립함

단위행렬 (Identity Matrix) 부분

중요한것은 $A \times I$의 경우 I는 n by n 이고
$I \times A$의 경우 I는 m by m 이라는 것이다.

6.Inverse and Transpose

Inverse Matrix은 Identity Matrix을 만들어 내는 것이다.

단 inverse matrix은 없을 수도 있다.
따라서 Machine Learning algorithm에서 이것을 처리하는 것이 중요하다고 할 수 있다.

Matrix Transpose

전치 행렬을 (Transpose Matrix)이라고 한다.


smali/baksmali 수준의 코드 수정

smali/baksmali는 An assembler/disassembler for Android's dex format의 약자이다.
DEX 바이너리를 사람이 읽을 수 있도록 쉽게 표현한 것이다.

Dex (Dalvik Executable)

Toast Smali Code 추가 방법

HelloWorld.java

Toast toast = Toast.makeText(getApplicationContext(), "Toast Test");
toast.show();

HelloWorld.Smali

invoke-virtual {p0}, Lcom/test/helloworld/HelloWorldActivity;->getApplicationContext()Landroid/content/Context;
move-result-object v1
const-string v2, "Toast Test"
const/4 v3, 0x0
invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v1
invoke-virtual {v1}, Landroid/widget/Toast;->show()V

smali code를 설명하면 다음과 같다. 우선 line 1은 자신의 activity 이름과 맞춰서 변경을 해야 한다.

문법 정리

java 코드

package com.atest;

import android.app.Activity;
import android.os.Bundle;

public class AtestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

smali 코드

.class public Lcom/atest/AtestActivity;
.super Landroid/app/Activity;
.source "AtestActivity.java"

# direct methods
.method public constructor <init>()V
    .locals 0

    .prologue
    .line 7
    invoke-direct {p0}, Landroid/app/Activity;-><init>()V

    return-void
.end method

# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
    .locals 1
    .parameter "savedInstanceState"

    .prologue
    .line 11
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    .line 12
    const/high16 v0, 0x7f03

    invoke-virtual {p0, v0}, Lcom/atest/AtestActivity;->setContentView(I)V

    .line 13
    return-void
.end method

class -> super
Object는 L이라 이름 붙음
.source는 파일 명이다.

Class Body는 .method로 시작해서 .end method로 끝난다.
invoke-virtual {v1}, Landroid/widget/Toast;->show()V에서 V는 마지막 return type void를 의미한다.
.locals는 method 내부에서 사용하는 resiter의 수를 의미한다. (v0,v1,v2..vn)
.parameter는 매개변ㅅ로 받아온 변수명이다.

.prologue로 body가 시작하는데 사용되는 opcode들은 
(http://netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html)에서 자세하게 확인할 수 있다.

.line xx는 java소스의 라인을 가리키므로 디버깅시 확인할 수 있다.

주로 함수 호출시 invoke-kind가 사용되는데 virtual, static, super등이 있다.
p0은 클래스 인스턴스를 가리키고 이후 value가 매개변수에 해당된다. 
메소드 명 뒤 괄호 안에 매개변수의 type을 지정하는데, primitive type의 경우 약어를 넣고 그 외의 type은 패키지명을 포함하여 지정한다.

관련 사이트

Smali: https://github.com/JesusFreke/smali
Smali TypesMethods and Fields: https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields

Dalvik bytecode format: https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html
APKTool을 통한 Smali 분석: http://strawberryit.tistory.com/142


Android app data backup and restore

데이터를 백업한다음 rooted phone에 올려서 구조를 분석 할때 좋다.

방법

adb backup [-f <file>] [-apk|-noapk] [-shared|-noshared] [-all] [-system|nosystem] [<packages...>]
# [-f <file>] 부분은 백업 데이터를 저장할 파일명입니다.
# [-apk|-noapk] 부분은 apk 파일, 즉 어플리케이션 설치 파일도 같이 백업할 것인가 설정하는 부분입니다.
# 설치 파일도 백업해놓으면 나중에 복원하면 해당 어플이 같이 설치가 됩니다.
# [-shared|-noshared] 는 sd 카드를 포함시킬 것인지 여부입니다.
# [<packages...>] 는 패키지의 이름입니다.

사용하는 명령어 구조

adb backup -apk -f backup.ad packageName

복원 방법

adb restore backup.ad


넥서스5 리눅스 환경에서 루팅하기 (Nexus 5 Rooting(루팅) in Ubuntu)


Unlock Bootloader

adb reboot bootloader
fastboot oem unlock

Flash Root

download: CF-Auto_Root
이미 다운 받았으므로: ~/Android_Platform/Nexus5에 존재한다.

unzip CF-Auto-Root-hammerhead-hammerhead-nexus5.zip
cd image/
sudo fastboot boot CF-Auto-Root-hammerhead-hammerhead-nexus5.img

install 화면에 SuperSU가 있으면 설치 성공이다.


Date-Time Conversion Function in R


R에서는 이것의 처리를 위해서 POSIXlt POSICct를 사용 할 수 있다.

예제

> Sys.time()
[1] "2015-12-12 13:08:11 KST"
w
> Sys.timezone()
[1] "Asia/Seoul"

> Sys.Date()
[1] "2015-12-12"

현재 datetime을 class로 받은다음 그것을 integer로 변경하는 방법

> z <- Sys.time()
> z
[1] "2015-12-12 13:27:17 KST"
> unclass(z)
[1] 1449894437

#다시 원래대로 복구함
> as.POSIXct(1449894437,origin="1970-01-01")
[1] "2015-12-12 13:27:17 KST"

서로 다른 시간으로 변경하

> as.POSIXlt(Sys.time(), "GMT")
[1] "2015-12-12 04:45:42 GMT"
> as.POSIXlt(Sys.time(), "EST5EDT")  # the current time in New York
[1] "2015-12-11 23:46:48 EST"
> as.POSIXlt(Sys.time(), "EST" )     # ditto, ignoring DST
[1] "2015-12-11 23:46:48 EST"
> as.POSIXlt(Sys.time(), "HST")      # the current time in Hawaii
[1] "2015-12-11 18:46:48 HST"
> as.POSIXlt(Sys.time(), "Australia/Darwin")
[1] "2015-12-12 14:16:48 ACST"

timestamp (milliseconds) 처리하기

#POSIXct 함수를 이용한
time <- 1433848856453
timezone <- 10800000
options(digits.secs=3)
as.POSIXct((time+timezone)/1000, origin="1970-01-01")

lt와 ct의 차이

lt는 list time의 약어이고 ct는 continuous time`의 약어이다.

  • as.POSIXlt(): 시계열분석이나 년/월/일/시간/분/초 단위로 구분해서 연산을 해야 하는 경우 해당 함수로 날짜/시간 type으로 바꾸어주면 편하다.

  • as.POSIXct():

참고자료

http://astrostatistics.psu.edu/su07/R/html/base/html/as.POSIXlt.html
http://stackoverflow.com/questions/1962278/dealing-with-timestamps-in-r
지수표기를 숫자표기로 변경하는 R 옵션


How to build a real lightsaber


lightsaber는 아주 멋진 무기이다. 그것으로 싸우는 모습은 굉장히 elegant하다.
이것은 아주 좋은 무기일 뿐만이나라 laser blasts를 방어하는 shield의 역할을 한다.

그렇다면 왜? 우리는 이러한 lightsaber들을 real life에 도입하지 않는 것인가?
우리의 phsicist들은 충분히 똑똑하며, 최소한 big fan들이 있기 때문에 만들어 낸다면 매우 큰 파급력을 가질 것이다.

분명한 것은 lightsaber를 만들기 위해서는 방향성을 가지는 light를 이용해야 한다는 것이다. 이것은 다른말로
laser를 의미하며 laser기술은 많은 도약을 이뤄 왔지만 여전히 이러한 것들을 만들기에는 멀기만 하다.
왜 그런지 알아보자.

첫 번째 challegne
크기의 문제이다. 그것을 검으로 만들기에는 현재의 기술은 많은 공간을 필요로 한다.
lazer 를 생성하는 것은 강한 자연적인 경향을 가지고 있기 때문에 그것을 작은 포인트 수준으로 집약하기에는
어려움이 크다.

한가지 방법은 검의 끝에만 살짝 lazer를 나오게 할 수 있다. 하지만 엄청난 지원 장치들을 둘러매고 단지 그 작은 lazer날만을
들고 서있다면 그것이 실제 전장에서 상대를 압도할 수 있을것이라 생각하는 사람은 아무도 없다.

아래와 같은 크기로 압축하기란 쉽지 않다.

두 번쨰 challenge
어떤 물체를 slice 해버릴 정도로 lazer를 방출 하기위해서는 막대한 power를 필요로 한다.
Welding laser(용접기)는 실제로 industry에서 사용된다. 하지만 이것들은 수 킬로 와트 수준의 전력(power)를 요구한다.
이러한 막대한 에너지를 lightsaber의 작은 hilt(손잡이)에 담는것은 매우 어렵다.
추가적으로, cooling mechanisms도 필요하다. 왜냐하면 이러한 막대한 에너지 방출로 당신의 손이 녹아내리길 원하지 않는다면 말이다.

세 번째 challenge
가장 근원적인 문제로써 두개의 lightsaber들이 calsh를 할 수 없다는 것이다. 
두개의 lightsaber는 간단하게 서로를 통과하며 어떠한 상호작용도 할 수 없다.
더나아가 laser 방향 초점은 매우 날카로워서 그것을 직접적으로 볼수는 없다. 정확하게 해당 축으로 시선을 일치하지 않는이상.
따라서 laser들을 보기위해서는 smoke 또는 안개가 절대적으로 필요하다.
스모그의 입자들은 공기중으로 흐터져있기 때문에 그러한 입자들과 laser light이 반응하여 눈으로 볼 수 있는 하나의 beam을 형성할 수 있게 된다.

하지만 전혀 희망이 없는것은 아니다. laser 기술에 lightsaber가 기반한다면 현실적으로 해결해야할 많은 문제가 있는것은 사실이다. 대안으로써 plasma를 이용하는 방법이 있다. 효과적인 어떠한 뜨거운 gas로써 그것은 전자와 핵으로 나눠진다.
이것은 백만 화씨 까지 달성된다.

재밌는 것은 이러한 plasma는 가스에 따라서 서로다른 색을 발산 하다는 것이다.
하지만 이것또한 가스의 저장과 각 플라즈마끼리의 상호작용이 문제가 된다.


Handling json in R using jsonlite


JSON format을 R에서 다루기 위해서는 두개의 package가 조재한다.
첫 번째는 rJSON package이고 두 번째는 jsonlite package이다.
여기서는 jsonlite를 다룬다. 이유는 rJSON을 fork하여 확장한것이 jsonlite이기 때문이다. version도 2015년 11월로 Post를 작성 하고 있는 지금도 계속해서 개선되어지고 있는 package이기 때문이다.

지원하는 함수들의 목록은 아래와 같다.

  • flatten: Flatten nested data frames
  • fromJSON: Convert R objects to/from JSON
  • prettify: Prettify or minify a JSON string
  • rbind.pages: Combine pages into a single data frame
  • serializeJSON: serialize R objects to JSON
  • stream_in: Streaming JSON input/output
  • unbox: Unbox a vector or data frame
  • validate: Validate JSON

Streaming JSON input/output

When can nested dataframe be appeared ?

아래는 3개의 data frame이 nested된 구조를 JSON으로 병경한 것이다.

[
{
"driver":"Bowser",
"occupation":"Koopa",
"vehicle":
    {
    "model":"Piranha Prowler","stats":
        {
            "speed":55,"weight":67,"drift":35
        }
    }
},
{
"driver":"Peach","occupation":"Princess","vehicle":
    {
    "model":"Royal Racer","stats":
        {
            "speed":34,"weight":24,"drift":32
        }
    }
}
] 

아래와 같이 ""안에 들어 있으면 그냥 value로 처리된다.

"data":"{}"

참고자료

http://rpackages.ianhowson.com/cran/jsonlite/man/stream_in.html
JSON 공식 사이트


'AI > R Basic' 카테고리의 다른 글

Do.call()  (0) 2016.02.05
날짜 시간 변환 (Date-Time Conversion Function in R)  (0) 2015.12.14
통계처리 (기본)  (0) 2015.10.28
데이터 분리 및 병합 (split, subset, merge)  (1) 2015.10.22
doBy package, 데이터 그룹 처리  (0) 2015.10.22

JSON: JavaScript Object Notiation


자료형과 문법

JSON의 기본 자료형은 다음과 같다.

  • 문자
  • 참/거짓
  • 배열: 순서가 있는 리스트이며, []로 나타내며, 요소는 쉼표로 구분
  • 객체: 순서가 없는 이름/값 쌍의 집합이다.
  • null: 빈값을 의미한다.

문자열

항상 큰 따음표(")로 묶어야 하며, 그 안에는 유니코드 문자들이 나열된다.
역슬래시는 제어문자를 표현하기 위해 사용됨.

배열

배열은 대괄호[]로 나타낸다. 배열의 각 요소는 기본 자료형이거나 배열, 객체이다. 각 요소들은 쉼표(,)로 구별된다. 각 요소가 나타나는 순서에 의미가 있다.

장점

JSON은 텍스트로 이루어져 있으므로, 사람과 기계 모두 읽고 쓰기 쉽다.
프로그래밍 언어와 플랫폼에 독립적이므로, 서로 다른 시스템간에 객체를 교환하기에 좋다.
자바스크립트의 문법을 채용했기 때문에, 자바스크립트에서 eval 명령으로 곧바로 사용할 수 있다. 이런 특성은 자바스크립트를 자주 사용하는 웹 환경에서 유리하다. 그러나 실질적으로 eval 명령을 사용하면 외부에서 악성 코드가 유입될 수 있다. 모질라 파이어폭스 3.5, 인터넷 익스플로러 8, 오페라 10.5, 사파리, 구글 크롬 등 대부분의 최신 웹 브라우저는 JSON 전용 파서 기능을 내장하고 있으므로 이런 기능을 사용하는 것이 더 안전할 뿐만 아니라 빠른 방법이다.

참고사이트

위키피디아
JSON


+ Recent posts