본문 바로가기
python 및 머신러닝/Coding The Matrix

[Coding The Matrix] 코딩 더 매트릭스 - Chapter 3 벡터

by java개발자 2015. 8. 18.

# -*- coding: utf-8 -*- ''' Created on 2015. 8. 17. @author: Administrator ''' ''' chapter 3 vector ''' from myutil import consolePrintWithLineNumber as c from plotting import plot # 73p L = [[2, 2], [3, 2], [1.75, 1], [2, 1], [2.25, 1], [2.5, 1], [2.5, 1], [2.75, 1], [3, 1], [3.25, 1]] # plot(L, 4) # 74p def add2(v, w): return [v[0] + w[0], v[1] + w[1]] c(add2([4, 4], [1, 2])) c(add2([-4, -4], [1, 2])) # Task 3.4.3 def add2_1(v, w): return [[v[i][0] + w[0], v[i][1] + w[1]] for i in range(len(v))] c(add2_1(L, [1, 2])) # 75p # Quiz 3.4.4 def addn(v, w): return [v[i] + w[i] for i in range(len(v))] # n이 4인 경우 c(addn([1, 2, 3, 4], [1, 1, 1, 1])) # 약간 다른 방법(foreach 구문에 익숙하다보니 zip 보다는 range 가 편한다;;; 성능상 무엇이 더 빠를까????) def addn_1(v, w): return [x + y for x, y in zip(v, w)] c(addn_1([1, 2, 3, 4], [1, 1, 1, 1])) # 77p # Quiz 3.5.3 def scalar_vector_mult(alpha, v): return [alpha * v[i] for i in range(len(v))] c(scalar_vector_mult(4, [1, 2, 3])) # 80p # plot([scalar_vector_mult(i / 10, [2, 2]) for i in range(11)], 4) # plot([scalar_vector_mult(i / 100, [2, 2]) for i in range(101)], 4) # 82p # plot([add2(scalar_vector_mult(i / 100, [3, 2]), [0.5, 1]) for i in range(101)], 4) # 84p # Task 3.6.9 # A[3.5, 3] + B[0.5, 1], 0<=A<=1, B=1-A # plot([add2(scalar_vector_mult(i / 100, [3.5, 3]), scalar_vector_mult((1 - i / 100), [0.5, 1])) for i in range(101)], 4) # 85p # 블록결합 : 선분 # 아핍결합 : 무한 직선 # 86p class Vec: def __init__(self, labels, function): self.D = labels self.f = function v = Vec({'A', 'B', 'C'}, {'A':1}) for d in v.D: if d in v.f: c(v.f[d]) # 87p def setitem(v, d, val): v.f[d] = val setitem(v, 'B', 2.) def getitem(v, d): return v.f[d] if d in v.f else 0 c(getitem(v, 'A')) # 88p # 스파스 아님(아이템이 없는 경우 0으로 출력) def scalar_mul(v, alpha): return Vec(v.D, {d:alpha * getitem(v, d) for d in v.D}) c(scalar_mul(v, 2).f) c(scalar_mul(v, 2).D) # 딕셔너리의 items 함수 : 딕셔너리를 리스트-튜플 형태로 변형한다. # {'A': 1, 'B': 2.0} -> [('A', 1), ('B', 2.0)] # 스파스 (아이템이 없는 출력하지 않음) def scalar_mul_1(v, alpha): return Vec(v.D, {d:alpha * value for (d, value) in v.f.items()}) c(scalar_mul_1(v, 2).f) c(scalar_mul_1(v, 2).D) def add(u, v): return Vec(u.D, {d:getitem(u, d) + getitem(v, d) for d in u.D}) u = Vec(v.D, {'A':5., 'C':10.}) c(add(u, v).f) # 89p def neg(v): return Vec(v.D, {k: value * -1 for (k, value) in v.f.items()}) c(v.f) c(neg(v).f) # 97p def list_dot(u, v): return sum([u[i] * v[i] for i in range(len(u))]) c(list_dot([1, 2, 3], [4, 5, 6])) def list_dot_1(u, v): return sum([x * y for (x, y) in zip(u, v)]) c(list_dot_1([1, 2, 3], [4, 5, 6])) # 104p # 책에는 dot(...) 이라고 되어 있는데, list_dot(...)이 맞다. def dot_product_list(needle, haystack): s = len(needle) return [list_dot(needle, haystack[i:i + s]) for i in range(len(haystack) - s)] c(dot_product_list([1, 0, 1], [1, 0, 0, 1, 0, 1, 1])) # 선형필터 # 105p # 두번째 도트곱 그림이 잘못되었다. # 학습 속도가 너무 더디다....잠시 쉼.

콘솔결과
21 >  [5, 6]
22 >  [-3, -2]
27 >  [[3, 4], [4, 4], [2.75, 3], [3, 3], [3.25, 3], [3.5, 3], [3.5, 3], [3.75, 3], [4, 3], [4.25, 3]]
35 >  [2, 3, 4, 5]
39 >  [2, 3, 4, 5]
46 >  [4, 8, 12]
73 >  1
79 >  1
85 >  {'B': 4.0, 'C': 0, 'A': 2}
86 >  {'C', 'A', 'B'}
93 >  {'A': 2, 'B': 4.0}
94 >  {'C', 'A', 'B'}
99 >  {'B': 2.0, 'C': 10.0, 'A': 6.0}
104 >  {'A': 1, 'B': 2.0}
105 >  {'A': -1, 'B': -2.0}
110 >  32
113 >  32
120 >  [1, 1, 0, 2]