2017年4月28日 星期五

Python 畫圖工具整理

   在理解maching learning 時,發覺將data 可視化是非常重要的,整理目前python 畫圖工具及範例。

Matplotlib 畫圖工具

figure and subplot

所有的圖資訊都是在figure 物件中,figure 就像是畫布一樣,因此畫圖前必須先呼叫。subplot 是在figure 上定義有幾張圖表,如果沒有呼叫subplot,就是只有一張圖:

figure 範例:

from matplotlib import pylab as plt
plt.figure(figsize=(6,6))
plt.title('test')
plt.show()




















2017年4月27日 星期四

Word2Vec model Introduction (skip-gram & CBOW)

   在Udacity 的課程" Deep learning" 有學到如何處理文字數據,在此做個筆記,以免未來忘記
以下文字內容是我理解後整理的筆記,但codes 來自課程作業,不是我原創。Deep learning API為 tensorflow
課程網址:https://classroom.udacity.com/courses/ud730

Word2Vec

     要讓機器能夠學習,要學習事物必須定義其特徵,才有辦法學。像是腫瘤,如果要讓機器學會判定是良性或惡性,特徵可以定義為"腫瘤大小、密度、基因有無突變" 等等,然後將良性及惡性腫瘤特徵餵給機器學習。而Word2Vec就是一個將單一文字變成特徵向量的演算法

    文字跟圖像資料不同,圖像的理解主要跟自己圖內的pixel 排列組合有關,所以其特徵跟自身有關,但文字的理解由前後文的關係來決定。兩個不同的字例如 cat 跟 kitty ,如果再文章中出現時,前後文都一樣,就可判斷兩個是一樣意思的文字,特徵就要長一樣。而Word2Vec作法就是輸入文字,輸出預測其前後文字。model 是兩層全連接 neural network model (1 hidden layers) 。

假設data base 有N個vocabulary,model 示意圖如下:















Input layer

Input layer 是one-hot encoding ,Size 等於N.  Input layer 中每一個element 都對應一個vocabulary 中的words,0表示沒輸入,1表示輸入該word.

2017年4月7日 星期五

Installation of Nvidia driver/Cuda 8.0/Cudnn 5.1 on Ubuntu


系統&硬體配備

GPU: GTX1060 6G
OS system: Ubuntu 16.04.02

Driver 安裝 (版本 375.xx)



Step1: 禁用可能导致问题的开源驱动,编辑 /etc/modprobe.d/blacklist.conf

sudo vim /etc/modprobe.d/blacklist.conf
添加以下内容:

blacklist amd76x_edac
blacklist vga16fb
blacklist nouveau
blacklist nvidiafb
blacklist rivatv

Step2: 卸载干净所有安装过的nvidia驱动

sudo apt-get remove --purge nvidia-*

执行以下命令添加驱动源

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update

Step3:以下步骤建议 Ctrl+Alt+F1 切换到 tty1 执行

sudo service lightdm stop sudo apt-get install nvidia-375 nvidia-settings nvidia-prime sudo apt-get install mesa-common-dev (不確定用處,照網路上指示安裝) sudo apt-get install freeglut3-dev (不確定用處,照網路上指示安裝) sudo nvidia-xconfig (不確定用處,照網路上指示) sudo update-initramfs -u (實寄執行 出現問題) sudo reboot (重開機)

Step4: 輸入指令 "nvidia-smi"確認安裝成功
















2017年4月5日 星期三

找中位數 [C++]

在一維的float array1 中,找出中位數 (不包含等於0的數字)
我是另外建立一個同樣大小的array2, 初始值為0。 然後把array1 中的元素由小到大從左到右放入array2 中 再找出中位數。
////code////
float array1[10]={12.3 , 13.5 , 22.6 , 65.4 , 0 , 0 , 0 , 4.4 , 0 , 21};
float array2[10]={0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0};

/// 將 array1 由小排到大放到 array2 中 
int non_O_count=0;
int max_index=-1;
float median_num=0;
for (int i=0; i<10 0="" array1="" array2="" element="" for="" i="" if="" int="" j="" k="" max_index="" non_o_count="">j ; k--) array2[k]=array2[k-1];//較大的element 往右平移
            array2[j]=array1[i];
            max_index++;
            break;
         } 
      }
      if (j > max_index) array2[++max_index]=array1[i];//比現存所有element大,從最右插入
    } 
}

/// 計算中位數 ///
if (non_O_count != 0)
   if (non_O_count%2 != 0)
     median_num=array2[(int)(non_O_count/2.0+0.5)-1];
   else
     median_num=(array2[non_O_count/2-1] + array2[non_O_count/2] ) / 2;

結果如下