DIKW
DATA–>INFOMATION–>KNOWLEDGE–>WISDOM
資料–>資訊–>知識–>智慧
爬蟲–>資料庫–>資料分析–>機器學習
- 資訊:通過某種方式組織和處理資料,分析資料間的關係,資料就有了意義
- 知識:如果說資料是一個事實的集合,從中可以得出關於事實的結論。那麼知識(Knowledge)就是資訊的集合,它使資訊變得有用。知識是對資訊的應用,是一個對資訊判斷和確認的過程,這個過程結合了經驗、上下文、詮釋和反省。知識可以回答“如何?”的問題,可以幫助我們建模和模擬
- 智慧:智慧可以簡單的歸納為做正確判斷和決定的能力,包括對知識的最佳使用。智慧可以回答“為什麼”的問題。回到前面的例子,根據故障對客戶的業務影響可以識別改進點
數學
微積分
1 # import math 2 # s = 0 3 # for i in range(1, 1001): 4 # x = (math.pi / 1000) * i 5 # y = math.sin((math.pi / 1000) * i) 6 # s = (math.pi / 1000) * y + s 7 # print(s)
1 # import numpy as np 2 # def sin_integral(l,r,p): 3 # sum_result = 0 4 # delta = (r - l) / p 5 # for i in range(p): 6 # left = i * delta 7 # delta_area = delta * np.sin(left) 8 # sum_result += delta_area 9 # return sum_result 10 # print(sin_integral(0.0,np.pi,100000))
numpy
1 # coding=utf-8 2 import numpy as np 3 import matplotlib.pyplot as pt 4 5 # x的3次方 6 # X = np.linspace(-100, 100, 100) 7 # Y = X * X * X 8 9 # tan 10 # X = np.linspace(-np.pi//2,np.pi//2,1000) 11 # Y = np.tan(X) 12 13 # log 14 # X = np.linspace(-10,10,100) 15 # Y = np.log(X) 16 # 17 # pt.plot(X, Y) 18 # pt.show() 19 20 # ----------------------------------------------------------------------- 21 22 # 雞兔同籠 23 # for x in range(36): 24 # y = 35 - x 25 # if x+2*y == 47: 26 # print(x,y) 27 28 # sinx面積0-pi 29 # import math 30 # s = 0 31 # for i in range(1, 1001): 32 # x = (math.pi / 1000) * i 33 # y = math.sin((math.pi / 1000) * i) 34 # s = (math.pi / 1000) * y + s 35 # print(s) 36 # 承上封裝為函式 37 # import numpy as np 38 # def sin_integral(l,r,p): 39 # sum_result = 0 40 # delta = (r - l) / p 41 # for i in range(p): 42 # left = i * delta 43 # delta_area = delta * np.sin(left) 44 # sum_result += delta_area 45 # return sum_result 46 # print(sin_integral(0.0,np.pi,100000)) 47 48 # -------------------------------------------------------- 49 # a = np.arange(18).reshape(3, 6) #二維陣列矩陣 50 a = np.arange(24).reshape(2,3,4) #三維陣列矩陣 51 # print a 52 # print a.ndim #矩陣維數 53 # print np.ndim([[1,1],[2,2]]) #矩陣維數 54 # print a.dtype.name #數值型別 int32 55 # print a.size #元素個數 56 # print a.itemsize #每個陣列元素的位元組大小 57 # print type(a) #a的型別 58 59 b = np.array([[1.2, 2, 3], [4, 5, 6]]) 60 # print b.dtype #float64型別的陣列 61 62 c = np.array([[1, 1], [2, 2]], dtype=complex) 63 # print c,c.dtype #複數型別complex128型別的陣列 64 65 z = np.zeros((3, 4)) 66 # print z #建立全零陣列,預設為float64形式 67 68 o = np.ones((2, 3, 4), dtype=np.int16) 69 # print o 70 # 建立一個三維全1的陣列,並且建立時指定型別,可以認為是一個長方體裡有序的充滿了1 71 #兩層,每一層是三行四列的二維陣列 72 73 e = np.empty((2,3)) 74 # print e #建立一個二維空陣列,電腦不同顯示不同 75 76 # f = np.arange(1,9,2) 77 f = np.arange(0,3,0.5) 78 # print f #[1 3 5 7],2和0.5為步進值 79 80 # print np.arange(10000) #如果陣列太大而無法全部列印,NumPy會自動跳過中央部分,只能列印出邊界部分(首尾) 81 # np.set_printoptions(threshold=`nan`) #禁用此省略並強制NumPy列印整個陣列,使用set_printoptions更改列印選項 82 # print np.arange(10000).reshape(100,100) 83 84 a = np.array([20,30,40,50]) 85 b = np.arange(4) 86 # print a-b #相減 87 # print b**2 #平方 88 # print 10*np.sin(a) #a陣列先進行sin運算,然後結果乘10
運算
階乘
np.math.factorial(100)
對數
np.log()
開方
1.準備每一個條件的資料表示 2.準備程式的邏輯 3.將你的資料應用到邏輯 4.優化結構
1 # np.sqrt(3) 2 3 # A = (2, 7) 4 # B = (8, 3) # 歐幾里得距離 5 # AB = np.sqrt((A[0] - B[0]) ** 2 + (A[1] - B[1]) ** 2) 6 # print AB
三角函式
- np.arctan()
- np.cos()
- np.sin()
- np.rad2deg()——弧度轉角度
- np.deg2rad——角度轉弧度
- ……
1 # x = np.array([3, 0]) + np.array([0, 3]) 2 # x = np.array([3,3]) 3 # l = np.linalg.norm(x) #向量x的範數(長度) 4 # h = np.arctan(3.0/3.0) #計算弧度 π/4 5 # j = np.rad2deg(h) #弧度轉角度 45度 6 # np.deg2rad() #角度轉弧度 7 # print j
點乘
numpy陣列 (向量) 預設的 +-*/ 操作都是對應位置的元素相操作
1 array1.dot(array2) 2 3 # d1 = np.array([2, 7]) 4 # d2 = np.array([8, 3]) 5 # print d1.dot(d2) #點乘(內積) 2*8+7*3 結果:實數
1 # 餘弦相似度,向量內積,對應元素相乘再相加 2 ``` 3 設兩個向量分別為a=(x1,y1),b=(x2,y2), 4 其夾角為α,因為ab=|a||b|cosα, 5 所以cosα=ab/|a||b|=(x1y1+x2,y2)/(根號(x1^2+y1^2)根號(x2^2+y1^2)) 6 ``` 7 # d12 = d1.dot(d2) #d1·d2 8 # d1_len = np.linalg.norm(d1) #|d1| 9 # d2_len = np.linalg.norm(d2) #|d2| 10 # cosa = d12 / (d1_len * d2_len) #餘弦值cosa 11 # a = np.rad2deg(np.arccos(cosa)) #角度a 12 # print a
複數
1 # a = 1 + 2j #複數 complex 2 # b = 2 + 3j #泰勒級數,傅立葉級數 3 # print a,type(a),a*b,a-b
1 # np.nan #not a number 當資料讀取缺失或計算異常時會出現,本質是一個浮點數 2 # np.exp(10) #以e為底的指數 3 # np.log(10) #以e為底的對數,即ln 4 # np.e #e,2.71828182 5 # np.inf #無窮大
函式
空陣列
預設值是0或正無窮或負無窮
實數在計算機裡只能用浮點數無限逼近精度,不能確切表示,所以在處理0的時候要格外小心 ;a – b < 0.1e-10 相減的時候當結果小於一個極小的數值就認為相等
np.empty((3, 3))
陣列
向量是有方向和長度的變數,可以用numpy的多位陣列來表示,二維向量就是平面的一個點
1 np.array([[1,2,3],[4,5,6]])
範數
向量的範數(長度)
np.linalg.norm(np.array([3,3]))
型別轉換
1 array.astype(np.int)
陣列資訊
1 array.shape 2 array.shape[0] 3 array.shape[1]
1 # 使用兩個向量相減,可以計算兩點距離 2 d1 = np.array([2, 7]) 3 # d2 = np.array([8,3]) 4 # np.linalg.norm(d1-d2) 5 # d1.astype(np.int) #將陣列型別強制轉換為int 6 # d1.shape #返回陣列的行列數 7 # d1.shape[0] #返回陣列的行數 8 # d1.shape[1] #返回陣列的列數
均分
# np.linspace()
1 # xs = np.linspace(-1000, 1000, 10000) 2 # idx = [] 3 # max_result = [] 4 # for x in xs: 5 # y = -3 * (x ** 2) + 5 * x - 6 6 # idx.append(x) 7 # max_result.append(y) 8 # print max(max_result),idx[max_result.index(max(max_result))] 9 10 # def poly_test(l,r): 11 # r_len = r - l 12 # max_num = l 13 # m_idx = l 14 # for i in range(r_len): 15 # r_num = l + i 16 # result = (r_num ** 2) * -3 + (5 * r_num) - 6 17 # if result > max_num: 18 # max_num = result 19 # m_idx = i 20 # return max_num,m_idx 21 # print poly_test(-10000,10000)
1 # 在X軸上生成2000個從-10000到10000的離散點 2 # 使用向量計算直接生成對應上述多項式的所有結果,這裡沒有使用迴圈,一次計算了20000個結果 3 # X = np.linspace(-1000, 10000, 20000) 4 # Y = (X ** 2) * -3 + 5 * X - 6 # 向量運算,計算機會加速此類運算 5 # Y.max() # 獲取當前向量的最大值 6 # Y.argmax() # 獲取當前陣列最大值對應的索引(X值,不是函式中的X)
陣列切片
二維陣列
1 n_array = np.arange(25).reshape(5, 5) 2 # print n_array #第一個數選行,第二個選列 3 # print n_array[:,:2] #前兩列 4 # print n_array[:3,:] #前三行 5 # print n_array[1:4,1:4] #1-3行且1-3列 6 # print n_array[2,2] #第3行的第3個數 7 # print n_array[2][2] #同上 8 # print n_array[::-2] #隔行選擇 9 # print n_array[::2]
三維陣列
1 n3_array = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [3, 2, 1]], [[6, 5, 4], [9, 8, 7]]]) 2 # print n3_array #第一個數選層,第二個數選行,第三個數選列 3 # print n3_array[:,:,2] #最後一列 4 # print n3_array[:,:1,:].sum() #每一層的第一行 5 # print n3_array[:1,:,:].mean() #平均值 6 # print n3_array[:,1,:2].std() #方差小,更穩定
陣列元素選取
1 # d1 < 3 #返回滿足條件的布林型別矩陣 2 # np.count_nonzero(d1 < 3) #統計陣列中小於3的元素個數 3 # d1[d1<3] #選出指定範圍的元素
學生成績案例
資料準備
1 # score_array = np.loadtxt(open(`score.csv`, `rb`), delimiter=`,`, dtype=int) 2 score_array = np.genfromtxt(`score.csv`, delimiter=`,`, dtype=int) 3 students = [] 4 courses = [`數學`, `語文`, `化學`, `地理`, `音樂`, `體育`]
課程成績最好
1 def course_score(): 2 course_score_max = 0 3 cid_max = -1 4 for c in range(6): 5 course_score = score_array[:, c].sum() 6 print course_score 7 if course_score_max < course_score: 8 course_score_max = course_score 9 cid_max = c 10 return courses[cid_max], course_score_max
學生成績最好
1 def student_score(): 2 student_score_max = 0 3 sid_max = -1 4 for s in range(6): 5 student_score = score_array[s, :].sum() 6 print `{}號學生成績:{}分`.format(s, student_score) 7 if student_score_max < student_score: 8 student_score_max = student_score 9 sid_max = s 10 return `{}號學生成績最好,總分為{}分`.format(sid_max, student_score_max)
學生偏科
1 def pian(): 2 pian_max = 0 3 pid_max = -1 4 for p in range(6): 5 student_score_std = score_array[p, :].std() 6 print `{}號學生成績方差為:{}`.format(p, student_score_std) 7 if pian_max < student_score_std: 8 pian_max = student_score_std 9 pid_max = p 10 return `{}號學生偏科,方差為:{}`.format(pid_max, pian_max)
主課成績最好
1 def main_course_score(): 2 main_course_score_max = 0 3 cid_max = -1 4 for c in range(3): 5 main_course_score = score_array[:, c].sum() 6 print main_course_score 7 if main_course_score_max < main_course_score: 8 main_course_score_max = main_course_score 9 cid_max = c 10 return cid_max, main_course_score_max
該班主課副課對比哪個成績好
1 def than(): 2 main_course_std = 0 3 side_course_std = 0 4 for t in range(3): 5 main_course_std += score_array[:, t].std() 6 main_course_std /= 3 7 for t in range(3, 6): 8 side_course_std += score_array[:, t].std() 9 side_course_std /= 3 10 if main_course_std > side_course_std: 11 return `該班主課成績更好` 12 else: 13 return `該班副課成績更好`
這個班有多少學生出現了不及格
1 def bad(): 2 badstudent = [] 3 for b in range(6): 4 if min(score_array[b, :]) < 60: 5 badstudent.append(b) 6 # print `{}學生不及格`.format(b) 7 return `不及格學生:{}`.format(badstudent)
封裝成類
1 name_dic = {0: `數學`, 1: `語文`, 2: `化學`, 3: `地理`, 4: `音樂`, 5: `體育`} 2 3 4 class CoursaDesc(object): 5 def __init__(self): 6 self.name = `` 7 self.std = 0 8 self.max = 0 9 self.min = 0 10 self.mean = 0 11 self.num = 0 12 13 14 class ComputerDesc(object): 15 def __init__(self, n_array): 16 self.score_array = n_array 17 self.result = [] 18 19 def counter_all_coursa(self): 20 for i in range(6): 21 c_desc = CoursaDesc() 22 c_desc.name = name_dic[i] 23 c_desc.std = self.score_array[:, i].std() 24 c_desc.mean = self.score_array[:, i].mean() 25 c_desc.max = self.score_array[:, i].max() 26 c_desc.min = self.score_array[:, i].min() 27 c_desc.sum = self.score_array[:, i].sum() 28 self.result.append(c_desc) 29 30 def best_coursa(self): 31 # std_list = [coursa.std for coursa in self.result] 32 # sum_list = [coursa.sum for coursa in self.result] 33 std_list = [] 34 sum_list = [] 35 for coursa in self.result: 36 std_list.append(coursa.std) 37 sum_list.append(coursa.sum) 38 std_array = np.array(std_list) 39 sum_array = np.array(sum_list) 40 41 max_sum_coursa = sum_array.max() 42 max_sum_index = sum_array.argmax() 43 44 min_std_coursa = std_array.min() 45 min_std_index = std_array.argmin() 46 47 if max_sum_index == min_std_index: 48 return name_dic[max_sum_index] 49 else: 50 # 方差最小的課程的成績總和 51 min_std_coursa_sum = sum_array[min_std_index] 52 # 總和成績最大的課程的方差 53 max_sum_coursa_std = std_array[max_sum_index] 54 55 sum_delta = max_sum_coursa - min_std_coursa_sum 56 std_delta = max_sum_coursa_std - min_std_coursa 57 sum_percent = sum_delta / max_sum_coursa 58 std_percent = std_delta / min_std_coursa 59 if sum_percent < 0.05 and std_percent > 0.2: 60 return name_dic[min_std_index] 61 62 if __name__ == `__main__`: 63 c = ComputerDesc(score_array) 64 c.counter_all_coursa() 65 print c.best_coursa()