2017年5月31日 星期三

c++ const教學


想必很多人在研究C++語言時,常遇到const這個東東吧XD,表面上看似複雜,其實不難,以下就讓我來一一道來吧!


const就是constant的縮寫,在C++裡面代表用這個方式表示的資料無法用這個方式修改,聽起來很抽象,就讓我用實例來展示吧


1. 出現在常數時:


const int c=100;
其實和 #define c 100 功能一樣,一但做出如此宣告,若之後想要改變c的值,就會compile error


2. 出現在參照時:
int b=100;
const int &a=b;


如果這時候我們想用a去改變b,比如說 a=150,會compile error,因為我們已經固定參照了!
但如果我們直接改b,則是被允許的! 比如說b=200,編譯會過


3. 出現在指標時:
int b=100;
const int *a=&b;
和參照時一樣,我們不能透過這個指標去改變b的值,只能直接用b改


4. 出現在STL iterator 時:
vector <int> v;
v.push_back(1);
v.push_back(2);
vector<int> const_iterator p;
for(p=v.begin();p!=v.end();p++)
     cout<<*p;
此處一樣,我們不能透過iterator去修改vector元素的值


這次的整理就到這,是不是很簡單啊XD


參考資料:
1. edx
2. MSDN

2017年5月30日 星期二

gradient descent algorithm for multivariate linear regression



目標函數:
$h_w (x) = w_0 + w_1 x_1 + w_2 x_2 + \cdots +w_nx_n$

演算法:
$w_j \leftarrow w_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_w(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; \text{for j = 0...n}$
$do$ $this$ $until$ $convergence$

其中:
$x_j^{(i)} :\text{第j組資料的第i個特徵} $
$x^{(i)}:\text{由第i組資料的所有特徵組成的column vector}$
$m  : \text{餵的資料組數}$
$ n  :\text{特徵的數量}$


我想第一眼看到這個演算法應該頗傻眼吧,感覺很複雜,其實還好,這個演算法在machine learning中被稱為gradient descent algorithm,主要是用來從資料中學習的演算法
我想有學過線性代數的人都知道最小平方法,其重點是求出一條直線,使直線和其他點的平方誤差最小,這個演算法也是類似道理,希望從資料中得到誤差最小的直線,至於如何做呢,就如同上面提到的演算法一樣,利用逐次逼近來使目標函數誤差最小,其中選取$\alpha$是一門學問,選太小會使演算法收斂太慢,選太大可能會導致演算法無法收斂,因此實務上選取$\alpha$都是慢慢嘗試,這個演算法因為是採用嘗試的,且一旦到local minima就不會動了,因此可能找到的不會是全域最佳解(不過在linear regression的情況下並不會發生local manima的情況)! 這個想法非常好用,並不只限於線性回歸,以後會再出現歐XD

gradient descent 方法有一些優化的方法:
1. feature scaling
2. stochastic gradient descent
3. adagrad



資料來源:
1. coursera: machine learning by andrew ng
2. artificial intelligence a modern approach 3rd
3. 李宏毅教授youtube

2017年5月23日 星期二

machine learning 入門

今天是蠻特別的一天,google 旗下的alphago又擊敗了人類,這次擊敗的是目前的世界第一,柯潔,做為一個多年棋迷,總覺得好像圍棋不再好玩了XD,因為上網下可能都會遇到電腦?!
雖然心裡五味雜陳,但還是來探討一下alphago背後的技術吧,alphago使用的是所謂的deep learning(深度學習),其奠基於我們將要介紹的machine learning (機器學習),以下就先來探討一下機器學習的定義吧!


機器學習定義為: 一個電腦程式經驗中學習,使得它提升在任務中的表現


上述的定義好像有點抽象,不過如果用alphago的例子來看的話,就是越下越強,這樣應該比較好懂吧XD

他的大架構可以看成我們有一個學習情境, 根據此我們去選相對應的模型,我們用資料去訓練模型來得到目標函數(專業術語叫做training ),之後再把目標函數拿去實際應用(專業術語叫做testing)! 詳細請見另一篇文章: 點此


機器學習可依學習情境粗略分成三種:
1.  supervised learning (監督學習): 給input得到output,來預測input和output的關係

2.  unsupervised learning(未監督學習): 意思就是不告訴機器輸入的資訊對或不對,通常機器會利用叢集性(clustering)來判斷,也就是利用某些資料會聚集在一起,來判斷相關性

3. reinforcement learning(強化學習): 在餵給機器資料後,依照機器的表現,給予獎賞或懲罰,使機器越做越好, 這個學習情境和監督學習最大的不一樣來自於並非對於單一輸入給予相對應的輸出來訓練,而是給予一連串的輸入,才會有一個對應的輸出
舉例來說,下棋下的很多步,最後輸掉了,我們並不知道是哪一步下不好,因此須採用這種技術來做分析

其實以上三種分類只是大概,有時很難分得清

在每種學習情境下,又可以依照想達成的目標來分為兩種
 1. classification(分類): (其函數輸出為分類)
以supervised learining 來舉例的話, 意思就是告訴機器每次的輸入是對或不對,舉例來說餵給機器病人資料,並告訴機器病人最後是否診斷出癌症,來判斷哪些原因和癌症相關

2. regression(回歸):(其函數輸出為純量)
以supervised learining 來舉例的話, 意思就是利用目前資料去做回歸,求出輸入input,應該要得到怎樣的output, 例如利用過去的雨量來預測未來的雨量


最後當人重要的是算法啦,不過不管是甚麼算法,最終目的都是要提升任務表現:
以下是常用的算法:
#   依學習情境分類:
一. supervised learning:
常用的算法有以下幾種

1. regression:

(1) linear regression (用在連續資料)
  • gradient descent algorithm for linear regression: 請點此
  • normal equation for linear regression: 請點此
(2) logistic regression (用在分組資料)
  • gradient descent algorithm for logistic regression
  • conjugate gradient
  • BFGS
  • L-BFGS
2.  classification:

(1) neural network
  • forward propagation
  • backward propagation    
(2) support vector machine

(3) decision tree

(4) K-NN

(5) perceptron model:
  • perceptron learning algorithm: for linear separable data
  • pocket algorithm: for linear non-separable data
(6) neural network: (即為deep learning,又被稱作multi-layer neural network)
     即為很多層的perceptron, 其原理相關直觀,因為有些資料無法輕易分類,因此利用多層轉換,最後形成容易分類的資料 

二.  unsupervised learning

三. reinforcement learning


p.s. 參考資料:
1. artificial intelligence  a modern approach  3rd
2. coursera
3. edx machine learning
4. learning from data
5. 李宏毅教授youtube

2017年5月22日 星期一

數學式神物- Mathjax

之前在打部落格文章時,遇到數學式時,很多都打不出來,直到發現了MathJax這個神物!
附上官方連結:mathJax官方網站


MathJax使用非常方便,和Latex語法幾乎相同,它使用javascript 將Latex code 嵌入在HTML內,使用時只需要在blogger文章內用兩個錢型符號包住latex符號,即可顯示數學式,超好用!


以下是範例:
$log_2 n$
$O(n^2)$
$\frac{x}{3}$


至於我如何做到的呢,你可以對我的數學式點右鍵,看到show math as,選擇Tex command,就可以看到我的latex程式碼,其實很多筆者常看的部落格都是用mathjax,如果還沒用的話,可以試看看歐!

補充一個小技巧, 上面的$\frac{x}{3}$看起來好小, 因為我們用\frac會看起來很小,如果改用\dfrac看起來就會變大惹, 請看=> $\dfrac{x}{3}$, 算是蠻實用的小技巧

2017年5月16日 星期二

OOP入門-3 method in class

前一期(連結在此)提到了class的基本概念,並預告了這一期會介紹method(方法),就讓我們來好好了解一下吧


之前我們用class建造了一台車,車有三個變數,x,y,ori(代表orientation,方向的意思,我們假設這裡只有在X軸上移動),所以Java code 在增加了method 後如下,其中code 內還有一個重點,就是this的使用,在java內我們可以讓instance variable和costructor的參數名稱相同,只是需要使用this這個方法,還有就是private和public在這裡就能看出差別了!private表示定義的東西只有自己class可以用,而public則是能由其他class調用,之所以這樣區別,則是物件導向內一個很重要的概念,封裝(encapsulation),意思是我們不需要知道class的詳細內容,我們只需要知道如何操作就好(就像我們開車XD)
完整code如下:
public class Car{

  private int x;//instance variable
  private int y;
  private int ori;

/**below shows constrcutor**/
  public Car(int x,int y, int ori){
    this.x=x;
    this.y=y;
    this.ori=ori;
  }
  public void drive(int dis)
  {
    x=x+ori*dis;
  }
  
  public int showori(){
      return ori;
  }

}

public class test{
   
  public static void main(String[] args){
     Car car1=new Car(1,1,1);//create new car
     System.out.println(car1.showori());//show the orientation 
  }
}

這裡有個小問題歐,如果今天我們有一個method在class內,可是class內沒有object,那會是甚麼情形呢我們把這種method稱為static method,也就是在宣告的時候一定要加上static 關鍵字,否則就會compilation error(冏),另外還有一個很類似的詞,被稱為static variable,意思是在一個class內,不屬於object的性質,也就是不是instance variable啦,同樣也是宣告的時候要加上static!有了這兩個強力武器之後,我們對OOP就有一定程度的認識囉!其他的就下期再會吧!

2017年5月15日 星期一

我的日檢N1之路-2 架好結構


 前一期提到了日文有時候讀音會改變,其實這有一個規則被稱為PTK音變


p.s. 前一期連結:連結點此


何謂PTK音變呢,規則如下,若p,t,k開頭的音出現在第二個字以後,則需改變發音,例如之前提到的
あなた,除了t 變成 d 之外, 還有 p變成b, k變成g, 讀者可以透過日劇或流行歌,多聽幾次,應該就能反射了~


在了解PTK音變之後,我那時買了日本語gogogo(書本連結),書有四冊,內容涵蓋的基本句型,名詞,形容詞,以及最讓人聞之色變的五段動詞,五段動詞其實我還有參考另一本書,就是檸檬樹的大家學標準日本語,裡面圖表化的方式,學起來有還蠻輕鬆愉快的,如果能熟練掌握以上提到的教材,通過N3應該不是難事了,因為我就是這樣考過的!!


其實學到N3已經算是把日文的結構架好了,之後就是替這個結構添加筋瓦,至於要看那些書呢,就讓我們下期再會吧

2017年5月14日 星期日

c++ STL介紹

在C++這個複雜以及難懂的語言中,STL(standard template library)像是提供的一盞明燈,讓大家在汪洋大海有個指引的方向QQ,這麼強大的武器怎麼能不知道呢XD,就讓我們來一一道來吧!!
STL在C++裡面,屬於一種generic programming 的概念,中文將其譯為泛型程式設計,意思是不管任何的資料型態,我們都能用統一的模板(template)來處理,是不是很強大啊~


template在C++內分為兩種,分別是class template 和 fuction template, STL算是class template,其實STL可以分成幾部分,分別是:


1. container: 容器,也就是class template
2. iterator: 迭代器,用來指向container內的元素
3. algorithm: 演算法,這部用多說了吧XD


STL內部其實有非常多種的container,比如說大家熟知的vector,map,set,multimap,multiset...,令人眼花撩亂,之後且讓我一一道來吧!!!讓我們下期再會


參考資料:
1. C++教學手冊
2. edx

2017年5月12日 星期五

java arrayList 用法整理

arrayList 為Java內建的Class,功能超級強大,以下是其用法整理
1. 使用前先import:
import java.util.ArrayList;


2. 建構新arrayList: ArrayList <String> fruit = new ArrayList();
p.s. 切記一定要有後面這一段new的初始化,一定要有,否則編譯不會過
p.s. 不可用於primitive data type,例如int,double之類的

3. 加入元素:
fruit.add("Apple");
fruit.add("Banana");
P.S. 注意和C/C++一樣,index從0開始

4. 設定特定位置:
String desired= "Coconut";
Fruit.set(1,desired);
P.S. 可用來取代元素,如我的程式碼,將原本1號位置的"Banana"取代為Coconut

5.ArrayList 大小:
int num=fruit.size();
6. 遍歷所有元素:
for(int i=0;i<num;i++)
   system.out.println(fruit.get(i));




附上完整程式碼:

import java.util.ArrayList;


public class fruit{
 
  public static void main(String[] args){
  ArrayList<String>  fruit = new ArrayList<String>();

  fruit.add("Apple");
  fruit.add("Banana");

  String desired= "Coconut";
  fruit.set(1,desired);

  int num=fruit.size();

  for(int i=0;i<num;i++)
  System.out.println(fruit.get(i));
  }
}

2017年5月11日 星期四

OOP入門-2 class




好像脫稿了很久呢~笑,上一期我們提到了物件的基本概念,並在文章的結尾看到了類別(class)的概念,接下來就讓我們來了解何謂類別吧!!


p.s 上一期的連結:連結在此


Class,中文翻譯作類別,可以把它想成一種模板,用來描述物件的模板,一般都用車來舉例,假設我們要描述許多車,一台車可視為一個物件,然而一一描述實在是太麻煩了,於是我們用一個class來描述它,以下為Java code:
public class Car{

  private int x;//instance variable
  private int y;
  private int ori;

/**below shows constrcutor**/
  public Car(int xdis,int ydis, int dir){
    x=xdis;
    y=ydis;
    ori=dir;
  }


}

上述的程式碼可以看出幾個地方,第一個就是class的名稱和constructor的名稱必須一樣,再來就是程式碼內提到instance variable,新名詞噢~,意思就是之前提到用來描述物件的變數,此外當我們想要創建一個新的物件時,我們必須使用constructor(建構元),例如我們在程式中建照新的車,並給它幾個初始參數,如此一來,我們就能快速建立許多台車了呢,事情還不只這樣,我們還沒提到之前所說的method,就讓我們下期再會吧!!! 下期在此