2018年12月4日 星期二

人工智能入門概念Introduction to Artificial Intelligence (AI)

人工智慧將定義下一代軟體解決方案。這個計算機科學課程提供了人工智慧的概述,並解釋瞭解如何使用它來構建智慧的應用程式,幫助組織提高效率,豐富人們的生活。

 AI並非新科技,但近來由於

1. 大數據的興起,數據科學的發展(Hadoop,Spark), 大部分資料數位化及互聯網。可以取得大量的學習數據。
2. CPU,GPU變快,有助於機器學習。

AI的方法

了解機器學習如何用於構建AI的預測模型。了解如何使用軟體從自然語言中處理,分析和提取意義,圖像分析,文本分析和視頻。了解如何構建智能機器人,實現人與AI系統之間的對話溝通。

機器學習

當我們說機器學習時,我們指的是收集數據,分析其含義並根據數據模式找到解決方案的完整循環方法。了解學習演算法的不同方法以及哪些方法最適合具體問題也很重要。
 演算法有回歸regression,分類classification,分群Cluster analysis。
基本概念是讓機器從數據中學習,可以對未知數據進行預測。
K線預測
工具-數學,統計學
工具-程式語言-ptyhon............
使用Python進行人工智慧的一個主要優點是它有很多相關的模組可以使用。例如,NumPy,SciPy,matplotlib,nltk,SimpleAI。

深度學習Deep learning(神經網路)

能夠讓電腦自行抽取特徵值,以進行學習。深度學習對圖像分析,文本分析和視頻更有用。最常見的是該演算法使用神經網絡來實現學習。
深度這個詞來自於數據是多層次而大多數演算法只使用一個的想法。

神經網絡

這是一個高效的計算系統網絡,靈感來自生物神經網絡。 ANN可用於機器人,語音識別,語音處理等。
多層(每一層有神經元數量)
權重(各種百分比),AlphaGo
機率向量

強化學習

重點是使用最新信息來不斷改進模型。該方法適用於機器人,經濟學和遊戲(alphago)。

電腦視覺

視覺系統,解釋和理解計算機上的視覺輸入。

認知學習

是指將許多系統一起用於創建幾乎可以作為人類行事的模型。它們主要用於聊天機器人,虛擬個人助理和問答系統。

自然語言處理(NLP)

可以與理解人類自然語言的計算機進行交互。

AI的領域及應用

*無人車駕駛
*醫療預防
*智能機器人


二元樹&排序Binary search tree

演算法 & 資料結構

#自己的定義
電腦的資料說穿了就只有0和1,怎麼擺放0和1就是資料結構。
怎麼用和算就是演算法。

電腦要如何完成「排序」(sort) 這件工作呢?「二元樹」 (binary tree) 怎樣子應用在排序這項工作呢?

二元樹是數據結構。 它的關鍵特徵是樹中的每個節點最多可以有兩個子節點,它們按值排列,左邊的子節點值較低,右邊節點較高。

樹狀結構Trees

樹柱結構是一種非線性結構。例如族譜,組織架構。在資料科學方面可以應用到電腦的作業系統和資料庫管理。像我們最常看的排序就是一種運用。
Decision tree
當然機器學習中的決策樹也是一種應用

Binary Tree: Traversal(尋訪)
連結串列Linked list

樹的結構與規範

01. 樹根root
02.節點node
node為n個互斥的集合,n>=0,互斥的集合也是一棵樹稱為子樹
03.不能有重邊
04.不能有迴圈
05.不能不連通
06. 分支度(Degree)
07. 階層(Level)
08. 高度(Height)
09. 終端節點(Terminal Nodes)
10. 父節點(Parent)
11.  子節點(Children)

建立一排數列為: 55,70,30,65,20,25,35,85

*中序法依序排列
root=55
70>55,在55右邊
30<55,在55左邊
65>55,在55右邊,但65<70,在70左邊
以此類推



#python二元樹排序
*定義Tree
class Node:
         def __init__(self, val):
            self.l_child = None
            self.r_child = None
            self.data = val
*插入node
r = Node(55)
binary_insert(r, Node(70))
binary_insert(r, Node(30))
binary_insert(r, Node(65))
binary_insert(r, Node(20))
binary_insert(r, Node(25))
binary_insert(r, Node(35))
binary_insert(r, Node(85))

def binary_insert(root, node):
       if root is None:
             root = node
       else:
           if root.data > node.data:
                  if root.l_child is None:
                        root.l_child = node
                  else:
                        binary_insert(root.l_child, node)
           else:
                  if root.r_child is None:
                        root.r_child = node
                  else:
                        binary_insert(root.r_child, node)

def in_order_print(root):
       if not root:
             return
       in_order_print(root.l_child)
       print(root.data)
       in_order_print(root.r_child)

def pre_order_print(root):
       if not root:
             return
       print(root.data)
       pre_order_print(root.l_child)
       pre_order_print(root.r_child) 

in_order_print(r)

2018年12月1日 星期六

Recursion遞迴

遞迴是那些聽起來比實際更令人生畏的概念之一。老實說。要利用它,你不需要掌握複雜的數學思想;或者從四個維度開始思考;或者一個接一個地接受某個人的夢想將一個想法植入他們的潛意識中,或甚至理解遞迴的含義。

在大多數情況下,遞迴的許多用法都有很好的參考文件和實例。然後,你可以將它們複製並貼上到程式碼中,而無需了解它們的運作的方式,也不用知道它們為什麼要這樣做。但如果你這樣做,你會錯過很有意思的遞迴。在編寫幾行程式碼後,遞迴是讓CPU完成困難度高的工作的最佳方法之一;因此,它可以幫助你避免在沒有遞迴的情況下需要或可能去解決更複雜的問題。

這是因為遞迴是通過重複一個簡單函數來解決更複雜問題的一種方法。訣竅是這個功能函數從內部作迴圈。它不是從另一個函數起動運行原函數,而是從自己的代碼中調用自己的另一個自己。這種programming相當於將兩個鏡像子面對面創建出看似無限的鏡子,遞迴的一個經典且最簡單的示例是一個函數的階乘。正整數的階乘。例如,4的階乘是4x3x2x1,等於24

#用for寫階乘
<?php
function factorial($n){
    $result = 1;
    for ($i=2; $i<=$n; $i++) {
            $result *= $i;
    }
return $result;
}
echo factorial(4);
?>

#用遞迴階乘
<?php
function factorial($n) {
    return $n == 0 ? 1 : $n*factorial($n-1);
}
echo factorial(4)."<br>";
?>

#費氏數列Fibonacci Sequence:
兔子繁殖說明
Fn=Fn-1+Fn-2,n>=3
F1=F2=1
1->1->2->3->5->8->13->21(從3開始每一項都是前兩項之和)

#python費氏數列:
def Fib(n):
if n == 0:
return 0;
elif n == 1:
return 1;
return Fib(n-1) + Fib(n-2)

print(Fib(4))

#遞迴樹Recusive Trees
從上面的圖可以觀察到,每一次函式往下的呼叫,最後都會停在 Fib(1) 或 Fib(0),因為這兩項是唯一在計算費氏數列時先被定義的。因此找到這兩項後,就可以開始往前加總出其他項的值,而往前加總的順序如下:
由圖可知Fib(4)共呼叫9次
f(0) = 0 , 1次
f(1) = 1 , 1次
f(2) = f(0) + f(1) , 1+1+1=3 次
f(3) = f(2) + f(1) , 3+1+1=5 次
f(4) = f(3) + f(2) , 5+3+1=9 次

因此導出呼叫次數為 "f(n)=f(n-1)+f(n-2)+1"
費氏數列後面再加個1就是答案了  

自然界實例
有趣的是,如果初生結構之間的角度是黃金角度,螺旋線的數目就往往是「費氏數列」中的數。費氏數列最先由13世紀的意大利數學家萊奧納爾多·斐波那契提出。這個數列中,在1之後的每個數都是前兩個數的和,即是1,1,2,3,5,8,13,21,34,55……如此類推。

許多呈螺旋圖案的植物,花瓣數目往往是費氏數列中的數。有些人觀察到,毛茛的花有5塊花瓣,美洲血根草有8塊,柳蘭有13塊,紫菀有21塊,春白菊有34塊,美國紫菀則有55塊或89塊。(圖六)在水果和蔬菜中也可以找到跟費氏數列有關的數字。例如,香蕉的橫切面是一個五邊形。






土角厝rammed earth house:

土角厝rammed earth house:
為一種傳統房屋的建築方式,主要是以稻草攪泥、經過日曬後所製成之土角磚堆疊成房屋牆壁,並以稻草、瓦片或芒草覆蓋以作為屋頂。有些土角厝則會於房屋外層再塗上石灰及泥土修飾。
材料:
黏土*1,沙子*3,水不等,稻草


step1.
和沙子,水,黏土。比例3:1:不等


step2.
測試是否合格,揉成團往地上丟


step3.
整理稻草


step4.
和稻草(稻草的功用類似鋼筋)


setp5.
放入模子並曬乾




step6.
wall



也可以作窯
earth oven
earth killn



2018年11月30日 星期五

堆疊(Stack)& 佇列(Queue)

在解釋基本程式概念時,很難知道從哪裡開始。當有人開始編碼時,有大量不同的想法需要理解,吸收並最終轉化為解決方案。這取決於您所選語言的語法和特性。

最好的方法之一就是通過練習題來開始編寫程式碼。好像購物清單的使用,無論度假還是超市購物。程式碼中的列表邏輯就像在現實生活中清單一樣。清單很容易處理瑣事和片段的記憶。例如,在Python中,您可以如此建立一個購物清單(陣列)

shoppinglist = ["rice","salt","oil"]
print(shoppinglist)
['rice', 'salt', 'oil']

push() pop()
3.oil
2.salt
1.rice

這是一個陣列,因為每個值本身就是一個字串。但是陣列是動態的,您經常要做的第一件事就是新增資料,如何增加新資料是一個學問。例如,CPU如何增加法運算速度更快,或是以最好的方式將資料放在記憶體內,是從後面加好呢,還是從前面加。

堆疊
網路上大部分的人都是用疊書來做比喻,疊最高的也就是最後一本必須先拿,成為後進先出LIFO(Last In First Out)或者先進後出FILO(First In Last Out)的例子。我們也可以把它想做是Linux command列的歷史紀錄查詢一樣我們會先查最後一筆然後一直往上查,或是查看瀏覽器之前看過的頁面可以用上一頁網上查做作為後進先出的例子。

Python中可用append增加一筆資料
shoppinglist.append("tea")
print(len(shoppinglist))
4

push() pop()
4.tea
3.oil
2.salt
1.rice

Python中可用pop()取出一筆資料
shoppinglist.pop()  
print(shoppinglist)
['rice', 'salt', 'oil']

a stack
push() pop()
4.tea
3.oil
2.salt
1.rice

push()
將資料放入堆疊頂端
pop()
取出堆疊頂端之資料

心得
從最後一筆取得資料的時候處理器可以處理的較快。另外,索引也不用重建。

應用..........
CPU中斷處理
遞迴程式
十進位轉二進位
套環遊戲
字串反轉

佇列
a queue
先進先出法FIFO(First In First Out)
雖然新增或移除資料時,同步修改索引位址,浪費資源。但今日處理器的速度已經不在乎是先進先出或後進先出

shoppinglist.pop(0)     
'rice'
從第1筆取出
print(shoppinglist)     
['salt', 'oil']

pop() 1.rice 2.salt 3.oil push()

for x in range(0,len(shoppinglist)):
...  shoppinglist[x]
...  print
... 
'salt'
'oil'

陣列的建立會有一個索引來記錄目前所指到的位址,新增或移除資料時,同步修改索引位址

應用..........
大多數的程式運用

2018年11月29日 星期四

PHP超全域變數(_ENV,_REQUEST,_GLOBALS)

#超全域變數—$_ENV

#超全域變數—$_REQUEST
$_REQUEST — HTTP Request 變數
預設情況下包含了$_GET,$_POST 和$_COOKIE 的陣列。

以命令行方式運行時,將不包含argv 和argc 信息;它們將存在於$_SERVER 陣列。
import_request_variables() - 將GET/POST/Cookie 變數導入到全域作用域中

#超全域變數—$GLOBALS
$GLOBALS
引用全域作用域中可用的全部變數,一個包含了全部變數的全域組合陣列。
變數的名字就是陣列的索引。
範例:
<?php
function test() {
    $foo = "local variable";
    echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";
    echo '$foo in current scope: ' . $foo . "\n";
}
$foo = "Example content";
test();
?>

以上例程的輸出類似於:
$foo in global scope: Example content
$foo in current scope: local variable

PHP Note

 #php版本 

5.4
 
5.5
 
7.4

#PHP執行時的順序
php 執行中插入的javascript會等到php執行完才會執行javascript。因為php是server side會先執行然後才是client side的javascript。

#PHP 的等號
一個等號
給值的意思。例如 $a = 5; $b="equal"; $c='$a';
二個等號
等於的意思。 例如 if (a==b) do something.
三個等號
等於的意思。等於的意思。還包含類型的相等。

#PHP 如何回到上一個頁面(URL)?
被拒絕的頁面
if (!$FX_grantAccess) {//沒有權限登入
  $FX_qsChar = "?";
  if (strpos($FX_authFailedURL, "?")) $FX_qsChar = "&";
  $FX_referrer = $_SERVER['PHP_SELF']; //獲得當前頁面URL
  if (isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0) $FX_referrer .= "?" . $_SERVER['QUERY_STRING']; //獲得當前頁面URL的變數
  $FX_authFailedURL = $FX_authFailedURL . $FX_qsChar . "accessdenied=" . urlencode($FX_referrer);//沒有權限被導引到登入的頁面,並夾帶目前頁面URL變數$accessdenied
  header("Location: $FX_authFailedURL");
  exit;
}

登入的頁面
if (isset($_GET['accessdenied'])) $_SESSION['PreUrl'] = $_GET['accessdenied']; //如果有$accessdenied,紀錄上一個URL

if (isset($_SESSION['PreUrl']) && true) $redirectLoginSuccess = $_SESSION['PreUrl']; ////如果有$accessdenied,前往上一個URL
       header ("Location: $redirectLoginSuccess");
       exit;

#MySQL中使用null或空值
如果我們用SQL下插入指令,為什麼還可以插入空值呢?但用textfield插入空值為什麼就會報錯呢?
INSERT INTO "表格名" ("欄位1", "欄位2", ...) VALUES (" ", "值2", ...); 在欄位設定為 not null 可以被執行。
但用textfield插入空值為什麼就會報錯。
在SQL中,null與空字串(“”)有很大不同。空字串具體表示該值被設定為空的;null表示未設置任何值。
所以用textfield插入空值時被視為是沒有設定任何值。也就是null。
解決方法是判斷textfield沒有值時,給他一個空字串。
空值是不佔用空間的,MySQL中的NULL其實是佔用空間的。所以如果欄位可以為NULL,索引的效率會下降很多。

#在PHP中使用mb_substr解決亂碼問題
string substr(string 處理的字串, int 起始位置, int長度)
string mb_substr(string 處理的字串, int 起始位置, int長度, 編碼方式)
substr 和 mb_substr 基本上相同,但mb_substr多了一個引數,可以讓程式知道在int長度上,一個字的長度是哪一種編碼。
$str="這是一個測試字串";
echo substr($str,0,7);
這是??(亂碼)
3  3  1   byte    ASCII碼
substr()以1位元組為單位,所以中文字被切掉了。
$str="這是一個測試字串";
echo mb_substr($str,0,4,'utf8'); 或  echo mb_substr($str,0,4,"UTF-8");
這是一個
1  1  1  1   utf8