Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

BASEMENT

Python 6주차 - 1 본문

Programming/Python

Python 6주차 - 1

2_34 2020. 7. 26. 19:11

 

파이썬 실습

1. 중복 없는 튜플 형태 (ex: (9,2,4,5)) 를 입력하면

{9},{9,2},{9,2,4},{9,2,4,5} 형태로 리스트에 담아서 출력

def tuple_ss(ts):
    result = []
    s = ts[1:len(ts)-1].replace("},","}=").split("=")   # ts[1:len(ts)-1] : {} 제거 // {},{},{} 상태를 {}={}={}로 변경후 '=' 기준으로 분리
    s = sorted([x[1:len(x)-1].split(',') for x in s], key=lambda x: len(x)) 
    result = [int(i) for i in s[-1]]            # {1,2,3}을 {1,2,3} 으로 변경 후 정렬
    return result            

if __name__ == "__main__":
    ts = input("중복없는 튜플의 집합 형태 입력")
    print(tuple_ss(ts))

 

2. 영어의 끝말잇기 게임 프로그램 작성

 

리스트로 주어진 영어 단어집 작성

- 모두 소문자

- 단어집의 단어 개수는 3이상 50이하

- 단어의 길이는 2이상 30 이하

 

참여자 수 입력 (2~5명)

몇 번째 참여자가 몇 번째 차례에서 탈락하는지 출력

끝말잇기의 올바른 단어가 아니거나, 앞선 사람이 이미 말한 단어의 중복일 경우 탈락, 주어진 단어집의 끝까지 탈락자가 없을 경우 [0,0] 반환함

def word_chain(gamer,words):
    first = [words[0]]
    prev = words[0]

    for i in range(1,len(words)):
        if prev[-1] != words[i][0] or words[i] in first:
            return  [(i%gamer)+1, (i//gamer)+1] 
        
        first.append(words[i])
        prev = words[i]
    
    return [0,0]

if __name__ == "__main__":
    words = ["banana", "apple", "elephant", "table", "error", "rode"]
    game_n = int(input("enter number of gmaer>> "))
    print(word_chain(game_n, words))   

 

3. 2차원 행렬 A와 B를 입력 받아 두 행렬의 곱을 구하는 함수 작성

 

- 행렬의 곱은 내적의 곱을 의미

- A*B의 경우 A의 열의 사이즈와 B의 행의 사이즈가 동일해야 곱 가능

- A와 B 행렬을 구성하는 원소는 -10이상 20이하인 자연수

- A와 B행렬의 행과 열의 길이는 3이상 5이하

 

행렬의 곱 결과물 Transpose Matrix 코드 작성

- 전치행렬은 행과 열이 바뀐 행렬

- [[1,2,],[3,4]]의 전치행렬은 [[1,3],[2,4]]

import random

def matrix(n):
    A = [[random.randint(-10,20) for i in range(n)] for i in range(n)]
    B = [[random.randint(-10,20) for i in range(n)] for i in range(n)]
    C = [[0 for i in range(n)] for i in range(n)]

    for i in range(n):
        for j in range(n):
            for k in range(n):
                C[i][j] = C[i][j] + A[i][k]*B[k][j]
    print(A);print(B)
    return C

if __name__ == "__main__":
    n = int(input("ener size of matrix>> "))
    result = matrix(n)
    result_trans = [[i for i in j] for j in zip(*result)]
    #result_trans = list(map(list, zip(*result)))
    print(f'matrix result: {result}') 
    print(f'matrix trans: {result_trans}')      

 

 

데이터 분석 분야의 수학

 

1. 확률/통계 및 선형대수학(linear algebra)

 

1) 선형 대수학의 필요성

  • 데이터를 벡터로 표현
  • 벡터 모임인 행렬을 통한 방정식 연산의 빠른 수행

2) 데이터를 벡터로 표현

  • 데이터들을 표현하는 특징을 선형대수학의 기본 단위인 벡터로 표현함
  • ex) A지역의 강수량 변화 - 연도, 월, 강수량의 데이터 표현
  • ex) 영화 선호도 - B영화의 평점, C영화의 평점 데이터 표현
  • ex) 영화 데이터 표현 - 장르, 감독, 출연배우, 개봉일 등

3) 데이터 표현식을 찾기 위해 필요

  • 좌표계를 이용하여 데이터들을 표현하는 식을 찾는데 유용함 (ex: 회귀분석)
  • 데이터를 가장 잘 표현하는 확률분포의 파라미터들을 축으로 좌표계를 생성 후, 오차를 축소시킴

4) 행렬 연산의 필요성

  • 예측을 위한 회귀분석
  • ex) 몸무게와 키의 관계 -> 몸무게가 주어지면 키값의 예측 가능

 

2. 벡터 (vector)

 

  • 크기와 방향을 가진 요소 ex) 속도, 평행이동, 힘의 작용 등
  • 벡터는 요소(변수)들의 1차원적 배열
  • 벡터는 일종의 순서쌍
  • 역벡터 : 크기는 같고 방향이 반대인 벡터

cf) 스칼라 (scalar) : 크기만을 가진 요소. (ex: 속력, 무게, 길이 등)

 

벡터는 요소들의 1차원적 배열로 정의 됨

  • 열벡터 (column vector) : 세로로 배열된 벡터
  • 행벡터 (row vector) : 가로로 배열된 벡터

1) 벡터의 덧셈과 뺄셈

 

2) 벡터의 동일성

  • 동일 위치에 있는 요소들이 모두 같은 경우
  • 두 벡터의 차는 영벡터(zero vector) -> 벡터의 항등원

3) 벡터에 대한 스칼라 곱

벡터 x에 스칼라 k를 곱하면 kx

 

4) 벡터 간의 곱셈 : 벡터간의 내적(inner product) -> 결과는 스칼라

ex) 세 과목의 점수 (80,97,88), 각 과목의 성적 반영률 (0.3,0.4,0.3) 이면 최종 점수는 

     0.3*80 + 0.4+97 + 0.3*88 = 89.2

 

 

3. 행렬 (matrix) 기본개념

 

1) 행렬(matrix)

  • 요소(수 또는 변수)들이 2차원적으로 배열된 것
  • 요소는 행렬 내에서의 위치를 하첨자로 부기함
  • 행렬의 크기 : 행의 수와 열의 수로 정해짐 (ex: 2 by 3)

2) 행렬의 덧셈과 뺄셈

 

m x n 행렬 A = [aij]와 B = [bij]가 있을 때

A + B = [aij + bij]

A - B = [aij - bij]

 

3) 실수(스칼라)의 곱

 

m x n 행렬 A = [aij]와 실수 k가 있을 때

A * k = Ak =kA =[kaij]

 

4) 행렬의 곱

 

행렬의 곱은 벡터의 내적에서 출발 -> 차원의 일치

벡터 a와 벡터 b의 내적 -> a*b = a1b1 + a2b2

 

5) 영행렬 (zero matrix)

 

m x n 행렬 A가 있을때 모든 i, j에 대하여 aij = 0 인 행렬

A = O 라고 나타냄

 

6) 정방행렬 (square matrix)

 

m x n 행렬 A가 있을 때 m=n인 행렬

n x n 행렬로 나타냄

 

7) n차 정방행렬

 

n개의 행과 n개의 열로 구성된 정방행렬

n값 : 행렬의 차수 (order)

대각원소 : 대각선상의 원소 (a11, a22, ... ann)

대각행렬 : 대각원소 이외의 모든 원소가 0인 행렬

 

8) 단위행렬

 

정방행렬이면서 대각원소가 모두 1이고 그 외의 모든 원소가 0인 대각행렬

행렬곱의 항등행렬

I로 나타냄

cf) IA = A = AI

 

9) 전치행렬 (transpose matrix)

 

m x n 행렬 A가 있을 때 A의 행과 열을 서로 바꾼 행렬

AT로 나타냄

cf) 대칭행렬 : AT = A 인 행렬

 

10) 역행렬

 

임의의 정방행렬 Anxn에 대하여 정방행렬 Bnxn가 AB = BA = Inxn 를 만족하면, B를 A의 역행렬이라 하고 A-1로 표기함

행렬곱의 역원

 

11) 행렬식 (Determinant)

 

1차 연립방정식의 해를 구하기 위해 사용

역행렬의 유무 판별에도 사용

cf) 2,3차 이상의 행렬식은 라플라스(또는 여인수전개) 또는 크래머 방식을 이용하여 구함

 

A = [a b       => ad - bd 가 0이 아니면 역행렬이 존재함

      c d]

 

역행렬이 존재하지 않는 연립방정식 : 해가 없거나, 무수히 많은 경우에 해당됨

 

 

 

Numpy 모듈

 

1. Numpy 모듈 설치

 

Anaconda powershell 에서 'conda activate 가상환경이름' 으로 activate 한 후

conda install numpy 입력

 

2. Numpy 패키지

 

  • 파이썬의 리스트는 원하는 타입들을 채울 수 있는 유연성이 있지만, 저장공간 낭비 등이 발생함
  • Numpy의 배열은 유연성은 부족하지만(같은 데이터 형태만 가능), 데이터의 저장과 가공에 효율적
  • 계산 또는 분석에 이용되어지는 라이브러리, 선형대수의 기본 원리
  • list보다 빠른 계산 구조를 가진 array 생성
  • array 형태이므로, 구성되는 값들은 모두 같은 자료형으로 구성
  • Numpy의 사용 : import numpy as np 
# list와 array의 차이

import numpy as np

list1 = [1,2,3,'b']
print(list1)
arr1 = np.array([1,2,3,'b'])
print(arr1)
arr2 = np.array([1,2,2.3,3])
print(arr2)
# array 생성

import numpy as np

a1 = np.array([1,2,3])
print(a1, a1.shape, a1.ndim)
print(type(a1))
print(a1[0], a1[1], a1[2])
print()
a2 = np.array([[1,2,3], [4,5,6]])
print(a2, a2.shape, a2.ndim)
print(a2[0], a2[1])
print(a2[0,0], a2[0][1], a2[0,2])	# [0,0] = [0][0]
# 데이터 기본 타입

import numpy as np

arr1 = np.zeros(20, dtype=np.float32)
arr2 = np.array([range(i,i+2) for i in range(2,5)], dtype='int32')
arr3 = np.array([range(i,i+4) for i in range(2,5)], dtype='float32')
print(arr1)
print(arr2)
print(arr3)

zeros, ones, full, eye, linspace

# zeros, ones, full, eye, linspace

import numpy as np

a = np.zeros((2,2));print(a)
b = np.ones((3,3));print(b)
c = np.full((2,3),5)   # 5로 가득 채운 2x3 행렬 생성
print(c)
d = np.eye(3)   # 단위행렬 생성 -> 정방행렬이므로 숫자 하나만 사용
print(d)
e = np.linspace(0,1,5)  # 0~1 사이에서 균등하게 5개 생성
print(e)
f = np.arange(10)   # 0~0 까지의 1씩 증가하는 정수 생성
print(f)
# _like() -> ()의 행렬과 같은 shape의 행렬을 생성함

a = np.array([[1,2,3], [4,5,6]]);print(a)
b = np.ones_like(a);print(b)
c = np.full_like(a,5);print(c)
d = np.zeros_like(a);print

numpy의 랜덤함수 사용

  • random.random
  • random.normal
  • random.randint
  • random.randn
  • random.exponential
  • random.uniform
# numpy 랜덤함수 사용

import numpy as np

ary1 = np.random.exponential(6,2)    # mean(scale)=6, size=2
ary2 = np.random.random((3,3))      # 0~1 사이의 실수 균등분포, 3 by 3
ary3 = np.random.normal(2,1,(3,2))  # 평균:2, 편차:!, 정규분포, 3 by 2
ary4 = np.random.randn(2,3)         # 표준정규분포, 평균:0, 편차:1
ary5 = np.random.randint(0,10,(2,2))
ary6 = np.random.uniform(1,5,2)     # 1~5 사이의 uniform 분포
print(ary1)
print(ary2)
print(ary3)
print(ary4)
print(ary5)
print(ary6)
# random.seed

import numpy as np

np.random.seed(10)	# seed : random값을 발생시킬때 start값을 고정해주어 동일한 범위에서 random값을 추출해줌
ary1 = np.random.randint(1,10,5)
arr2 = np.random.poisson(lam=2.0, size=5)
print(arr1)
print(arr2)
# 평균0, 표준편차1인 정규분포값을 10000발생 후 도표로 확인

import numpy as np
import matplotlib.pyplot as plt

data = np.random.normal(0,1,10000)
plt.hist(data, alpha=0.5, bins=100)   # bins : 나누기양 (막대기 수)
plt.show()
# 평균2, 표준편차1인 값을 10000발생 후 도표로 확인하여 비교

import numpy as np
import matplotlib.pyplot as plt

data1 = np.random.normal(2,1,10000)
data2 = np.random.normal(0,1,10000)
plt.hist(data1, bins=50, color="green")
plt.hist(data2, alpha=0.5, bins=50)
plt.show()
# Sigmoid / Relu 함수의 분포 그리기

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

def sigmoid_f(x):
    return 1 / (1+np.exp(-x))
def relu_f(x):
    return np.maximum(0,x)

x = np.arange(-5.0, 5.0, 0.1)
y_relu = relu_f(x)
plt.plot(x,y_relu)
plt.show()

y_sigmoid = sigmoid_f(x)
plt.plot(x,y_sigmoid)
plt.show()

shuffle, choice, unique 모듈

import numpy as np

ary1 = np.array([1,2,2,3,4,4,5,6,7,8,8,8])
np.random.shuffle(ary1)

ary2 = np.random.choice(ary1,3)
ary3 = np.unique(ary1)    # unique : 중복제거

print(ary1)
print(ary2)
print(ary3)

배열 index slicing

import numpy as np

a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
b = a   # b = a[:] 와 동일.  얕은 복사
a[0,0] = 100	# cf) a.copy : 깊은 복사
print(a)
print(b)

'Programming > Python' 카테고리의 다른 글

Python 7주차 - 1  (0) 2020.07.29
Python 6주차 - 2  (0) 2020.07.26
Python 5주차  (0) 2020.07.26
Python 4주차 - 2  (0) 2020.07.12
Python 4주차 - 1  (0) 2020.07.12
Comments