I am working on the file "Lecture-widgets.ipynb".
The first task is:
Improving the layout - using Sizers
Using absolute positioning is often not very satisfying: The result is ugly if the windows are not (for one reason or another) the right size. WxPython has very rich vocabulary of objects to lay out controls.
- wx.BoxSizer is the most common and simple layout object but it permits a vast range of possibilities. Its role is roughly to arrange a set of controls in a line or in a row and rearrange them when needed (i.e. when the global size is changed).
- wx.GridSizer and wx.FlexGridSizer are two very important layout tools. They arrange the controls in a tabular layout.
Here is the sample above re-written to use sizers:
Can you write Python code for it?

%%writefile example.py
import wx
class ExamplePanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        # create some sizers
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        grid = wx.GridBagSizer(hgap=5, vgap=5)
        hSizer = wx.BoxSizer(wx.HORIZONTAL)

        self.quote = wx.StaticText(self, label="Your quote: ")
        grid.Add(self.quote, pos=(0,0))

        # A multiline TextCtrl - This is here to show how the events work in this program, don't pay too much attention to it
        self.logger = wx.TextCtrl(self, size=(200,300), style=wx.TE_MULTILINE | wx.TE_READONLY)

        # A button
        self.button =wx.Button(self, label="Save")
        self.Bind(wx.EVT_BUTTON, self.OnClick,self.button)

        # the edit control - one line version.
        self.lblname = wx.StaticText(self, label="Your name :")
        grid.Add(self.lblname, pos=(1,0))
        self.editname = wx.TextCtrl(self, value="Enter here your name", size=(140,-1))
        grid.Add(self.editname, pos=(1,1))
        self.Bind(wx.EVT_TEXT, self.EvtText, self.editname)
        self.Bind(wx.EVT_CHAR, self.EvtChar, self.editname)

        # the combobox Control
        self.sampleList = ['friends', 'advertising', 'web search', 'Yellow Pages']
        self.lblhear = wx.StaticText(self, label="How did you hear from us ?")
        grid.Add(self.lblhear, pos=(3,0))
        self.edithear = wx.ComboBox(self, size=(95, -1),
                                    choices=self.sampleList,
                                    style=wx.CB_DROPDOWN)
        grid.Add(self.edithear, pos=(3,1))
        self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, self.edithear)
        self.Bind(wx.EVT_TEXT, self.EvtText,self.edithear)

        # add a spacer to the sizer
        grid.Add((10, 40), pos=(2,0))

        # Checkbox
        self.insure = wx.CheckBox(self, label="Do you want Insured Shipment ?")
        grid.Add(self.insure, pos=(4,0), span=(1,2),
                 flag=wx.BOTTOM, border=5)
       ...


I am working on the file "Lecture-widgets.ipynb".
The first task is:
It is possible to use this navigation toolbar as a starting point to add more buttons and capabilities.
This is another example from the matplotlib demo library.
Can you write Python code for it?

%%writefile mpl_demo.py
#!/usr/bin/env python
import wxversion
wxversion.ensureMinimal('2.8')

from numpy import arange, sin, pi
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg
from matplotlib.backends.backend_wx import _load_bitmap
from matplotlib.figure import Figure
from numpy.random import rand
import wx

class MyNavigationToolbar(NavigationToolbar2WxAgg):
    """
    Extend the default wx toolbar with your own event handlers
    """
    ON_CUSTOM = wx.NewId()

    def __init__(self, canvas, cankill):
        NavigationToolbar2WxAgg.__init__(self, canvas)

        # for simplicity I'm going to reuse a bitmap from wx, you'll
        # probably want to add your own.
        if 'phoenix' in wx.PlatformInfo:
            self.AddTool(self.ON_CUSTOM, 'Click me',
                         _load_bitmap('stock_left.xpm'),
                         'Activate custom contol')
            self.Bind(wx.EVT_TOOL, self._on_custom, id=self.ON_CUSTOM)
        else:
            self.AddSimpleTool(self.ON_CUSTOM, _load_bitmap('stock_left.xpm'),
                               'Click me', 'Activate custom contol')
            self.Bind(wx.EVT_TOOL, self._on_custom, id=self.ON_CUSTOM)

    def _on_custom(self, evt):
        # add some text to the axes in a random location in axes (0,1)
        # coords) with a random color

        # get the axes
        ax = self.canvas.figure.axes[0]

        # generate a random location can color
        x, y = tuple(rand(2))
        rgb = tuple(rand(3))

        # add the text and draw
        ax.text(x, y, 'You clicked me',
                transform=ax.transAxes,
                color=rgb)
        self.canvas.draw()
        evt.Skip()

class CanvasFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1,
                          'CanvasFrame', size=(550, 350))

        self.figure = Figure(figsize=(5, 4), dpi=100)
        self.axes = self.figure.add_subplot(111)
 ...


I am working on the file "Lecture-widgets.ipynb".
The first task is:
Let's see how this works.
python
self.figure = Figure()
initializes the top level container for all plot elements. Everything in the
plot goes within this object, just like everything in our wx application goes into
our frame!
python
self.axes = self.figure.add_subplot(111)
Our figure can contain many subplots, but here we will only make
one. add_subplot() is what does this for us. The 111 is a grid
parameter, encoded as an integer. It means 1x1 grid, first subplot. If
you want two subplots, the number would be 2x1; the first subplot
would be 211, and the second subplot would be 212.
python
self.axes.plot(t, s)
t and s are what I chose for axis values.
They are arrays that contain values that link with each other to form our plot. These arrays
must have the same size!
This command creates and plots the t and s arrays. Since self.axes was defined as a
subplot of self.figure, this also plays a role in generating
self.figure, the container of our subplot.
python
self.canvas = FigureCanvas(self, -1, self.figure)
Finally, we have our canvas object, which paints our object onto the
screen. Simply pass in our figure and the FigureCanvas tool does the
rest.
Navigation toolbar
A useful toolbar is the navigation toolbar defined in matplotlib which allows one to explore the image.
Let's add to our previous example this toolbar.
Can you write Python code for it?

%%writefile mpl_demo.py
#!/usr/bin/env python
import wxversion
wxversion.ensureMinimal('2.8')

from numpy import arange, sin, pi
from matplotlib.backends.backend_wxagg import \
    FigureCanvasWxAgg as FigureCanvas, \
    NavigationToolbar2WxAgg as NavigationToolbar
from matplotlib.figure import Figure
import wx

class CanvasFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1,
                          'CanvasFrame', size=(550, 350))

        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)
        t = arange(0.0, 3.0, 0.01)
        s = sin(2 * pi * t)

        self.axes.plot(t, s)
        self.canvas = FigureCanvas(self, -1, self.figure)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.EXPAND)
        self.SetSizer(self.sizer)
        self.Fit()
        self.add_toolbar()  #add toolbar

    def add_toolbar(self):
        self.toolbar = NavigationToolbar(self.canvas)
        self.toolbar.Realize()
        # By adding toolbar in sizer, we are able to put it at the bottom
        # of the frame - so appearance is closer to GTK version.
        self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
        # update the axes menu on the toolbar
        self.toolbar.update()

class App(wx.App):
    def OnInit(self):
        'Create the main window and insert the custom frame'
        frame = CanvasFrame()
        frame.Show(True)
        return True

app = App(0)
app.MainLoop()

!python mpl_demo.py


I am working on the file "Lecture-widgets.ipynb".
The first task is:
Matplotlib examples
We give here a few more examples to show the various capabilities.
Buttons
Can you write Python code for it?

%%writefile buttons_demo.py
#!/usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button

freqs = np.arange(2, 20, 3)

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.2)
t = np.arange(0.0, 1.0, 0.001)
s = np.sin(2*np.pi*freqs[0]*t)
l, = plt.plot(t, s, lw=2)

class Index(object):
    ind = 0

    def next(self, event):
        self.ind += 1
        i = self.ind % len(freqs)
        ydata = np.sin(2*np.pi*freqs[i]*t)
        l.set_ydata(ydata)
        plt.draw()

    def prev(self, event):
        self.ind -= 1
        i = self.ind % len(freqs)
        ydata = np.sin(2*np.pi*freqs[i]*t)
        l.set_ydata(ydata)
        plt.draw()

callback = Index()
axprev = plt.axes([0.7, 0.05, 0.1, 0.075])
axnext = plt.axes([0.81, 0.05, 0.1, 0.075])
bnext = Button(axnext, 'Next')
bnext.on_clicked(callback.next)
bprev = Button(axprev, 'Previous')
bprev.on_clicked(callback.prev)

plt.show()

!python buttons_demo.py


I am working on the file "Lecture-widgets.ipynb".
The first task is:
Rectangle selector
Can you write Python code for it?

%%writefile rectsel.py
#!/usr/bin/env python
"""
Do a mouseclick somewhere, move the mouse to some destination, release
the button.  This class gives click- and release-events and also draws
a line or a box from the click-point to the actual mouseposition
(within the same axes) until the button is released.  Within the
method 'self.ignore()' it is checked wether the button from eventpress
and eventrelease are the same.
"""
from matplotlib.widgets import RectangleSelector
import numpy as np
import matplotlib.pyplot as plt

def line_select_callback(eclick, erelease):
    'eclick and erelease are the press and release events'
    x1, y1 = eclick.xdata, eclick.ydata
    x2, y2 = erelease.xdata, erelease.ydata
    print("(%3.2f, %3.2f) --> (%3.2f, %3.2f)" % (x1, y1, x2, y2))
    print(" The button you used were: %s %s" % (eclick.button, erelease.button))

def toggle_selector(event):
    print(' Key pressed.')
    if event.key in ['Q', 'q'] and toggle_selector.RS.active:
        print(' RectangleSelector deactivated.')
        toggle_selector.RS.set_active(False)
    if event.key in ['A', 'a'] and not toggle_selector.RS.active:
        print(' RectangleSelector activated.')
        toggle_selector.RS.set_active(True)

fig, current_ax = plt.subplots()                    # make a new plotingrange
N = 100000                                       # If N is large one can see
x = np.linspace(0.0, 10.0, N)                    # improvement by use blitting!

plt.plot(x, +np.sin(.2*np.pi*x), lw=3.5, c='b', alpha=.7)  # plot something
plt.plot(x, +np.cos(.2*np.pi*x), lw=3.5, c='r', alpha=.5)
plt.plot(x, -np.sin(.2*np.pi*x), lw=3.5, c='g', alpha=.3)

print("\n      click  -->  release")

# drawtype is 'box' or 'line' or 'none'
toggle_selector.RS = RectangleSelector(current_ax, line_select_callback,
                                       drawtype='box', useblit=True,
                                       button=[1, 3],  # don't use middle button
                                       minspanx=5, minspany=5,
                ...


I am working on the file "Lecture-widgets.ipynb".
The first task is:
Slider
Can you write Python code for it?

%%writefile slider_demo.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(0.0, 1.0, 0.001)
a0 = 5
f0 = 3
s = a0*np.sin(2*np.pi*f0*t)
l, = plt.plot(t, s, lw=2, color='red')
plt.axis([0, 1, -10, 10])

axcolor = 'lightgoldenrodyellow'
axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
axamp = plt.axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor)

sfreq = Slider(axfreq, 'Freq', 0.1, 30.0, valinit=f0)
samp = Slider(axamp, 'Amp', 0.1, 10.0, valinit=a0)

def update(val):
    amp = samp.val
    freq = sfreq.val
    l.set_ydata(amp*np.sin(2*np.pi*freq*t))
    fig.canvas.draw_idle()
sfreq.on_changed(update)
samp.on_changed(update)

resetax = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975')

def reset(event):
    sfreq.reset()
    samp.reset()
button.on_clicked(reset)

rax = plt.axes([0.025, 0.5, 0.15, 0.15], axisbg=axcolor)
radio = RadioButtons(rax, ('red', 'blue', 'green'), active=0)

def colorfunc(label):
    l.set_color(label)
    fig.canvas.draw_idle()
radio.on_clicked(colorfunc)

plt.show()

!python slider_demo.py


I am working on the file "Lecture-widgets.ipynb".
The first task is:
Span selector
Can you write Python code for it?

%%writefile span_demo.py
#!/usr/bin/env python
"""
The SpanSelector is a mouse widget to select a xmin/xmax range and plot the
detail view of the selected region in the lower axes
"""
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(211, axisbg='#FFFFCC')

x = np.arange(0.0, 5.0, 0.01)
y = np.sin(2*np.pi*x) + 0.5*np.random.randn(len(x))

ax.plot(x, y, '-')
ax.set_ylim(-2, 2)
ax.set_title('Press left mouse button and drag to test')

ax2 = fig.add_subplot(212, axisbg='#FFFFCC')
line2, = ax2.plot(x, y, '-')

def onselect(xmin, xmax):
    indmin, indmax = np.searchsorted(x, (xmin, xmax))
    indmax = min(len(x) - 1, indmax)

    thisx = x[indmin:indmax]
    thisy = y[indmin:indmax]
    line2.set_data(thisx, thisy)
    ax2.set_xlim(thisx[0], thisx[-1])
    ax2.set_ylim(thisy.min(), thisy.max())
    fig.canvas.draw()

# set useblit True on gtkagg for enhanced performance
span = SpanSelector(ax, onselect, 'horizontal', useblit=True,
                    rectprops=dict(alpha=0.5, facecolor='red'))

plt.show()

!python span_demo.py


I am working on the file "Lecture-widgets.ipynb".
The first task is:
The notebook
Sometimes, a form grows too big to fit on a single page. The
wx.Notebook is used in that kind of case : It allows the user to navigate quickly between a small amount of pages by clicking on associated tabs. We implement this by putting the wx.Notebook instead of our form into the main Frame and then add our panel into the notebook by using method AddPage.
Can you write Python code for it?

%%writefile notebook_demo.py
import wx
from example import ExamplePanel

app = wx.App(False)
frame = wx.Frame(None, title="Demo with Notebook",size=(500,400))
nb = wx.Notebook(frame)

nb.AddPage(ExamplePanel(nb), "Absolute Positioning")
nb.AddPage(ExamplePanel(nb), "Page Two")
nb.AddPage(ExamplePanel(nb), "Page Three")
frame.Show()
app.MainLoop()

!python notebook_demo.py


I am working on the file "Lecture-widgets.ipynb".
The first task is:
The sizer.Add method has three arguments. The first one specifies the control to include in the sizer. The second one is a weight factor which means that this control will be sized in proportion to other ones. For example, if you had three edit controls and you wanted them to have the proportions 3:2:1 then you would specify these factors as arguments when adding the controls. 0 means that this control or sizer will not grow. The third argument is normally wx.GROW (same as wx.EXPAND) which means the control will be resized when necessary. If you use wx.SHAPED instead, the controls aspect ratio will remain the same.
If the second parameter is 0, i.e. the control will not be resized, the third parameter may indicate if the control should be centered horizontally and/or vertically by using wx.ALIGN_CENTER_HORIZONTAL, wx.ALIGN_CENTER_VERTICAL, or wx.ALIGN_CENTER (for both) instead of wx.GROW or wx.SHAPED as that third parameter.
You can alternatively specify combinations of wx.ALIGN_LEFT, wx.ALIGN_TOP, wx.ALIGN_RIGHT, and wx.ALIGN_BOTTOM. The default behavior is equivalent to wx.ALIGN_LEFT | wx.ALIGN_TOP.
One potentially confusing aspect of the wx.Sizer and its sub-classes is the distinction between a sizer and a parent window. When you create objects to go inside a sizer, you do not make the sizer the object's parent window. A sizer is a way of laying out windows, it is not a window in itself. In the above example, all six buttons would be created with the parent window being the frame or window which encloses the buttons -- not the sizer. If you try to create a visual element and pass the sizer as the parent window, your program will crash.
Once you have set up your visual elements and added them to a sizer (or to a nested set of sizers), the next step is to tell your frame or window to use the sizer. You do this in three steps:
python
window.SetSizer(sizer)
window.SetAutoLayout(True)
sizer.Fit(window)
The SetSizer() call tells your window (or frame) which sizer to use. The call to SetAutoLayout() tells your...
Can you write Python code for it?

%%writefile example.py
import wx
class ExamplePanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.quote = wx.StaticText(self, label="Your quote :",
                                   pos=(20, 30))

        # A multiline TextCtrl - This is here to show how the events work in this program, don't pay too much attention to it
        self.logger = wx.TextCtrl(self, pos=(300,20), size=(200,300),
                                  style=wx.TE_MULTILINE | wx.TE_READONLY)

        # A button
        self.button =wx.Button(self, label="Save", pos=(200, 325))
        self.Bind(wx.EVT_BUTTON, self.OnClick,self.button)

        # the edit control - one line version.
        self.lblname = wx.StaticText(self, label="Your name :",
                                     pos=(20,60))
        self.editname = wx.TextCtrl(self, value="Enter here your name",
                                    pos=(150, 60), size=(140,-1))
        self.Bind(wx.EVT_TEXT, self.EvtText, self.editname)
        self.Bind(wx.EVT_CHAR, self.EvtChar, self.editname)

        # the combobox Control
        self.sampleList = ['friends', 'advertising', 'web search',
                           'Yellow Pages']
        self.lblhear = wx.StaticText(self,
                                     label="How did you hear from us ?",
                                     pos=(20, 90))
        self.edithear = wx.ComboBox(self, pos=(150, 90), size=(95, -1),
                                    choices=self.sampleList,
                                    style=wx.CB_DROPDOWN)
        self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, self.edithear)
        self.Bind(wx.EVT_TEXT, self.EvtText,self.edithear)

        # Checkbox
        self.insure = wx.CheckBox(self,
                                  label="Do you want Insured Shipment ?",
                                  pos=(20,180))
        self.Bind(wx.EVT_CHECKBOX, self.EvtCheckBox, self.insure)

        # Radio Boxes
        radioList = ['blue', 'red', 'yellow', 'orange',...


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
1 dim vs 2 dim
Can you write Python code for it?

a = np.arange(4)
a

a.shape

b = np.array([[0, 1, 2, 3]])
b

b.shape

c = np.array([[0], [1], [2], [3]])
c

c.shape


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Array Creation Functions

arange
linspace, logspace
zeros, ones
rand, randn
tile
Can you write Python code for it?

a = np.arange(10) # 0 .. n-1  (!)
a

b = np.arange(1, 9, 2) # start, end (exclusive), step
b

c = np.linspace(0, 1, 6)   # start, end, num-points
c

d = np.linspace(0, 1, 5, endpoint=False)
d

a = np.ones((3, 3))  # reminder: (3, 3) is a tuple
a

b = np.zeros((2, 2))
b

c = np.diag([1,2,3])
c

d = np.eye(4)
d

a = np.array([0, 1, 2])
a

np.tile(a, 2)

np.tile(a, (3, 2))

np.tile(a, (2, 1, 2))

b = np.array([[1, 2], [3, 4]])
b

np.tile(b, 2)

np.tile(b, (2, 1))


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Array Operation
Elementwise operations
Can you write Python code for it?

a = np.array([1, 2, 3, 4])
a

a + 1

2**a

b = np.ones(4) + 1
b

a - b

a + b

c = np.ones((3, 3))
c

c * c # element-wise, NOT Matrix product

c.dot(c) # matrix product

a = np.array([1, 2, 3, 4])
b = np.array([4, 2, 2, 4])

a == b

a > b

a = np.array([1, 2, 3, 4])
b = np.array([4, 2, 2, 4])
c = np.array([1, 2, 3, 4])

np.array_equal(a, b)

np.array_equal(a, c)

a = np.arange(5)

np.sin(a)

np.log(a)

np.exp(a)

np.log10(a)

a = np.arange(4)
b = np.array([1, 2])

a

b

a + b


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Array용 수학 함수

universal function
빠른 element-wise (vectorized) 연산
모든 NumPy/Scipy 수학 함수는 자동으로 vectorized 연산 수행
Can you write Python code for it?

x = range(10)
x

import math
math.exp(x)

math.exp(x[0])

[math.exp(x_i) for x_i in x]

np.exp(x)


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Broadcasting
<img src="http://www.scipy-lectures.org/_images/numpy_broadcasting.png" style="width: 60%; margin: 0 auto 0 auto;">
Can you write Python code for it?

a = np.tile(np.arange(0, 40, 10), (3, 1)).T
a

b = np.array([0, 1, 2])
b

a + b

a[:,0][:, np.newaxis]

a[:,0][:, np.newaxis] + b

a = np.ones((4, 5))
a

a[0]

a[0] = 2
a

x, y = np.arange(5), np.arange(5)[:, np.newaxis]

x

y

distance = np.sqrt(x ** 2 + y ** 2)
distance


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Copy
Can you write Python code for it?

a = np.arange(5)
a

b = a.copy()
b

a[0] = 99
a

b


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Create Array (1D)
Can you write Python code for it?

a = np.array([0, 1, 2, 3])
a

a.ndim

a.shape

len(a)


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Create Array (2D)
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Dimension Reduction Operation

sum
min, max, argmin, argmax
mean, median, std, var
all, any
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Fancy indexing 팬시 인덱싱

Boolean Fancy Indexing
True인 원소만 선택
크기가 같아야 한다.
list
또는 tuple, or array
지정된 인덱스만 선택
크기가 달라도 된다.
multi dimension에도 사용 가능
create copy, not view
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Multi-dimensional Indexing
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Multi-dimensional Slicing
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Python List vs NumPy Array

Python List
여러가지 타입의 원소
메모리 용량이 크고 속도가 느림
nesting 가능
전체 연산 불가
NumPy Array
동일 타입의 원소
메모리 최적화, 계산 속도 향상
크기(dimension)이 명확하게 정의
전체 연산 가능
Can you write Python code for it?

L = range(1000)
%timeit [i**2 for i in L]

a = np.arange(1000)
%timeit a**2

L = range(3)
L

L * 2

[i * 2 for i in L]

a = np.arange(3)
a

a * 2


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Random Number
numpy.random 서브패키지

seed: pseudo random 상태 설정
shuffle: 조합(combination)
choice: 순열(permutation) 및 조합(combination)
rand: uniform
random_integers: uniform integer
randn: Gaussina normal

seed

컴퓨터의 랜덤 생성은 사실 랜덤이 아니다.
랜덤처럼 보이지만 정해진 알고리즘에 의해 생성되는 규칙적인 순열
시작점이 정해지면 랜덤 함수를 사용해도 정해진 숫자가 나온다.
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Shape Change

reshape
flatten, ravel
Can you write Python code for it?

a = np.arange(20)
a

b = np.reshape(a, (4, 5))
b

c = a.reshape(4,5)
c


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Slicing
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Stack

hstack
vstack
dstack
Can you write Python code for it?

a = np.arange(5)
a

np.vstack([a * 10, a * 20])

b = np.arange(5)[:, np.newaxis]
b

np.hstack([b * 10, b * 20])

a = np.array((1,2,3))
b = np.array((2,3,4))

a

a.shape

np.dstack((a,b))

a = np.array([[1],[2],[3]])
b = np.array([[2],[3],[4]])
np.dstack((a,b))


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
Transpose
Can you write Python code for it?

a = np.array([[0, 1, 2, 3]])
a

a.shape

b = a.T
b

b.shape


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
View

A slicing operation creates a view on the original array, which is just a way of accessing array data.
Thus the original array is not copied in memory.
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
dtype

bool    Boolean (True or False) stored as a byte
int8    Byte (-128 to 127)
int16   Integer (-32768 to 32767)
int32   Integer (-2147483648 to 2147483647)
int64   Integer (-9223372036854775808 to 9223372036854775807)
uint8   Unsigned integer (0 to 255)
uint16  Unsigned integer (0 to 65535)
uint32  Unsigned integer (0 to 4294967295)
uint64  Unsigned integer (0 to 18446744073709551615)
float16 Half precision float: sign bit, 5 bits exponent, 10 bits mantissa
float32 Single precision float: sign bit, 8 bits exponent, 23 bits mantissa
float64 Double precision float: sign bit, 11 bits exponent, 52 bits mantissa
S  String
Can you write Python code for it?

a = np.array([1, 2, 3])
a.dtype

b = np.array([1., 2., 3.])
b.dtype

c = np.array([1, 2, 3], dtype=np.float64)
c.dtype

d = np.array([1+2j, 3+4j, 5+6*1j])
d.dtype

e = np.array([True, False, False, True])
e.dtype

f = np.array(['Bonjour', 'Hello', 'Hallo',])
f.dtype


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
numpy.random.choice(a, size=None, replace=True, p=None)
Parameters:
a : 1-D array-like or int
If an ndarray, a random sample is generated from its elements. If an int, the random sample is generated as if a was np.arange(n)

size : int or tuple of ints, optional
Output shape. If the given shape is, e.g., (m, n, k), then m * n * k samples are drawn. Default is None, in which case a single value is returned.

replace : boolean, optional
Whether the sample is with or without replacement

p : 1-D array-like, optional
The probabilities associated with each entry in a. If not given the sample assumes a uniform distribution over all entries in a.

Returns:
samples : 1-D ndarray, shape (size,)
The generated random samples
Can you write Python code for it?

# same as shuffle
np.random.choice(5, 5, replace=False)

np.random.choice(5, 3, replace=False)

np.random.choice(5, 10)

np.random.choice(5, 10, p=[0.1, 0, 0.3, 0.6, 0])

x = np.random.rand(10000)
print(x[:10])
sns.distplot(x)

np.random.rand(3,2)

x = np.random.random_integers(-100, 100, 50)
sns.distplot(x, rug=True)

x = np.random.randn(1000)
sns.distplot(x, rug=True)

np.random.randn(3,4)


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
ogrid, mgrid, meshgrid
Can you write Python code for it?

x, y = np.ogrid[0:3, 0:5]

x

y

np.ogrid[-1:1:3j, -1:1:5j]

x, y = np.mgrid[0:3, 0:5]

x

y

np.mgrid[-1:1:3j, -1:1:5j]

X, Y = np.meshgrid(np.arange(3), np.arange(5))

X

Y

zip(X.ravel(), Y.ravel())

plt.scatter(*np.vstack(np.meshgrid(np.linspace(-1,1,10), np.linspace(-2,2,10))).reshape(2,-1).tolist())


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
random number count

discrete values
unique()
bincount()
continuous values
histogram()
Can you write Python code for it?

np.unique([11, 11, 2, 2, 34, 34])

a = np.array([[1, 1], [2, 3]])
np.unique(a)

a = np.array(['a', 'b', 'b', 'c', 'a'])
index, count = np.unique(a, return_counts=True)

count

index

np.bincount([1, 1, 2, 2, 3, 3], minlength=6)

np.histogram([1.1, 2.5, 1.8, 2.4, 0.7], bins=[0, 1, 2, 3])

np.histogram([1, 2, 1], bins=[0, 1, 2, 3])

np.histogram([[1, 2, 1], [1, 0, 1]], bins=[0,1,2,3])

np.histogram(np.arange(4), bins=np.arange(5), density=True)


I am working on the file "Lecture/02. 파이썬 프로그래밍/6) Numpy 시작하기.ipynb".
The first task is:
sort
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Add Column
Can you write Python code for it?

df2['eastern'] = df2.state == 'Ohio'
df2


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Delete Column
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Index 기준 연산
Can you write Python code for it?

print(s3.values, s4.values)
s3.values + s4.values

s3 + s4


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Index 변경
Can you write Python code for it?

s

s.index

s.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
s

s.index


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Index 이름
Can you write Python code for it?

s4

s4.name = "population"
s4

s4.index.name = "state"
s4


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Nested dict를 사용한 DataFrame 생성
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
NumPy array로 변환
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Series Indexing 1: Label Indexing

Single Label
Label Slicing
마지막 원소 포함
Label을 원소로 가지는 Label (Label을 사용한 List Fancy Indexing)
주어진 순서대로 재배열
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Series Indexing 2: Integer Indexing

Single Integer
Integer Slicing
마지막 원소를 포함하지 않는 일반적인 Slicing
Integer List Indexing (List Fancy Indexing)
Boolearn Fancy Indexing
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Series dict를 사용한 DataFrame 생성
Can you write Python code for it?

pdata = {
    'Ohio': df3['Ohio'][:-1],
    'Nevada': df3['Nevada'][:2]
}
pd.DataFrame(pdata)


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Single Column Access
Can you write Python code for it?

df["state"]

type(df["state"])

df.state


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
Vectorized Operation
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
dict 데이터를 이용한 Series 생성

별도의 index를 지정하면 지정한 자료만으로 생성
Can you write Python code for it?

sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
s3 = pd.Series(sdata)
s3

states = ['California', 'Ohio', 'Oregon', 'Texas']
s4 = pd.Series(sdata, index=states)
s4

pd.isnull(s4)

pd.notnull(s4)

s4.isnull()

s4.notnull()


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
dict 연산
Can you write Python code for it?

"a" in s2, "e" in s2

for k, v in s2.iteritems():
    print(k, v)

s2["d":"a"]


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
drop 메소드를 사용한 Row/Column 삭제

del 함수
inplace 연산
drop 메소드
삭제된 Series/DataFrame 출력
Series는 Row 삭제
DataFrame은 axis 인수로 Row/Column 선택
axis=0(디폴트): Row
axis=1: Column
Can you write Python code for it?

s = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
s

s2 = s.drop('c')
s2

s

s.drop(["b", "c"])

df = pd.DataFrame(np.arange(16).reshape((4, 4)),
                   index=['Ohio', 'Colorado', 'Utah', 'New York'],
                   columns=['one', 'two', 'three', 'four'])
df

df.drop(['Colorado', 'Ohio'])

df.drop('two', axis=1)

df.drop(['two', 'four'], axis=1)


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
inplace 옵션

함수/메소드는 두 가지 종류
그 객체 자체를 변형

해당 객체는 그대로 두고 변형된 새로운 객체를 출력

DataFrame 메소드 대부분은 inplace 옵션을 가짐

inplace=True이면 출력을 None으로 하고 객체 자체를 변형
inplace=False이면 객체 자체는 보존하고 변형된 새로운 객체를 출력
Can you write Python code for it?

x = [3, 6, 1, 4]
sorted(x)

x

x.sort()
x


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
명시적인 Column/Row Index를 가지는 DataFrame
Can you write Python code for it?

df2 = pd.DataFrame(data,
                   columns=['year', 'state', 'pop', 'debt'],
                   index=['one', 'two', 'three', 'four', 'five'])
df2


I am working on the file "Lecture/02. 파이썬 프로그래밍/8) pandas 패키지의 소개.ipynb".
The first task is:
명시적인 Index를 가지는 Series

생성시 index 인수로 Index 지정
Index 원소는 각 데이터에 대한 key 역할을 하는 Label
dict
Can you write Python code for it?


I am working on the file "Lecture/02. 파이썬 프로그래밍/9) Python의  날짜 및 시간 관련 패키지 소개.ipynb".
The first task is:
Instance Attributes 속성
year, month, day, hour, minute, second, microsecond
tzinfo
Instance Methods 메소드
weekday(): 요일 {0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일}
strftime(format): datetime -> 문자열
toordinal(): datetime -> proleptic Gregorian ordinal (엑셀 날짜)
date(): datetime -> date
time(): datetime -> time
Can you write Python code for it?

dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo

dt.weekday() #  {0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일}


I am working on the file "Lecture/02. 파이썬 프로그래밍/9) Python의  날짜 및 시간 관련 패키지 소개.ipynb".
The first task is:
datetime 객체에 시간대 정보 넣기

localize 메소드
Can you write Python code for it?

t1 = datetime.datetime.now()
t1

lt1 = seoul.localize(t1)
lt1

t2 = datetime.datetime.utcnow()
t2

lt2 = pytz.utc.localize(t2)
lt2

lt2 = t2.replace(tzinfo=pytz.utc)
lt2


I am working on the file "Lecture/02. 파이썬 프로그래밍/9) Python의  날짜 및 시간 관련 패키지 소개.ipynb".
The first task is:
http://www.timeanddate.com/worldclock/usa/new-york

dateutil

parse 함수
relativedelta 클래스

parse() 함수

많이 사용되는 날짜 시간 관련 문자열 형식을 스스로 판단
Can you write Python code for it?

from dateutil.parser import parse

parse('2016-04-16')

parse("Apr 16, 2016 04:05:32 PM")

parse('6/7/2016')


I am working on the file "Lecture/02. 파이썬 프로그래밍/9) Python의  날짜 및 시간 관련 패키지 소개.ipynb".
The first task is:
pytz 패키지

세계 시간대 변환
Can you write Python code for it?

import pytz

seoul = pytz.timezone("Asia/Seoul")


I am working on the file "Lecture/02. 파이썬 프로그래밍/9) Python의  날짜 및 시간 관련 패키지 소개.ipynb".
The first task is:
time 패키지의 시간 표시

time_struct
9-tuple 내부 구조체
단일 부동소수점 숫자
시간을 하나의 숫자로 표시 가능
time 패키지의 모든 시각은 epoch로부터 흐른 초단위 숫자로 표시
epoch
1970년 1월 1일 0시 기준

time package 명령어

time(): 현재 시각을 단일 부동소수점 숫자로 반환
localtime(): 현재 시각을 time_struct로 반환
mktime(ts): time_struct -> 단일 부동소수점 숫자 변환
Can you write Python code for it?

time.time()

ts = time.localtime()
ts

time.mktime(ts)


I am working on the file "Lecture/02. 파이썬 프로그래밍/9) Python의  날짜 및 시간 관련 패키지 소개.ipynb".
The first task is:
timedelta 클래스

속성
days: 일수
seconds: 초. (0 ~ 86399)

microseconds: 마이크로초 (0 and 999999)

메소드

total_seconds(): 모든 속성을 초단위로 모아서 변환
Can you write Python code for it?

td.days, td.seconds, td.microseconds

td.total_seconds()


I am working on the file "Lecture/02. 파이썬 프로그래밍/9) Python의  날짜 및 시간 관련 패키지 소개.ipynb".
The first task is:
timedelta와 날짜시간 연산

빼기

datetime - datetime => timedelta

더하기

datetime + timedelta => datetime
Can you write Python code for it?

dt1 = datetime.datetime(2016, 2, 19, 14)
dt2 = datetime.datetime(2016, 1, 2, 13)
td = dt1 - dt2
td


I am working on the file "Lecture/02. 파이썬 프로그래밍/9) Python의  날짜 및 시간 관련 패키지 소개.ipynb".
The first task is:
문자열 변환

Parsing
문자열 -> datetime
strptime(date_string, format)
Formatting
datetime -> 문자열
strftime(format)
Can you write Python code for it?

dt1 = datetime.datetime.strptime("2015-12-31 11:32", "%Y-%m-%d %H:%M")
dt1

dt1.strftime("%d/%m/%y")

dt1.strftime("%A %d. %B %Y")


I am working on the file "Lecture/02. 파이썬 프로그래밍/9) Python의  날짜 및 시간 관련 패키지 소개.ipynb".
The first task is:
타시간대로 변환

astimezone 메소드
Can you write Python code for it?

t1 = datetime.datetime.now()
lt1 = seoul.localize(t1)
lt3 = lt1.astimezone(pytz.timezone("US/Eastern"))
lt3


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/1) NumPy 소개.ipynb".
The first task is:
그러나 ndarray 클래스 객체 a와 리스트 클래스 객체 b는 많은 차이가 있다. 우선 리스트 클래스 객체는 내부적은 linked list와 같은 형태를 가지므로 각각의 원소가 다른 자료형이 될 수 있다. 그러나 ndarray 클래스 객체는 C언어의 행렬처럼 연속적인 메모리 배치를 가지기 때문에 모든 원소가 같은 자료형이어야 한다. 이러한 제약을 가지는 대신 내부의 원소에 대한 접근과 반복문 실행이 빨라진다.
ndarray 클래스의 또 다른 특성은 행렬의 각 원소에 대한 연산을 한 번에 처리하는 벡터화  연산(vectorized operation)을 지원한다는 점이다. 예를 들어 ndarray 클래스 객체의 원소의 크기를 모두 제곱하기 위해서는 객체 자체를 제곱하는 것만으로 원하는 결과를 얻을 수 있다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/1) NumPy 소개.ipynb".
The first task is:
다차원 행렬의 생성
ndarray 는 N-dimensional Array의 약자이다. 이름 그대로 ndarray 클래스는 단순 리스트와 유사한 1차원 행렬 이외에도 2차원 행렬, 3차원 행렬 등의 다차원 행렬 자료 구조를 지원한다.
예를 들어 다음과 같이 리스트의 리스트를 이용하여 2차원 행렬을 생성하거나 리스트의 리스트의 리스트를 이용하여 3차원 행렬을 생성할 수 있다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/1) NumPy 소개.ipynb".
The first task is:
만들어진 ndarray 객체의 표현식(representation)을 보면 바깥쪽에 array()란 것이 붙어 있을 뿐 리스트와 동일한 구조처럼 보인다. 실제로 0, 1, 2, 3 이라는 원소가 있는 리스트는 다음과 같이 만든다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/1) NumPy 소개.ipynb".
The first task is:
이는 다음과 같이 간단하게 쓸 수도 있다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/1) NumPy 소개.ipynb".
The first task is:
행렬 인덱싱
NumPy ndarray 클래스의 또다른 강력한 기능은 행렬 인덱싱(fancy indexing)이라고도 부르는 행렬 인덱싱(array indexing) 방법이다. 인덱싱이라는 이름이 붙었지만 사실은 데이터베이스의 질의(Query) 기능을 수행한다.
행렬 인덱싱에서는 대괄호(Bracket, [])안의 인덱스 정보로 숫자나 슬라이스가 아닌 ndarray 행렬을 받을 수 있다. 여기에서는 이 행렬을 편의상 인덱스 행렬이라고 부르겠다. 행렬 인덱싱의 방식에은 불리안(Boolean) 행렬 방식과 정수 행렬 방식 두가지가 있다.
먼저 불리안 행렬 인덱싱 방식은 인덱스 행렬의 원소가 True, False 두 값으로만 구성되며 인덱스 행렬의 크기가 원래 ndarray 객체의 크기와 같아야 한다.
예를 들어 다음과 같은 1차원 ndarray에서 홀수인 원소만 골라내려면 홀수인 원소에 대응하는 인덱스 값이 True이고 짝수인 원소에 대응하는 인덱스 값이 False인 인덱스 행렬 사용한다.
Can you write Python code for it?

a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
idx = np.array([True, False, True, False, True, False, True, False, True, False])
a[idx]


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/1) NumPy 소개.ipynb".
The first task is:
행렬의 차원 및 크기는 ndim 속성과 shape 속성으로 알 수 있다.
Can you write Python code for it?

print(a.ndim)
print(a.shape)

print(b.ndim)
print(b.shape)

print(c.ndim)
print(c.shape)


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
1이 아닌 0으로 초기화된 배열을 생성하려면 ones 명령을 사용한다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
vstack 명령은 열의 수가 같은 두 개 이상의 배열을 위아래로 연결하여 행의 수가 더 많은 배열을 만든다. 연결할 배열은 마찬가지로 하나의 리스트에 담아야 한다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
그리드 생성
변수가 2개인 2차원 함수의 그래프를 그리거나 표를 작성하려면 많은 좌표를 한꺼번에 생성하여 각 좌표에 대한 함수 값을 계산해야 한다.
예를 들어 x, y 라는 두 변수를 가진 함수에서 x가 0부터 2까지, y가 0부터 4까지의 사각형 영역에서 변화하는 과정을 보고 싶다면 이 사각형 영역 안의 다음과 같은 (x,y) 쌍 값들에 대해 함수를 계산해야 한다.
$$ (x,y) = (0,0), (0,1), (0,2), (0,3), (0,4), (1,0), \cdots (2,4) $$
이러한 과정을 자동으로 해주는 것이 NumPy의 meshgrid 명령이다. meshgrid 명령은 사각형 영역을 구성하는 가로축의 점들과 세로축의 점을 나타내는 두 벡터를 인수로 받아서 이 사각형 영역을 이루는 조합을 출력한다. 단 조합이 된 (x,y)쌍을 x값만을 표시하는 행렬과 y값만을 표시하는 행렬 두 개로 분리하여 출력한다.
Can you write Python code for it?

x = np.arange(3)
x

y = np.arange(5)
y

X, Y = np.meshgrid(x, y)

X

Y

[zip(x, y) for x, y in zip(X, Y)]

plt.scatter(X, Y, linewidths=10);


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
만약 부동소수점을 사용하는 경우에는 무한대를 표현하기 위한 np.inf와 정의할 수 없는 숫자를 나타내는 np.nan 을 사용할 수 있다.
Can you write Python code for it?

np.exp(-np.inf)

np.array([1, 0]) / np.array([0, 0])


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
만약 크기를 튜플(tuple)로 명시하지 않고 특정한 배열 혹은 리스트와 같은 크기의 배열을 생성하고 싶다면 ones_like, zeros_like 명령을 사용한다.
Can you write Python code for it?

e = range(10)
print(e)
f = np.ones_like(e, dtype="f")
f


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
문자열 배열도 가능하지면 모든 원소의 문자열 크기가 같아야 한다. 만약 더 큰 크기의 문자열을 할당하면 잘릴 수 있다.
Can you write Python code for it?

c = np.zeros(5, dtype="S4")
c[0] = "abcd"
c[1] = "ABCDE"
c


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
배열 생성
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
배열 연결
행의 수나 열의 수가 같은 두 개 이상의 배열을 연결하여(concatenate) 더 큰 배열을 만들 때는 다음과 같은 명령을 사용한다.

hstack
vstack
dstack
stack
r_
tile

hstack 명령은 행의 수가 같은 두 개 이상의 배열을 옆으로 연결하여 열의 수가 더 많은 배열을 만든다. 연결할 배열은 하나의 리스트에 담아야 한다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
배열의 크기 변형
일단 만들어진 배열의 내부 데이터는 보존한 채로 형태만 바꾸려면 reshape 명령이나 메서드를 사용한다. 예를 들어 12개의 원소를 가진 1차원 행렬은 3x4 형태의 2차원 행렬로 만들 수 있다.
Can you write Python code for it?

a = np.arange(12)
a

b = a.reshape(3, 4)
b


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
배열의 크기가 커지면 배열을 초기화하는데도 시간이 걸린다. 이 시간을 단축하려면 생성만 하고 초기화를 하지 않는 empty 명령을 사용할 수 있다. empty 명령으로 생성된 배열에 어떤 값이 들어있을지는 알 수 없다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
사용하는 원소의 갯수가 정해저 있기 때문에 reshape 명령의 형태 튜플의 원소 중 하나는 -1이라는 숫자로 대체할 수 있다. -1을 넣으면 해당 숫자는 다를 값에서 계산되어 사용된다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
앞에서 파이썬 리스트를 NumPy의 ndarray 객체로 변환하여 생성하려면 array 명령을 사용하였다.  그러나 보통은 이러한 기본 객체없이 다음과 같은 명령을 사용하여 바로 ndarray 객체를 생성한다.

zeros, ones
zeros_like, ones_like
empty
arange
linspace, logspace
rand, randn

크기가 정해져 있고 모든 값이 0인 배열을 생성하려면 zeros 명령을 사용한다. dtype 인수가 없으면 정수형이 된다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/2) NumPy 배열 생성과 변형.ipynb".
The first task is:
임의의 난수를 생성하고 싶다면 random 서브패키지의 rand 혹은 randn 명령을 사용한다. rand 명령을 uniform 분포를 따르는 난수를 생성하고 randn 명령을 가우시안 정규 분포를 따르는 난수를 생성한다. 생성할 시드(seed)값을 지정하려면 seed 명령을 사용한다.
Can you write Python code for it?

np.random.seed(0)

np.random.rand(4)

np.random.randn(3,5)


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/3) NumPy 연산.ipynb".
The first task is:
NumPy 곱셉의 경우에는 행렬의 곱, 즉 내적(inner product, dot product)의 정의와 다르다. 따라서 이 경우에는 별도로 dot이라는 명령 혹은 메서드를 사용해야 한다.
Can you write Python code for it?

x = np.arange(10)
y = np.arange(10)
x * y

np.dot(x, y)

x.dot(y)


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/3) NumPy 연산.ipynb".
The first task is:
sort 메서드는 해당 객체의 자료 자체가 변화하는 in-place 메서드이므로 사용할 때 주의를 기울여야 한다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/3) NumPy 연산.ipynb".
The first task is:
그러나 NumPy는 벡터화 연산을 지원하므로 다음과 같이 덧셈 연산 하나로 끝난다. 위에서 보인 선형 대수의 벡터 기호를 사용한 연산과 코드가 완전히 동일하다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/3) NumPy 연산.ipynb".
The first task is:
만약 NumPy 에서 제공하는 지수 함수, 로그 함수 등의 수학 함수를 사용하면 element-wise 벡터화 연산을 지원한다.
Can you write Python code for it?

a = np.arange(5)
a

np.exp(a)

10**a

np.log(a)

np.log10(a)


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/3) NumPy 연산.ipynb".
The first task is:
만약 배열 전체를 비교하고 싶다면 array_equal 명령을 사용한다.
Can you write Python code for it?

a = np.array([1, 2, 3, 4])
b = np.array([4, 2, 2, 4])
c = np.array([1, 2, 3, 4])

np.array_equal(a, b)

np.array_equal(a, c)


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/3) NumPy 연산.ipynb".
The first task is:
만약 자료를 정렬하는 것이 아니라 순서만 알고 싶다면 argsort 명령을 사용한다.
Can you write Python code for it?

a = np.array([4, 3, 1, 2])
j = np.argsort(a)
j

a[j]


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/3) NumPy 연산.ipynb".
The first task is:
브로드캐스팅은 더 차원이 높은 경우에도 적용된다. 다음 그림을 참조하라.
<img src="https://datascienceschool.net/upfiles/dbd3775c3b914d4e8c6bbbb342246b6a.png" style="width: 60%; margin: 0 auto 0 auto;">
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/3) NumPy 연산.ipynb".
The first task is:
연산 속도도 벡터화 연산이 훨씬 빠른 것을 볼 수 있다.
Element-Wise 연산
NumPy의 벡터화 연산은 같은 위치의 원소끼리 연산하는 element-wise 연산이다. NumPy의 ndarray를 선형 대수의 벡터나 행렬이라고 했을 때 덧셈, 뺄셈은 NumPy 연산과 일치한다
스칼라와 벡터의 곱도 마찬가지로 선형 대수에서 사용하는 식과 NumPy 코드가 일치한다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/3) NumPy 연산.ipynb".
The first task is:
연산의 대상이 2차원 이상인 경우에는 어느 차원으로 계산을 할 지를 axis 인수를 사용하여 지시한다. axis=0인 경우는 행 연산, axis=1인 경우는 열 연산 등으로 사용한다. 디폴트 값은 0이다.
<img src="https://datascienceschool.net/upfiles/edfaf93a7f124f359343d1dcfe7f29fc.png", style="margin: 0 auto 0 auto;">
Can you write Python code for it?

x = np.array([[1, 1], [2, 2]])
x

x.sum()

x.sum(axis=0)   # columns (first dimension)

x.sum(axis=1)   # rows (second dimension)

y = np.array([[1, 2, 3], [5, 6, 1]])
np.median(y, axis=-1) # last axis


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/3) NumPy 연산.ipynb".
The first task is:
정렬
sort 명령이나 메서드를 사용하여 배열 안의 원소를 크기에 따라 정렬하여 새로운 배열을 만들 수도 있다. 2차원 이상인 경우에는 마찬가지로 axis 인수를 사용하여 방향을 결정한다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/4) NumPy를 활용한 선형대수 입문.ipynb".
The first task is:
그럼 이러한 행렬의 곱셈은 데이터 분석에서 어떤 경우에 사용될까. 몇가지 예를 살펴본다.
가중 벡터합
어떤 데이터 레코드 즉, 벡터의 가중합은 $w^Tx$ 또는 $x^Tw$로 표시할 수 있다는 것을 배웠다. 그런데 만약 이렇게 $w$ 가중치를 사용한 가중합을 하나의 벡터 $x$가 아니라 여러개의 벡터 $x_1, \cdots, x_M$개에 대해서 모두 계산해야 한다면 이 계산을 다음과 같이 $Xw$라는 기호로 간단하게 표시할 수 있다.
$$
\begin{bmatrix}
w_1 x_{1,1} + w_2 x_{1,2} + \cdots + w_N x_{1,N} \
w_1 x_{2,1} + w_2 x_{2,2} + \cdots + w_N x_{2,N} \
\vdots  \
w_1 x_{M,1} + w_2 x_{M,2} + \cdots + w_N x_{M,N} \
\end{bmatrix}
=
\begin{bmatrix}
x_{1,1} & x_{1,2} & \cdots & x_{1,N} \
x_{2,1} & x_{2,2} & \cdots & x_{2,N} \
\vdots & \vdots & \vdots & \vdots \
x_{M,1} & x_{M,2} & \cdots & x_{M,N} \
\end{bmatrix}
\begin{bmatrix}
w_1 \ w_2 \ \vdots \ w_N
\end{bmatrix}
=
\begin{bmatrix}
x_1^T \
x_2^T \
\vdots \
x_N^T \
\end{bmatrix}
\begin{bmatrix}
w_1 \ w_2 \ \vdots \ w_N
\end{bmatrix}
= X w
$$
잔차
선형 회귀 분석(linear regression)을 한 결과는 가중치 벡터 $w$라는 형태로 나타나고 예측치는 이 가중치 벡터를 사용한 독립 변수 데이터 레코드 즉, 벡터 $x_i$의 가중합 $w^Tx_i$이 된다. 이 예측치와 실제 값 $y_i$의 차이를 오차(error) 혹은 잔차(residual) $e_i$ 이라고 한다. 이러한 잔차 값을 모든 독립 변수 벡터에 대해 구하면 잔차 벡터 $e$가 된다.
$$ e_i = y_i - w^Tx_i $$
잔차 벡터는 다음과 같이 $y-Xw$로 간단하게 표기할 수 있다.
$$
e =
\begin{bmatrix}
e_{1} \
e_{2} \
\vdots \
e_{M} \
\end{bmatrix}
=
\begin{bmatrix}
y_{1} \
y_{2} \
\vdots \
y_{M} \
\end{bmatrix}
-
\begin{bmatrix}
w^T x_{1} \
w^T x_{2} \
\vdots \
w^T x_{M} \
\end{bmatrix}
=
\begin{bmatrix}
y_{1} \
y_{2} \
\vdots \
y_{M} \
\end{bmatrix}
-
\begin{bmatrix}
x^T_{1}w \
x^T_{2}w \
\vdots \
x^T_{M}w \
\end{bmatrix}
=
\begin{bmatrix}
y_{1} \
y_{2} \
\vdots \
y_{M} \
\end{bmatrix}
-
\begin{bmatrix}
x^T_{1} \
x^T_{2} \
\vdots \
x^T_{M} \
\end{bmatrix}
w
= y - Xw
$$
$$
e = y - Xw
$$
Can you write Python code for it?

from sklearn.datasets import make_regression
X, y = make_regression(4,3)

X

y

w = np.linalg.lstsq(X, y)[0]
w

e = y - np.dot(X, w)
e


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/4) NumPy를 활용한 선형대수 입문.ipynb".
The first task is:
대각 행렬 중에서도 모든 대각 성분의 값이 1인 대각 행렬을 단위 행렬(identity matrix)이라고 한다. 단위 행렬은 보통 알파벳 대문자 $I$로 표기하는 경우가 많다.
$$ I \in \mathbb{R}^{N \times N} $$
$$
I =
\begin{bmatrix}
1 & 0 & \cdots & 0 \
0 & 1 & \cdots & 0 \
\vdots & \vdots & \ddots & \vdots \
0 & 0 & \cdots & 1 \
\end{bmatrix}
$$
NumPy로 단위행렬을 생성하려면 identity 혹은 eye 명령을 사용한다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/4) NumPy를 활용한 선형대수 입문.ipynb".
The first task is:
벡터 곱셈
두 행렬의 곱셈을 정의하기 전에 우선 두 벡터의 곱셈을 알아보자. 벡터의 곱셈에는 내적(inner product)과 외적(outer product) 두 가지가 있다 여기에서는 내적에 대해서만 설명한다. 내적은 dot product라고 하기도 한다.
두 벡터의 곱(내적)이 정의되려면 우선 두 벡터의 길이가 같으며 앞의 벡터가 행 벡터이고 뒤의 벡터가 열 벡터이어야 한다.  이때 두 벡터의 곱은 다음과 같이 각 원소들을 element-by-element로 곱한 다음에 그 값들을 다시 모두 합해서 하나의 스칼라값으로 계산된다.
$$
x^T y =
\begin{bmatrix}
x_{1} & x_{2} & \cdots & x_{N}
\end{bmatrix}
\begin{bmatrix}
y_{1} \
y_{2} \
\vdots \
y_{N} \
\end{bmatrix}
= x_1 y_1 + \cdots + x_N y_N
= \sum_{i=1}^N x_i y_i
$$
$$ x \in \mathbb{R}^{N \times 1} , \; y \in \mathbb{R}^{N \times 1} \;  \rightarrow \; x^T y \in \mathbb{R} $$
벡터의 곱은 왜 이렇게 복잡하게 정의된 것일까. 벡터의 곱을 사용한 예를 몇가지 살펴보자
가중합
가중합(weighted sum)이란 복수의 데이터를 단순히 합하는 것이 아니라 각각의 수에 중요도에 따른 어떤 가중치를 곱한 후 이 값을 합하는 것을 말한다. 만약 데이터가 $x_1, \cdots, x_N$ 이고 가중치가 $w_1, \cdots, w_N$ 이면 가중합은 다음과 같다.
$$ w_1 x_1 + \cdots + w_N x_N = \sum_{i=1}^N w_i x_i   $$
이를 벡터의 곱으로 나타내면 다음과 같이 $w^Tx$ 또는 $x^Tw$ 라는 간단한 수식으로 표시할 수 있다.
$$ w_1 x_1 + \cdots + w_N x_N = \sum_{i=1}^N w_i x_i   =
\begin{bmatrix}
w_{1} && w_{2} && \cdots && w_{N}
\end{bmatrix}
\begin{bmatrix}
x_1 \ x_2 \ \vdots \ x_N
\end{bmatrix}
= w^Tx =
\begin{bmatrix}
x_{1} && x_{2} && \cdots && x_{N}
\end{bmatrix}
\begin{bmatrix}
w_1 \ w_2 \ \vdots \ w_N
\end{bmatrix}
= x^Tw   $$
NumPy에서 벡터 혹은 이후에 설명할 행렬의 곱은 dot이라는 명령으로 계산한다. 2차원 행렬로 표시한 벡터의 경우에는 결과값이 스칼라가 아닌 2차원 행렬값임에 유의한다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/4) NumPy를 활용한 선형대수 입문.ipynb".
The first task is:
이차 형식
벡터의 이차 형식(Quadratic Form) 이란 어떤 벡터의 각 원소에 대해 가능한 모든 쌍의 조합 $(x_i, x_j)$을 구한 다음 그 곱셈$x_ix_j$을 더한 것을 말한다. 이 때 각 쌍에 대해 서로 다른 가중치 $a_{i,j}$를 적용하여 $a_{i,j}x_ix_j$의 합을 구한다면 다음과 같이 $x^TAx$라는 간단한 식으로 쓸 수 있다.
$$
x^T A x =
\begin{bmatrix}
x_{1} & x_{2} & \cdots & x_{N}
\end{bmatrix}
\begin{bmatrix}
a_{1,1} & a_{1,2} & \cdots & a_{1,N} \
a_{2,1} & a_{2,2} & \cdots & a_{2,N} \
\vdots & \vdots & \ddots & \vdots \
a_{N,1} & a_{N,2} & \cdots & a_{N,N} \
\end{bmatrix}
\begin{bmatrix}
x_{1} \
x_{2} \
\vdots \
x_{N} \
\end{bmatrix} = \sum_{i=1}^{N} \sum_{j=1}^{N} a_{i,j} x_i x_j
$$
예를 들어 $ x = [1, 2, 3]^T $ 이고 A가 다음과 같다면
$$ A =
\begin{pmatrix}
1 & 2 & 3 \
4 & 5 & 6 \
7 & 8 & 9 \
\end{pmatrix}
$$
NumPy 에서 벡터의 이차 형식은 다음과 같이 계산한다.
Can you write Python code for it?

x = np.array([1,2,3])
x

A = np.arange(1, 10).reshape(3,3)
A

np.dot(np.dot(x, A), x)


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/4) NumPy를 활용한 선형대수 입문.ipynb".
The first task is:
잔차 제곱합
잔차의 크기는 잔차 벡터의 각 원소를 제곱한 후 더한 잔차 제곱합(RSS: Residual Sum of Squares)를 이용하여 구한다. 이 값은 $e^Te$로 간단하게 쓸 수 있으며 그 값은 다음과 같이 계산한다.
$$
e^Te = \sum_{i=1}^{N} (y_i - w^Tx_i)^2 = (y - Xw)^T (y - Xw)
$$
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/4) NumPy를 활용한 선형대수 입문.ipynb".
The first task is:
행렬
행렬은 복수의 차원을 가지는 데이터 레코드가 다시 여러개 있는 경우의 데이터를 합쳐서 표기한 것이다. 예를 들어 앞서 말한 붓꽃의 예에서 6개의 붓꽃에 대해 크기를 측정하였다면 4차원 붓꽃 데이터가 6개가 있다. 즉, $4 \times 6 = 24$개의 실수 숫자가 있는 것이다. 이 숫자 집합을
 행렬로 나타내면 다음과 같다. 행렬은 보통 $X$와 같이 알파벳 대문자로 표기한다.
$$X =
\begin{bmatrix}
x_{1, 1} & x_{1, 2} & x_{1, 3} & x_{1, 4} \
x_{2, 1} & x_{2, 2} & x_{2, 3} & x_{2, 4} \
x_{3, 1} & x_{3, 2} & x_{3, 3} & x_{3, 4} \
x_{4, 1} & x_{4, 2} & x_{4, 3} & x_{4, 4} \
x_{5, 1} & x_{5, 2} & x_{5, 3} & x_{5, 4} \
x_{6, 1} & x_{6, 2} & x_{6, 3} & x_{6, 4} \
\end{bmatrix}
$$
행렬 안에서 원소의 위치를 표기할 때는 $x_{2, 3}$ 처럼 두 개의 숫자 쌍을 아랫 첨자(sub-script)로 붙여서 표기한다. 첫번째 숫자가 행(row)을 뜻하고 두번째 숫자가 열(column)을 뜻한다. 예를 들어 $x_{2, 3}$ 는 두번째 행(위에서 아래로 두번째), 세번째 열(왼쪽에서 오른쪽으로 세번째)의 숫자를 뜻한다.
붓꽃의 예에서는 하나의 데이터 레코드가 4차원이였다는 점을 기억하자. 따라서 이 행렬 표기에서는 하나의 행(row)이 붓꽃 하나에 대한 데이터 레코드가 된다.
하나의 데이터 레코드를 나타낼 때는 하나의 열(column)로 나타내고 복수의 데이터 레코드 집합을 나타낼 때는 하나의 데이터 레코드가 하나의 행(row)으로 표기하는 것은 일관성이 없어 보지만 데이터 분석에서 쓰는 일반적인 관례이므로 익히고 있어야 한다.
만약 이 데이터를 이용하여 붓꽃의 종을 결정하는 예측 문제를 풀고 있다면 이 행렬를 feature matrix라고 하기도 한다.
이 행렬의 크기를 수식으로 표시할 때는 행의 크기 곱하기 열의 크기의 형태로 다음과 같이 나타낸다.
$$ X \in \mathbb{R}^{4\times 6} $$
벡터도 열의 수가 1인 특수한 행렬이기 때문에 벡터의 크기를 표시할 때 행렬 표기에 맞추어 다음과 같이 쓰기도 한다.
$$ x \in \mathbb{R}^{4\times 1} $$
NumPy를 이용하여 행렬을 표기할 때는 2차원 ndarray 객체를 사용한다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/4) NumPy를 활용한 선형대수 입문.ipynb".
The first task is:
행렬의 행 표기법과 열 표기법
전치 연산과 행 벡터, 열 벡터를 이용하면 행렬을 다음과 같이 복수의 열 벡터들 $c_i$, 또는 복수의 열 벡터들 $r_j^T$ 을 합친(concatenated) 형태로 표기할 수도 있다.
$$
X
=
\begin{bmatrix}
c_1 & c_2 & \cdots & c_M
\end{bmatrix}
=
\begin{bmatrix}
r_1^T \ r_2^T \ \vdots \ r_N^T
\end{bmatrix}
$$
$$ X \in \mathbb{R}^{N\times M} ,\;\;\; c_i \in R^{N \times 1} \; (i=1,\cdots,M) ,\;\;\; r_j \in R^{1 \times M} \; (j=1,\cdots,N) $$
행렬 덧셈과 뺄셈
행렬의 덧셈과 뺄셈은 같은 크기를 가진 두개의 행렬에 대해 정의되며 각각의 원소에 대해 덧셈과 뺄셈을 하면 된다. 이러한 연산을 element-wise 연산이라고 한다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/5) 행렬의 연산과 성질.ipynb".
The first task is:
대각 성분
대각 성분(trace) 행렬의 특성을 결정하는 숫자 중 하나로 정방 행렬(square matrix)에 대해서만 정의되며 다음과 같이 대각 성분(diaginal)의 합으로 계산된다.
$$ \operatorname{tr}(A) = a_{11} + a_{22} + \dots + a_{nn}=\sum_{i=1}^{n} a_{ii} $$
대각 성분은 다음과 같은 성질을 지닌다.
$$ \text{tr} (cA) = c\text{tr} (A) $$
$$ \text{tr} (A^T) = \text{tr} (A) $$
$$ \text{tr} (A + B) = \text{tr} (A) + \text{tr} (B)$$
$$ \text{tr} (AB) = \text{tr} (BA) $$
$$ \text{tr} (ABC) = \text{tr} (BCA) = \text{tr} (CAB) $$
특히 마지막 성질은 trace trick이라고 하여 이차 형식(quadratic form)의 값을 구하는데 유용하게 사용된다.
$$ x^TAx = \text{tr}(x^TAx) = \text{tr}(Axx^T)  = \text{tr}(xx^TA) $$
NumPy에서는 linalg 서브패키지의 trace 명령으로 trace를 계산할 수 있다.
NumPy에서는 linalg 서브패키지의 trace 명령으로 trace를 계산할 수 있다.
Can you write Python code for it?


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/5) 행렬의 연산과 성질.ipynb".
The first task is:
행렬식
정방 행렬 $A$의 행렬식(determinant) $\det (A)$ 는 Laplace expansion 또는 cofactor expansion 이라고 불리는 재귀적인 방법으로 정의된다.
이 식에서 $a_{i,j}$는 $A$의 $i$행, $j$열 원소이고 $M_{i,j}$은 정방 행렬 $A$ 에서 $i$행과 $j$열을 지워서 얻어진 행렬의 행렬식이다. 이 식에서 행이나 열은 임의의 것을 선택해도 된다.
$$ \det(A) = \sum_{i=1}^n (-1)^{i+j} a_{i,j} M_{i,j} =  \sum_{j=1}^n (-1)^{i+j} a_{i,j} M_{i,j}  $$
행렬식은 다음과 같은 성질을 만족한다.
$$ \det(I) = 1 $$
$$ \det(A^{\rm T}) = \det(A) $$
$$ \det(A^{-1}) = \frac{1}{\det(A)}=\det(A)^{-1} $$
$$ \det(AB) = \det(A)\det(B) $$
$$ A \in \mathbf{R}^n \;\;\; \rightarrow \;\;\; \det(cA) = c^n\det(A) $$
또한 역행렬은 행렬식과 다음과 같은 관계를 가진다.
$$ A^{-1} = \dfrac{1}{\det A} M = \dfrac{1}{\det A}
\begin{bmatrix}
M_{1,1}&\cdots&M_{1,n}\
\vdots&\ddots&\vdots\
M_{n,1}&\cdots&M_{n,n}\
\end{bmatrix}
$$
NumPy에서는 linalg 서브패키지의 det 명령으로 trace를 계산할 수 있다.
Can you write Python code for it?

A = np.array([[1, 2], [3, 4]])
A

np.linalg.det(A)


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/6) 연립방정식과 역행렬.ipynb".
The first task is:
위 해결 방법에는 두 가지 의문이 존재한다. 우선 역행렬이 존재하는지 어떻게 알 수 있는가? 또 두 번째 만약 미지수의 수와 방정식의 수가 다르다면 어떻게 되는가?
행렬식
우선 역행렬이 존재하는지 알아보는 방법의 하나로 행렬식(determinant)라는 정방 행렬의 특징을 계산하는 방법이다. 행렬 $A$ 에 대한 행렬식은 $\text{det}A$라는 기호로 표기한다.
행렬식(determinant)의 수학적인 정의는 상당히 복잡하므로 여기에서는 생략한다. 다만 몇가지 크기의 정방 행렬에 대해서는 다음과 같은 수식으로 구할 수 있다.

1×1 행렬의 행렬식

$$\det\begin{bmatrix}a\end{bmatrix}=a$$

2×2 행렬의 행렬식
$$\det\begin{bmatrix}a&b\c&d\end{bmatrix}=ad-bc$$

3×3 행렬의 행렬식
$$\det\begin{bmatrix}a&b&c\d&e&f\g&h&i\end{bmatrix}=aei+bfg+cdh-ceg-bdi-afh$$

NumPy에서는 det 명령으로 행렬식의 값을 구할 수 있다.
Can you write Python code for it?

np.random.seed(0)
A = np.random.randn(3, 3)
A

np.linalg.det(A)


I am working on the file "Lecture/05. 기초 선형 대수 1 - 행렬의 정의와 연산/6) 연립방정식과 역행렬.ipynb".
The first task is:
행렬식과 역행렬 사이에는 다음의 관계가 있다.
 행렬식의 값이 0이 아니면 역행렬이 존재한다. 반대로 역행렬이 존재하면 행렬식의 값은 0이 아니다.
최소 자승 문제
연립 방정식은 다음과 같은 세 종류가 있다.

미지수의 수가 방정식의 수와 같다. ($N = M$)
미지수의 수가 방정식의 수보다 적다. ($N < M$)
미지수의 수가 방정식의 수보다 많다. ($N > M$)

1번의 경우는 앞에서 다루었다. 2번의 경우에는 너무 많은 해가 존재할 수 있다. 3번의 경우에는 2번과 반대로 모든 조건을 만족하는 해가 하나도 존재할 수 없을 수도 있다.
그런데 데이터 분석 문제에서는 $A$ 를 feature matrix, $x$ 를 가중치 벡터 $w$ 라고 보았을 때 데이터의 수가 가중치의 갯수보다 많은 경우가 일반적이다. 다만 이 때는 방정식이 정확하게 등호를 이루기를 바라지는 않는다. 즉, 대략적으로만 좌변과 우변이 비슷하면 되는 경우이다.
$$ Ax \approx b $$
이 경우에는 좌변과 우변의 차이를 최소하하는 문제로 바꾸어 풀 수 있다.
$$ e = Ax-b $$
$$ e^Te = (Ax-b)^T(Ax-b) $$
$$ x = \text{arg} \min_x e^Te = \text{arg} \min_x  \; (Ax-b)^T(Ax-b) $$
이러한 문제를 최소 자승(Least Square) 문제라고 한다.
최소 자승 문제의 답은 $A^TA$ 는 항상 정방행렬이 된다는 점을 사용하여  다음과 같이 풀 수 있다.
$$ Ax = b $$
$$ A^TAx = A^Tb $$
$$ (A^TA)x = A^Tb $$
$$ x = (A^TA)^{-1}A^T b $$
$$ x = ((A^TA)^{-1}A^T) b $$
이 값이 최소 자승 문제의 답이 된다는 것은 행렬의 미분을 사용하여 증명할 수 있다. 여기에서 행렬 $(A^TA)^{-1}A^T$ 를 행렬 $A$ 의 의사 역행렬(pseudo inverse)라고 하며 다음과 같이 $ A^{+}$ 로 표기하기도 한다.
$$ A^{+} = (A^TA)^{-1}A^T $$
NumPy의 lstsq 명령은 사실 이러한 최소 자승 문제를 푸는 명령이다.
Can you write Python code for it?

A = np.array([[2, 0], [-1, 1], [0, 2]])
A

b = np.array([[1], [0], [-1]])
b

Apinv = np.dot(np.linalg.inv(np.dot(A.T, A)), A.T)
Apinv

x = np.dot(Apinv, b)
x

np.dot(A, x) - b

x, resid, rank, s = np.linalg.lstsq(A, b)
x


I am working on the file "Lecture/06. 시각화/4) 웹 플롯을 위한 bokeh 패키지 소개.ipynb".
The first task is:
Bokeh 라이브러리 임포트
Bokeh는 원래 정적인 웹사이트로 렌더링 할 html 파일을 출력하는 것을 목표로 한다. 따라서 출력을 저장할 html 파일 패스를 지정해야 한다. 만약 주피터 노트북에서 작업한다면 다음과 같이 output_notebook 명령을 실행해야 한다.
Can you write Python code for it?

import bokeh.plotting as bp

# 주피터 노트북이 아닌 파일로 출력하는 경우
# bp.output_file("../images/msft_1.html", title="Bokeh Example (Static)")

# 주피터 노트북에서 실행하여 출력하는 경우
bp.output_notebook()


I am working on the file "Lecture/06. 시각화/4) 웹 플롯을 위한 bokeh 패키지 소개.ipynb".
The first task is:
다음으로 Figure 클래스의 메서드를 호출하여 실제 플롯 객체를 추가한다. 우선 라인 플롯을 그리기 위해 line 메서드을 실행한다.

http://bokeh.pydata.org/en/latest/docs/reference/plotting.html#bokeh.plotting.figure.Figure.line
Can you write Python code for it?

p.line(
    data['Date'],  # x 좌표
    data['Close'], # y 좌표
    color ='#0066cc',  # 선 색상
    legend ='MSFT',  # 범례 이름
)


I am working on the file "Lecture/06. 시각화/4) 웹 플롯을 위한 bokeh 패키지 소개.ipynb".
The first task is:
이제 show 명령어를 호출하여 실제 차트를 렌더링 한다.
Can you write Python code for it?


I am working on the file "Lecture/07. 미적분과 최적화/1) SymPy를 사용한 함수 미분.ipynb".
The first task is:
미분
미분(differenciation)이란 이러한 함수로부터 새로운 함수를 도출하는 변환의 일종이다. 미분을 통해 만들어진 새로운 함수는 원래 함수의 기울기(slope)를 나타낸다. 미분으로 만들어진 함수를 원래 함수의 도함수(derivative)라고 한다. 실제로는 극한과 수렴이라는 복잡한 개념을 사용하여  미분을 정의하지만 최적화(optimization)를 위해서는 단순히 기울기를 뜻한다고만 알아도 충분하다.
도함수는 함수 기호에 뒤에 prime 윗첨자를 붙이거나 함수 기호의 앞에 $\dfrac{d}{dx}$, $\dfrac{\partial}{\partial x}$ 등을 붙여서 표시한다. 분수처럼 표기하기도 하는데 분모의 위치에는 미분하고자 하는 변수가 오고 분자의 위치에는 미분하는 함수 자체의 기호나 혹은 함수 계산의 결과로 얻어지는 변수를 넣는다.
예를 들어 $y = f(x)$라는 함수를 미분하면 다음과 같다.
$$ f'(x) = \dfrac{d}{dx}(f) = \dfrac{df}{dx}  = \dfrac{d}{dx}(y) = \dfrac{dy}{dx} $$
미분 공식
현실적으로 미분은 다음에 설명할 몇가지 공식(formula)를 조합하여 원래 함수에서 도함수를 도출하는 과정이다. 함수가 복잡해지면 몇 페이지에 달아는 공식집이 필요할 정도이지만 여기에서는 가장 핵심적인 몇가지 공식만을 소개한다. 다양한 미분 공식에 대해 알고 싶다면 다음 웹사이트들을 참조한다.

https://en.wikipedia.org/wiki/Derivative#Rules_of_computation
https://en.wikipedia.org/wiki/Differentiation_rules

기본 미분 공식

상수

$$ \dfrac{d}{dx}(c) = 0 $$
$$ \dfrac{d}{dx}(cf) = c \cdot \dfrac{df}{dx} $$

거듭제곱

$$ \dfrac{d}{dx}(x^n) = n x^{n-1} $$

로그

$$ \dfrac{d}{dx}(\log x) = \dfrac{1}{x} $$

지수

$$ \dfrac{d}{dx}(e^x) = e^x $$

선형 조합

$$ \dfrac{d}{dx}\left(c_1 f_1 + c_2 f_2 \right) = c_1 \dfrac{df_1}{dx} + c_2 \dfrac{df_2}{dx}$$
이러한 기본 공식을 사용하여 다음 함수를 미분하면,
$$ y = 1 + 2x + 3x^2 + 4\exp(x) + 5\log(x) $$
답은 다음과 같다.
$$ \dfrac{dy}{dx} = 2 + 6x + 4\exp(x) + \dfrac{5}{x} $$
곱셈 법칙
어떤 함수의 형태가 두 개의 함수를 곱한 것과 같을 때는 다음과 같이 각 개별 함수의 도함수를 사용하여 원래의 함수의 도함수를 구한다.
$$  \dfrac{d}{dx}\left( f  \cdot g \right) =  \dfrac{df}{dx} \cdot g + f \cdot  \dfrac{dg}{dx} $$
곱셈 법칙을 사용하면 다음과 같은 함수를 미분하여,
$$ f = x \cdot \exp(x) $$
다음과 같은 도함수를 구한다.
$$ \dfrac{df}{dx} = \exp(x) + x \exp(x) $$
연쇄 법칙
연쇄 법칙(chain rule)은 미분하고자 하는 함수가 어떤 두 함수의 nested form 인 경우 적용할 수 있다.
$$ f(x) = h(g(x)) $$
인 경우 도함수는 다음과 같이 구한다.
$$ \dfrac{df}{dx} = \dfrac{df}{dg} \cdot \dfrac{dg}{dx} $$
예를 들어 정규 분포의 확률 밀도 함수는 기본적으로 다음과 같은 형태라고 볼 수 있다.
$$ f = \exp \dfrac{(x-\mu)^2}{\sigma^2} $$
이 함수의 도함수는 다음과 같이 구할 수 있다.
$$  f = exp(z) \;,\;\;\;\; z = \dfrac{y^2}{\sigma^2}   \;,\;\;\;\;   y = x-\mu   $$
$$ \dfrac{df}{dx} = \dfrac{df}{dz} \cdot \dfrac{dz}{dy} \cdot...
Can you write Python code for it?

import sympy
sympy.init_printing(use_latex='mathjax')  # Juypter 노트북에서 수학식의 LaTeX 표현을 위해 필요함

x = sympy.symbols('x')
x

type(x)


I am working on the file "Lecture/07. 미적분과 최적화/1) SymPy를 사용한 함수 미분.ipynb".
The first task is:
복수의 기호를 사용하는 경우에도 편미분을 해야 한다.
Can you write Python code for it?

x, mu, sigma = sympy.symbols('x mu sigma')
f = sympy.exp((x-mu)**2)/sigma**2
f

sympy.diff(f, x)

sympy.simplify(sympy.diff(f, x))


I am working on the file "Lecture/07. 미적분과 최적화/1) SymPy를 사용한 함수 미분.ipynb".
The first task is:
일단 심볼 변수를 정의하면 이를 사용하여 다음과 같이 함수를 정의한다. 이 때 수학 함수는 SymPy 전용 함수를 사용해야 한다.
Can you write Python code for it?


I am working on the file "Lecture/07. 미적분과 최적화/1) SymPy를 사용한 함수 미분.ipynb".
The first task is:
편미분을 하는 경우에는 어떤 변수로 미분하는지를 명시해야 한다.
Can you write Python code for it?

x, y = sympy.symbols('x y')
f = x**2 + x*y + y**2
f

sympy.diff(f, x)

sympy.diff(f, y)


I am working on the file "Lecture/07. 미적분과 최적화/1) SymPy를 사용한 함수 미분.ipynb".
The first task is:
함수가 정의되면 diff 명령으로 미분을 할 수 있다. 또한 simplify 명령으로 소인수분해 등을 통한 수식 정리가 가능하다.
Can you write Python code for it?


I am working on the file "Lecture/07. 미적분과 최적화/1) SymPy를 사용한 함수 미분.ipynb".
The first task is:
함수의 그래프는 앞에서 그린 것처럼 부드러운 곡선(curve)의 형태로 나타나는 경우가 많다. 이 곡선에 대해 한 점만 공통으로 가지는 접선(tangent)를 그릴 수 있는데 이 접선이 수평선과 이루는 각도를 기울기(slope)라고 한다.
Can you write Python code for it?


I am working on the file "Lecture/08. 기초 확률론 2 - 확률분포/2) 확률 분포, 확률 변수, 확률 모형의 의미.ipynb".
The first task is:
정확한 묘사를 위해 구간의 수를 증가시키면 몇 가지 문제가 발생한다.
우선 구간의 간격이 작아지면서 하나의 구간에 있는 자료의 수가 점점 적어진다. 만약 구간 수가 무한대에 가깝다면 하나의 구간 폭은 0으로 수렴하고 해당 구간의 자료 수도 0으로 수렴할 것이다. 따라서 분포의 상대적인 모양을 살펴보기 힘들어진다. 이 문제는 누적 분포(cumulatice distribution)를 사용하면 해결할 수 있다.
두번째는 더 근본적인 문제로 서술을 위한 정보 자체가 증가하면서 정보의 단순화라는 원래의 목적을 상실한다는 점이다.
확률 모형
확률 분포를 보다 단순하게 묘사하기 위해 고안한 것이 확률 모형(probability model)이다.
확률 모형은 분포 함수(distribution function) 또는 밀도 함수(density function)라고 불리우는 미리 정해진 함수의 수식을 사용하여 분포의 모양을 정의(define)하는 방법이다. 이 때 분포의 모양을 결정하는 함수의 계수를 분포의 모수(parameter)라고 부른다.
예를 들어 가장 널리 쓰이는 정규 분포(Normal distribution)는 다음과 같은 수식으로 정의된다.
이 수식 자체의 이름은 $N$이고 함수의 독립 변수는 자료의 값을 의미하는 변수 $x$이다. 식에서 사용된 문자 $\mu$와 $\sigma$는 평균(mean)과 표준편차(standard deviation)이라는 이름의 모수이다.
$$ N(x; \mu, \sigma) = \frac{1}{\sigma\sqrt{2\pi}}\, e^{-\frac{(x - \mu)^2}{2 \sigma^2}} $$
이 함수식이 실제 분포와 어떤 관계를 가지는지는 분포 함수에 대한 다음 노트북을 참조한다.
[[school_notebook:4d74d1b5651245a7903583f30ae44608]]
다음 그림은 scipy를 사용하여 평균 0, 표준편차 1인 표준 정규 분포(standard normal distribution)의 모양을 그린것이다.
Can you write Python code for it?

x = np.linspace(-3, 3, 100)
y = sp.stats.norm.pdf(x)
plt.plot(x, y)


I am working on the file "Lecture/08. 기초 확률론 2 - 확률분포/4) 누적 분포 함수와 확률 밀도 함수.ipynb".
The first task is:
누적 밀도 함수 즉 cdf는 다음과 같은 특징을 가진다.

$F(-\infty) = 0$
$F(+\infty) = 1$
$F(x) \geq F(y) \;\; \text{ if } \;\; x > y $

확률 밀도 함수
누적 분포 함수는 확률 분포를 함수라는 편리한 상태로 바꾸어 주었다. 누적 분포 함수는 확률이 어느 사건(event)에 어느 정도 분포되어 있는지 수학적으로 명확하게 표현해 준다.
그러나 누적 분포 함수가 표현하는 사건이 음수 무한대를 시작점으로 하고 변수 $x$를 끝점으로 하는 구간이다보니 분포의 형상을 직관적으로 이해하기는 힘든 단점이 있다. 다시 말해서 어떤 확률 변수 값이 더 자주 나오는지에 대한 정보를 알기 힘들다는 점이다.
이를 알기 위해서는 확률 변수가 나올 수 있는 전체 구간 ($-\infty$ ~ $\infty$)을 아주 작은 폭을 가지는 구간들로 나눈 다음 각 구간의 확률을 살펴보는 것이 편리하다. 다만 이렇게 되면 구간의 폭(width)을 어느 정도로 정의해야 하는지에 대한 추가적인 약속이 필요하기 때문에 실효성이 떨어진다.
이러한 단점을 보완하기 위해 생각한 것이 절대적인 확률이 아닌 상대적인 확률 분포 형태만을 보기 위한 확률 밀도 함수(probability density function)이다.
누적 확률 분포 그래프의 x축의 오른쪽으로 이동하면서 크기의 변화를 살펴보자.만약 특정한 $x$값 근처의 구간에 확률이 배정되지 않았다면 누적 분포 함수는 그 구간을 지나도 증가하지 않는다. 즉, 기울기가 0이다. 왜냐하면 $x$ 값이 커졌다(x축의 오른쪽으로 이동하였다)는 것은 앞의 구간을 포함하는 더 큰 구간(사건)에 대한 확률을 묘사하고 있는 것인데 추가적으로 포함된 신규 구간에 확률이 없다면 그 신규 구간을 포함한 구간이나 포함하지 않은 구간이나 배정된 확률이 같기 때문이다.
누적 분포 함수의 기울기가 0이 아닌 경우는 추가적으로 포함된 구간에 0이 아닌 확률이 할당되어 있는 경우이다. 만약 더 많은 확률이 할당되었다면 누적 분포 함수는 그 구간을 지나면서 더 빠른 속도로 증가할 것이다. 다시 말해서 함수의 기울기가 커진다. 이러한 방식으로 누적 분포의 기울기의 크기를 보면 각 위치에 배정된 확률의 상대적 크기를 알 수 있다.
기울기를 구하는 수학적 연산이 미분(differentiation)이므로 확률 밀도 함수는 누적 분포 함수의 미분으로 정의한다.
$$ \dfrac{dF(x)}{dx} = f(x) $$
이를 적분으로 나타내면 다음과 같다.
$$ F(x) = \int_{-\infty}^{x} f(u) du $$
확률 밀도 함수는 특정 확률 변수 구간의 확률이 다른 구간에 비해 상대적으로 얼마나 높은가를 나타내는 것이며 그 값 자체가 확률은 아니다라는 점을 명심해야 한다.
확률 밀도 함수는 다음과 같은 특징을 가진다.

$-\infty$ 부터 $\infty$ 까지 적분하면 그 값은 1이 된다.

$$ \int_{-\infty}^{\infty} f(u)du = 1$$

확률 밀도 함수는 0보다 같거나 크다.

$$ f(x) \geq 0 $$
앞서 보인 시계 바늘 문제에서 확률 밀도함수를 구하면 다음과 같다.
Can you write Python code for it?

t = np.linspace(-100, 500, 1000)
F = t / 360
F[t < 0] = 0
F[t > 360] = 1
f = np.gradient(F)  # 수치미분
plt.plot(t, f)
plt.ylim(-0.0001, f.max()*1.1)
plt.xticks([0, 180, 360]);
plt.title("Probability Density Function");
plt.xlabel("$x$ (deg.)");
plt.ylabel("$f(x)$");


I am working on the file "Lecture/08. 기초 확률론 2 - 확률분포/4) 누적 분포 함수와 확률 밀도 함수.ipynb".
The first task is:
누적 분포 함수와 확률 밀도 함수
누적 분포 함수(cumulative distribution function)와 확률 밀도 함수(probabiligy density function)는 확률 변수의 분포 즉, 확률 분포를 수학적으로 정의하기 위한 수식이다.
확률 분포의 묘사
확률의 정의에서 확률은 사건(event)이라는 표본의 집합에 대해 할당된 숫자라고 하였다. 데이터 분석을 하려면 확률이 구체적으로 어떻게 할당되었는지를 묘사(describe)하거 전달(communicate)해야 할 필요가 있다. 어떤 사건에 어느 정도의 확률이 할당되었는지를 묘사한 것을 확률 분포(distribution)라고 한다.
확률 분포를 묘사하기 위해서는 모든 사건(event)들을 하나 하나 제시하고 거기에 할당된 숫자를 보여야 하기 때문에 확률 분포의 묘사는 결코 쉽지 않은 작업이다. 그러나 확률 변수를 이용하면 이러한 묘사 작업이 좀 더 쉬워진다. 왜냐하면 사건(event)이 구간(interval)이 되고 이 구산을 지정하는데는 시작점과 끝점이라는 두 개의 숫자만 있으면 되기 때문이다.
[[school_notebook:4bcfe70a64de40ec945639236b0e911d]]
그러나 사건(event) 즉, 구간(interval) 하나를 정의하기 위해 숫자가 하나가 아닌 두 개가 필요하다는 점은 아무래도 불편하다. 숫자 하나만으로 사건 즉, 구간을 정의할 수 있는 방법은 없을까? 이를 해결하기 위한 아이디어 중 하나는 구간의 시작을 나타내는 숫자를 모두 같은 숫자인 음수 무한대($-\infty$)로 통일하는 것이다. 여러가지 구간들 중에서 시작점이 음수 무한대인 구간만 사용하는 것이라고 볼 수 있다.
$${ -\infty \leq X < -1 } $$
$${ -\infty \leq X < 0 } $$
$${ -\infty \leq X < 1 } $$
$${ -\infty \leq X < 2 } $$
$$ \vdots $$
$$ { -\infty \leq X < x } $$
$$ \vdots $$
물론 이러한 구간들은 시그마 필드를 구성하는 전체 사건(event)들 중 일부에 지나지 않는다. 그러나 확률 공간과 시그마 필드의 정의를 이용하면 이러한 구간들로부터 시작점이 음수 무한대가 아닌 다른 구간들을 생성할 수 있다. 또한 새로 생성된 구간들에 대한 확률값도 확률의 정의에 따라 계산할 수 있다.
누적 확률 분포
위와 같은 방법으로 서술된 확률 분포를 누적 분포 함수 (cumulative distribution function) 또는 누적 확률 분포라고 하고 약자로  cdf라고 쓴다. 일반적으로 cdf는 대문자를 사용하여 $F(x)$와 같은 기호로 표시하며 이 때 독립 변수 $x$는 범위의 끝을 뜻한다. 범위의 시작은 음의 무한대(negative infinity, $-\infty$)이다.
확률 변수 $X$에 대한 누적 확률 분포 $F(x)$의 수학적 정의는 다음과 같다.
$$ F(x) = P({X < x}) = P(X < x)$$
몇가지 누적 확률 분포 표시의 예를 들면 다음과 같다.
$$ \vdots $$
* $F(-1)$ : 확률 변수가 $-\infty$이상 -1 미만인 구간 내에 존재할 확률 즉, $P( { -\infty \leq X < -1 })$
* $F(0)$ : 확률 변수가 $-\infty$이상 0 미만인 구간 내에 존재할 확률 즉, $P( { -\infty \leq X < 0 })$
* $F(1)$ : 확률 변수가 $-\infty$이상 1 미만인 구간 내에 존재할 확률 즉, $P( { -\infty \leq X < 1 })$
$$ \vdots $$
* $F(10)$ : 확률 변수가 $-\infty$이상 10 미만인 구간 내에 존재할 확률 즉, $P( { -\infty \leq X < 10 })$
$$ \vdots $$
Can you write Python code for it?

%%tikz
\filldraw [fill=white] (0,0) circle [radius=1cm];
\foreach \angle in {60,30,...,-270} {
  \draw[line width=1pt] (\angle:0.9cm) -- (\angle:1cm);
}
\draw (0,0) -- (90:0.8cm);


I am working on the file "Lecture/08. 기초 확률론 2 - 확률분포/4) 누적 분포 함수와 확률 밀도 함수.ipynb".
The first task is:
위의 확률 질량 함수는 주사위 눈금 1이 나오지 않고 6이 비정상적으로 많이 나오게 만든 비정상적인 주사위(unfair dice)를 묘사한다.
이 확률 변수에 대해 각 값을 누적하여 더하면 이산 확률 변수의 누적 분포 함수(cumulative distribution function)를 구할 수 있다.
Can you write Python code for it?


I am working on the file "Lecture/08. 기초 확률론 2 - 확률분포/4) 누적 분포 함수와 확률 밀도 함수.ipynb".
The first task is:
확률 질량 함수
이산 확률 분포는 확률 밀도 함수를 정의할 수 없는 대신 확률 질량 함수가 존재한다. 확률 질량 함수(probability mass funtion)는 이산 확률 변수의 가능한 값 하나 하나에 대해 확률을 정의한 함수이다. 예를 들어 6면체인 주사위를 던져서 나올 수 있는 값은 1부터 6까지의 이산적인 값을 가지는데 이러한 이산 확률 변수는 예를 들어 다음과 같은 확률 질량 함수를 가질 수 있다. 이 경우에는 공정하지 않은(unfair) 주사위의 확률 분포를 보이고 있다.
Can you write Python code for it?


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/1) 베르누이 확률 분포.ipynb".
The first task is:
시뮬레이션을 하려면 rvs 메서드를 사용한다.
Can you write Python code for it?

x = rv.rvs(100)
x

sns.countplot(x)
plt.show()


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/1) 베르누이 확률 분포.ipynb".
The first task is:
이론적인 확률 분포와 샘플의 확률 분포를 동시에 나타내려면 다음과 같은 코드를 사용한다.
Can you write Python code for it?

y = np.bincount(x, minlength=2)/len(x)
df = pd.DataFrame({"theoretic": rv.pmf(xx), "simulation": y}).stack()
df = df.reset_index()
df.columns = ["value", "type", "ratio"]
df

sns.barplot(x="value", y="ratio", hue="type", data=df)
plt.show()


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/11) 디리클레 분포.ipynb".
The first task is:
$\alpha$가 $(1,1,1)$이 아닌 경우에는 다음과 같이 특정 위치에 분포가 집중되도록 할 수 있다. 이 특성을 이용하면 다항 분포의 모수를 추정하는 베이지안 추정 문제에 응용할 수 있다.
Can you write Python code for it?

def project(x):
    n1 = np.array([1, 0, 0])
    n2 = np.array([0, 1, 0])
    n3 = np.array([0, 0, 1])
    n12 = (n1 + n2)/2
    m1 = np.array([1, -1, 0])
    m2 = n3 - n12
    m1 = m1/np.linalg.norm(m1)
    m2 = m2/np.linalg.norm(m2)
    return np.dstack([(x-n12).dot(m1), (x-n12).dot(m2)])[0]

def project_reverse(x):
    n1 = np.array([1, 0, 0])
    n2 = np.array([0, 1, 0])
    n3 = np.array([0, 0, 1])
    n12 = (n1 + n2)/2
    m1 = np.array([1, -1, 0])
    m2 = n3 - n12
    m1 = m1/np.linalg.norm(m1)
    m2 = m2/np.linalg.norm(m2)
    return x[:,0][:, np.newaxis] * m1 + x[:,1][:, np.newaxis] * m2 + n12

eps = np.finfo(float).eps * 10
X = project([[1-eps,0,0], [0,1-eps,0], [0,0,1-eps]])

import matplotlib.tri as mtri
triang = mtri.Triangulation(X[:,0], X[:,1], [[0, 1, 2]])
refiner = mtri.UniformTriRefiner(triang)
triang2 = refiner.refine_triangulation(subdiv=6)
XYZ = project_reverse(np.dstack([triang2.x, triang2.y, 1-triang2.x-triang2.y])[0])

pdf = sp.stats.dirichlet((1,1,1)).pdf(XYZ.T)
plt.tricontourf(triang2, pdf)
plt.axis("equal")
plt.show()

pdf = sp.stats.dirichlet((3,4,2)).pdf(XYZ.T)
plt.tricontourf(triang2, pdf)
plt.axis("equal")
plt.show()

pdf = sp.stats.dirichlet((16,24,14)).pdf(XYZ.T)
plt.tricontourf(triang2, pdf)
plt.axis("equal")
plt.show()


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/11) 디리클레 분포.ipynb".
The first task is:
그러나 $\alpha=(1,1,1)$인 디리클레 분포는 다음과 같이 골고루 샘플을 생성한다.
Can you write Python code for it?

X2 = sp.stats.dirichlet((1,1,1)).rvs(1000)
plot_triangle(X2, kind="scatter")

plot_triangle(X2, kind="hex")


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/11) 디리클레 분포.ipynb".
The first task is:
만약 이 문제를 단순하게 생각하여 서로 독립인 0과 1사이의 유니폼 확률 변수를 3개 생성하고 이들의 합이 1이 되도록 크기를 정규화(normalize)하면 다음 그림과 같이 삼각형의 중앙 근처에 많은 확률 분포가 집중된다. 즉, 확률 변수가 골고루 분포되지 않는다.
Can you write Python code for it?

X1 = np.random.rand(1000, 3)
X1 = X1/X1.sum(axis=1)[:, np.newaxis]
plot_triangle(X1, kind="scatter")

plot_triangle(X1, kind="hex")


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/12) 다변수 가우시안 정규 분포.ipynb".
The first task is:
경우 2
만약
$$
\mu = \begin{bmatrix}2 \ 3 \end{bmatrix}. \;\;\;
\Sigma = \begin{bmatrix}2 & 3 \ 3 & 7 \end{bmatrix}
$$
이면
$$
|  \Sigma | = 5,\;\;\;
\Sigma^{-1} = \begin{bmatrix}1.4 & -0.6 \ -0.6 & 0.4 \end{bmatrix}
$$
$$
(x-\mu)^T \Sigma^{-1} (x-\mu) =
\begin{bmatrix}x_1 - 2 & x_2 - 3 \end{bmatrix}
\begin{bmatrix}1.4 & -0.6 \ -0.6 & 0.4\end{bmatrix}
\begin{bmatrix}x_1 - 2 \ x_2 - 3 \end{bmatrix}
=
\dfrac{1}{10}\left(14(x_1 - 2)^2 - 12(x_1 - 2)(x_2 - 3) + 4(x_2 - 3)^2\right)
$$
$$
\mathcal{N}(x_1, x_2) = \dfrac{1}{\sqrt{20\pi}}
\exp \left( -\dfrac{1}{10}\left(7(x_1 - 2)^2 - 6(x_1 - 2)(x_2 - 3) + 2(x_2 - 3)^2\right) \right)
$$
이 확률 밀도 함수의 모양은 다음과 같다.
Can you write Python code for it?

mu = [2, 3]
cov = [[2, 3],[3, 7]]
rv = sp.stats.multivariate_normal(mu, cov)
xx = np.linspace(0, 4, 120)
yy = np.linspace(1, 5, 150)
XX, YY = np.meshgrid(xx, yy)
plt.grid(False)
plt.contourf(XX, YY, rv.pdf(np.dstack([XX, YY])))
plt.axis("equal")
plt.show()


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/2) 이항 확률 분포.ipynb".
The first task is:
pmf 메서드를 사용하면 확률 질량 함수(pmf: probability mass function)를 계산할 수 있다.
Can you write Python code for it?

xx = np.arange(N + 1)
plt.bar(xx, rv.pmf(xx), align="center")
plt.ylabel("P(x)")
plt.title("pmf of binomial distribution")
plt.show()


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/2) 이항 확률 분포.ipynb".
The first task is:
시뮬레이션을 하려면 rvs 메서드를 사용한다.
Can you write Python code for it?

np.random.seed(0)
x = rv.rvs(100)
x

sns.countplot(x)
plt.show()


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/3) 가우시안 정규 분포.ipynb".
The first task is:
pdf 메서드를 사용하면 확률 밀도 함수(pmf: probability density function)를 계산할 수 있다.
Can you write Python code for it?

xx = np.linspace(-5, 5, 100)
plt.plot(xx, rv.pdf(xx))
plt.ylabel("p(x)")
plt.title("pdf of normal distribution")
plt.show()


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/3) 가우시안 정규 분포.ipynb".
The first task is:
시뮬레이션을 통해 샘플을 얻으려면 rvs 메서드를 사용한다.
Can you write Python code for it?

np.random.seed(0)
x = rv.rvs(100)
x

sns.distplot(x, kde=False, fit=sp.stats.norm)
plt.show()


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/3) 가우시안 정규 분포.ipynb".
The first task is:
정규 분포를 따르지 않는 데이터 샘플을 Q-Q 플롯으로 그리면 다음과 같이 직선이 아닌 휘어진 형태로 나타난다.
Can you write Python code for it?

np.random.seed(0)
x = np.random.rand(100)
plt.figure(figsize=(7,7))
sp.stats.probplot(x, plot=plt)
plt.ylim(-0.5, 1.5)
plt.show()


I am working on the file "Lecture/09. 기초 확률론 3 - 확률모형/3) 가우시안 정규 분포.ipynb".
The first task is:
중심 극한 정리
실세계에서 발생하는 현상 중 많은 것들이 정규 분포로 모형화 가능하다. 그 이유 중의 하나는 다음과 같은 중심 극한 정리(Central Limit Theorem)이다. 중심 극한 정리는 어떤 분포를 따르는 확류 변수든 간에 해당 확률 변수가 복수인 경우 그 합은 정규 분포와 비슥한 분포를 이루는 현상을 말한다.
좀 더 수학적인 용어로 쓰면 다음과 같다.
$X_1, X_2, \ldots, X_n$가 기댓값이 $\mu$이고 분산이 $\sigma^2$으로 동일한 분포이며 서로 독립인 확률 변수들이라고 하자.
이 값들의 합
$$ S_n = X_1+\cdots+X_n $$
도 마찬가지로 확률 변수이다. 이 확률 변수 $S_n$의 분포는 $n$이 증가할 수록 다음과 같은 정규 분포에 수렴한다.
$$ \dfrac{S_n}{\sqrt{n}} \xrightarrow{d}\ N(\mu,\;\sigma^2) $$
시뮬레이션을 사용하여 중심 극한 정리가 성립하는지 살펴보도록 하자.
Can you write Python code for it?

xx = np.linspace(-2, 2, 100)
plt.figure(figsize=(6,9))
for i, N in enumerate([1, 2, 10]):
    X = np.random.rand(1000, N) - 0.5
    S = X.sum(axis=1)/np.sqrt(N)
    plt.subplot(3, 2, 2*i+1)
    sns.distplot(S, bins=10, kde=False, norm_hist=True)
    plt.xlim(-2, 2)
    plt.yticks([])
    plt.subplot(3, 2, 2*i+2)
    sp.stats.probplot(S, plot=plt)

plt.tight_layout()
plt.show()


I am working on the file "Lecture/10. 기초 확률론 4 - 상관관계/1) 결합, 주변, 조건부 확률 밀도 함수.ipynb".
The first task is:
위에서 예로 든 연속 확률 변수의 경우에 주변 확률 밀도 함수를 계산하면 다음과 같다.
Can you write Python code for it?

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.contour(XX, YY, 0.4*ZZ, levels=np.linspace(0, 0.04, 30), alpha=0.3)
ax.plot(yy, ZZ.mean(axis=1), zdir='x', lw=3)
ax.plot(xx, ZZ.mean(axis=0), zdir='y', lw=3)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_title("Marginal Probability Density")
ax.view_init(55, -40)
plt.show()


I am working on the file "Lecture/10. 기초 확률론 4 - 상관관계/1) 결합, 주변, 조건부 확률 밀도 함수.ipynb".
The first task is:
위에서 예로 든 이산 확률 변수의 경우에 조건부 확률 질량 함수를 계산하면 다음과 같다.
Can you write Python code for it?

pmf

cond_y0 = pmf[0, :]/pmf_marginal_y[0]
cond_y0

cond_y1 = pmf[1, :]/pmf_marginal_y[1]
cond_y1


I am working on the file "Lecture/10. 기초 확률론 4 - 상관관계/1) 결합, 주변, 조건부 확률 밀도 함수.ipynb".
The first task is:
이산 확률 변수의 결합 확률 질량 함수
다변수 이산 확률 변수에 대해서는 결합 확률 질량 함수를 구할 수 있다. 결합 확률 질량 함수는 모든 확률 변수의 값이 특정 숫자가 될 확률을 듯한다.
$$ f_{XY}(x,y) = P(X=x,Y=y) $$
결합 확률 질량 함수는 댜음과 같이 2차원 표의 형태가 된다.
Can you write Python code for it?

pmf = np.array([[0, 0, 0, 0, 1, 1],
                [0, 0, 1, 2, 1, 0],
                [0, 1, 3, 3, 1, 0],
                [0, 1, 2, 1, 0, 0],
                [1, 1, 0, 0, 0, 0]])
pmf = pmf/pmf.sum()
pmf

sns.heatmap(pmf)
plt.xlabel("x")
plt.ylabel("y")
plt.title("Joint Probability Mass Function")
plt.show()


I am working on the file "Lecture/10. 기초 확률론 4 - 상관관계/1) 결합, 주변, 조건부 확률 밀도 함수.ipynb".
The first task is:
조건부 확률 밀도 함수
조건부 확률 밀도 함수(conditional probability density function)는 다변수 확률 변수 중 하나의 값이 특정 값으로 고정되어 상수가 되어 버린 경우이다.
$$ f_{X \mid Y}(x \mid y_0) = \dfrac{f_{XY}(x, y=y_0)}{f_{Y}(y_0)} $$
$$ f_{Y \mid X}(y \mid x_0) = \dfrac{f_{XY}(x, y=y_0)}{f_{X}(x_0)} $$
주변 확률 밀도 함수와 마찬가지로 차원이 감소하지만 기댓값(적분) 연산으로 변수가 없어진 주변 확률 밀도 함수와는 다른 값이다.
위에서 예로 든 연속 확률 변수의 조건부 확률 밀도 함수를 그림으로 나타내면 다음과 같다. (이 그림은 사실 normailization이 되지 않았다.)
Can you write Python code for it?

fig, [ax1, ax2] = plt.subplots(2, 1, figsize=(8, 12), subplot_kw={'projection': '3d'})
ax1.plot_wireframe(XX, YY, ZZ, rstride=30, cstride=0, lw=3)
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax1.set_title("Conditional Probability Density $f(x \mid y)$")
ax2.plot_wireframe(XX, YY, ZZ, rstride=0, cstride=30, lw=3)
ax2.set_xlabel("x")
ax2.set_ylabel("y")
ax2.set_title("Conditional Probability Density $f(y \mid x)$")
plt.tight_layout()
plt.show()


I am working on the file "Lecture/10. 기초 확률론 4 - 상관관계/1) 결합, 주변, 조건부 확률 밀도 함수.ipynb".
The first task is:
주변 확률 밀도 함수
주변 확률 밀도 함수(marginal probability density function)는 다변수 확률 변수에서 특정한 하나의 변수에 대한 기대값을 말한다. 따라서 결합 확률 밀도 함수를 특정 변수에 대해서만 적분하여 구한다.
기댓값 계산(적분)으로 인해 차원이 한 개 줄어들기 때문에 2차원 확률 변수의 주변 확률 밀도 함수는 1차원 함수가 된다.
$$
\begin{align}%\label{}
\nonumber  f_X(x) = \text{E}{Y}[f{XY}(x,y)] = \int_{-\infty}^{\infty} f_{XY}(x,y)dy \
\nonumber  f_Y(y) = \text{E}{X}[f{XY}(x,y)] = \int_{-\infty}^{\infty} f_{XY}(x,y)dx
\end{align}
$$
이산 확률 변수의 경우에는 주변 확률 질량 함수(marginal probability mass function) 다음과 같이 정의한다
$$
\begin{align}%\label{}
\nonumber  f_X(x) = \text{E}{Y}[f{XY}(x,y)] = \sum_{y_j} f_{XY}(x,y_j) \
\nonumber  f_Y(y) = \text{E}{X}[f{XY}(x,y)] = \sum_{x_i} f_{XY}(x_i,y) \
\end{align}
$$
위에서 예로 든 이산 확률 변수의 경우에 주변 확률 질량 함수를 계산하면 다음과 같다.
Can you write Python code for it?

pmf

pmf_marginal_x = pmf.sum(axis=0)
pmf_marginal_x

pmf_marginal_y = pmf.sum(axis=1)
pmf_marginal_y[:, np.newaxis]


I am working on the file "Lecture/10. 기초 확률론 4 - 상관관계/2) 확률 밀도 함수의 독립.ipynb".
The first task is:
여러 가지 Y값을 바꾸어도 조건부 확률은 변하지 않는 것을 확인할 수 있다.
Can you write Python code for it?

cond_x_y0 = pmf1[0, :]/pmf1_marginal_y[0]
cond_x_y0

cond_x_y1 = pmf1[1, :]/pmf1_marginal_y[1]
cond_x_y1

cond_x_y2 = pmf1[2, :]/pmf1_marginal_y[2]
cond_x_y2


I am working on the file "Lecture/10. 기초 확률론 4 - 상관관계/2) 확률 밀도 함수의 독립.ipynb".
The first task is:
이 경우에는 y값에 따라 x의 조건부 확률 분포가 달라지는 것을 확인할 수 있다.
Can you write Python code for it?

pmf2_marginal_x = pmf2.sum(axis=0)
pmf2_marginal_y = pmf2.sum(axis=1)

cond_x_y0 = pmf2[0, :]/pmf2_marginal_y[0]
cond_x_y0

cond_x_y1 = pmf2[1, :]/pmf2_marginal_y[1]
cond_x_y1

cond_x_y2 = pmf2[2, :]/pmf2_marginal_y[2]
cond_x_y2


I am working on the file "Lecture/10. 기초 확률론 4 - 상관관계/2) 확률 밀도 함수의 독립.ipynb".
The first task is:
이 확률 분포는 다음 식에서 보다시피 주변 확률 분포의 곱으로 표현된다.
Can you write Python code for it?

pmf1_marginal_x = pmf1.sum(axis=0)
pmf1_marginal_y = pmf1.sum(axis=1)
pmf = pmf1_marginal_x * pmf1_marginal_y[:, np.newaxis]
pmf/pmf.sum()


I am working on the file "Lecture/10. 기초 확률론 4 - 상관관계/2) 확률 밀도 함수의 독립.ipynb".
The first task is:
이번에는 다음과 같은 결합 확률 분포를 보자. 이 경우에는 독립 조건이 성립하지 않는다.
Can you write Python code for it?


I am working on the file "Lecture/11. 추정 및 검정/2) 검정과 유의 확률.ipynb".
The first task is:
유의 확률의 값이 아주 작으면 귀무 가설이 맞다는 가정하에 계산된 검정 통계량이 나올 가능성이 희귀하다는 의미이다.
다시 예를 들자면 "어떤 병에 걸렸다"는 귀무 가설을 증명하기 위한 검정에서 혈액 검사를 사용하여 계산한 유의확률이 0.02%라는 의미는 실제로 병에 걸린 환자들 중 혈액 검사 수치가 해당 환자의 혈액 검사 수치보다 낮은 사람은 0.02% 뿐이었다는 뜻이고 "어떤 학생이 우등생이다."라는 귀무사설을 증명하기 위한 검정에서 시험 성적을 사용하여 계산한 유의확률이 0.3%라는 의미는 실제로 우등생의 성적을 분석해 보면 실수로 시험을 잘 못치른 경우를 포함해도 해당 점수보다 나쁜 경우는 0.3%에 지나지 않는다는 뜻이다.
따라서 이렇게 유의 확률의 값이 아주 작은 숫자가 나오면 해당 귀무 가설을 기각할 수 있다.
유의 수준과 기각역
계산된 유의 확률 값에 대해 귀무 가설을 기각하는지 채택하는지를 결정할 수 있는 기준 값을 유의 수준(level of significance)라고 한다. 일반적으로 사용되는 유의 수준은 1%, 5%, 10% 등이다.
검정 통계량이 나오면 확률 밀도 함수(또는 누적 확률 함수)를 사용하여 유의 확률을 계산할 수 있는 것처럼 반대로 특정한 유의 확률 값에 대해 해당하는 검정 통계량을 계산할 수도 있다. 유의 수준에 대해 계산된 검정 통계량을 기각역(critical value)라고 한다.
기각역 값을 알고 있다면 유의 확률을 유의 수준과 비교하는 것이 아니라 검정 통계량을 직접 기각역과 비교하여 기각/채택 여부를 판단할 수도 있다.
검정의 예
이제 서두에서 제기한 문제를 다시 풀어보자.

문제1

<blockquote>
어떤 동전을 5번 던졌더니 4번이 앞면이 나왔다. 이 동전은 휘어지지 않은 공정한 동전(fair coin)인가?
</blockquote>

동전의 앞면이 나오는 것을 숫자 1, 뒷면이 나오는 것을 숫자 0으로 나타낸다면 이 문제는 베르누이 확률 변수의 모수 검정 문제로 생각할 수 있다. 판단하고자하는 귀무 가설은 베르누이 확률 분포 모수 $\theta = 0.5$이다.
이 문제에 대한 검정 통계량은 15번 던져 앞면이 나온 횟수가 12이고 이 값은 자유도가 15인 이항 분포를 따른다. 이 경우의 유의 확률을 계산하면
1.76% 이다.
$$ \text{Bin}(n \geq 12;N=15) = 0.017578125 $$
Can you write Python code for it?


I am working on the file "Lecture/11. 추정 및 검정/2) 검정과 유의 확률.ipynb".
The first task is:
이 값은 5% 보다는 작고 1% 보다는 크기 때문에 유의 수준이 5% 라면 기각할 수 있으며(즉 공정한 동전이 아니라고 말할 수 있다.) 유의 수준이 1% 라면 기각할 수 없다.(즉, 공정한 동전이 아니라고 말할 수 없다.)

문제2

어떤 트레이더의 일주일 수익률은 다음과 같다.:

-2.5%, -5%, 4.3%, -3.7% -5.6%

이 트레이더는 돈을 벌어다 줄 사람인가, 아니면 돈을 잃을 사람인가?

수익률이 정규 분포를 따른 다고 가정하면 이 트레이더의 검정통계량은 다음과 같이 계산된다.
$$ t = \dfrac{m}{\frac{s}{\sqrt{N}}} = -1.4025 $$
이 검정 통계량에 대한 유의 확률은 11.67%이다.
$$ F(t=-1.4025;4) = 0.1167 $$
Can you write Python code for it?


I am working on the file "Lecture/11. 추정 및 검정/3) SciPy를 사용한 기초적인 검정.ipynb".
The first task is:
5 개의 데이터만으로도  두 평균이 다르다는 것을 유의 확률(p-value) 0.2%의 정확도로 알아내었음을 확인할 수 있다.
카이 제곱 분산 검정 (Chi-Square Test for the Variance)
지금까지는 정규 분포의 기댓값을 비교하는 검정을 살펴보았다. 이제는 정규 분포의 분산에 대해 살펴보자.
카이 제곱 분산 검정(Chi-Square Test for the Variance)은 정규 분포의 샘플 분산 값은 정규화 하면 카이 제곱 분포를 따른다는 점을 이용하는 검정 방법이다.
그러나 SciPy는 카이 제곱 분산 검정에 대한 명령이 없으므로 chi2 클래스를 사용하여 직접 구현해야 한다.
Can you write Python code for it?

def chi2var_test(x, sigma2=1):
    v = x.var(ddof=1)
    t = (len(x) - 1)*v/sigma2
    return t, sp.stats.chi2(df=len(x)-1).sf(np.abs(t))

N = 10
mu_0 = 0
sigma_0 = 1.1
np.random.seed(0)
x = sp.stats.norm(mu_0, sigma_0).rvs(N)
sns.distplot(x, kde=False, fit=sp.stats.norm)
plt.show()
x.std()

chi2var_test(x)


I am working on the file "Lecture/11. 추정 및 검정/3) SciPy를 사용한 기초적인 검정.ipynb".
The first task is:
데이터의 갯수를 50개와 100개로 증가시킨 경우에 유의 확률은 0.8%로 감소하였다. 따라서 두 확률 분포의 기댓값이 일치한다는 귀무 가설은 기각할 수 있다.
대응 표본 t-검정 (Paired-two-sample t-test)
대응 표본 t-검정은 독립 표본 t-검정을 두 집단의 샘플이 1대1 대응하는 경우에 대해 수정한 것이다. 즉, 독립 표본 t-검정과 마찬가지로 두 정규 분포의 기댓값이 같은지 확인하기 위한 검정이다.
예를 들어 어떤 반의 학생들이 특강을 수강하기 전과 수강한 이후에 각각 시험을 본 시험 점수의 경우에는 같은 학생의 두 점수는 대응할 수 있다. 이 대응 정보를 알고 있다면 보통의 독립 표본 t-검정에서 발생할 수 있는 샘플간의 차이의 영향을 없앨 수 있기 때문에 특강 수강의 영향을 보다 정확하게 추정할 수 있다.

scipy.stats.ttest_rel
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_rel.html

$\mu_1 = 0$, $\mu_2 = 0.5$로 평균이 달라진 경우에 대해 대응 표본 t-검정을 실시해 보자. 데이터 갯수 $N$은 5 이다.
Can you write Python code for it?

N = 5
mu_1 = 0
mu_2 = 0.5
np.random.seed(1)
x1 = sp.stats.norm(mu_1).rvs(N)
x2 = x1 + sp.stats.norm(mu_2, 0.1).rvs(N)
sns.distplot(x1, kde=False, fit=sp.stats.norm)
sns.distplot(x2, kde=False, fit=sp.stats.norm)
plt.show()

sp.stats.ttest_rel(x1, x2)


I am working on the file "Lecture/11. 추정 및 검정/3) SciPy를 사용한 기초적인 검정.ipynb".
The first task is:
등분산 검정 (Equal-variance test)
등분산 검정은 두 정규 분포로부터 생성된 두 개의 데이터 집합으로부터 두 정규 분포의 분산 모수가 같은지 확인하기 위한 검정이다. 가장 기본적인 방법은 F분포를 사용하는 것이지만 실무에서는 이보다 더 성능이 좋은 bartlett, fligner, levene 방법을 주로 사용한다. SciPy의 stats 서브패키지는 이를 위한  bartlett, fligner, levene 명령을 제공한다.

scipy.stats.bartlett
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.bartlett.html
scipy.stats.fligner
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.fligner.html
scipy.stats.levene
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.levene.html
Can you write Python code for it?

N1 = 100
N2 = 100
sigma_1 = 1
sigma_2 = 1.2
np.random.seed(0)
x1 = sp.stats.norm(0, sigma_1).rvs(N1)
x2 = sp.stats.norm(0, sigma_2).rvs(N2)
sns.distplot(x1, kde=False, fit=sp.stats.norm)
sns.distplot(x2, kde=False, fit=sp.stats.norm)
plt.show()
x1.std(), x2.std()

sp.stats.bartlett(x1, x2)

sp.stats.fligner(x1, x2)

sp.stats.levene(x1, x2)


I am working on the file "Lecture/11. 추정 및 검정/3) SciPy를 사용한 기초적인 검정.ipynb".
The first task is:
유의 확률(p-value)이 0.018%로 낮으므로 귀무 가설을 기각할 수 있다. 따라서 $\theta \neq 0.5$이다.
카이 제곱 검정 (Chi-square test)
카이 제곱 검정은 goodness of fit 검정이라고도 부른다. 카테고리 분포의 모수 $\theta=(\theta_1, \ldots, \theta_K)$에 대한 가설을 조사하는 검정 방법이다. SciPy stats 서브패키지의 chisquare 명령을 사용한다. 디폴트 귀무 가설은 $\theta = \left(\frac{1}{K}, \ldots, \frac{1}{K} \right)$이다.

scipy.stats.chisquare
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chisquare.html

데이터 갯수 $N=10$, 실제 모수 $\theta_0=(0.25, 0.25, 0.25, 0.25)$인 경우 대해 카이 제곱 검정 명령을 실시해 보자.
Can you write Python code for it?

N = 10
K = 4
theta_0 = np.ones(K)/K
np.random.seed(0)
x = np.random.choice(K, N, p=theta_0)
n = np.bincount(x, minlength=K)
n

sp.stats.chisquare(n)


I am working on the file "Lecture/11. 추정 및 검정/3) SciPy를 사용한 기초적인 검정.ipynb".
The first task is:
유의 확률(p-value)이 0.087%이므로 귀무 가설을 기각할 수 있다. 따라서 $\theta \neq (0.25, 0.25, 0.25, 0.25))$이다.
단일 표본 z-검정 (One-sample z-test)
단일 표본 z-검정은 분산 $\sigma^2$의 값을 정확히 알고 있는 정규 분포의 표본에 대해 기댓값을 조사하는 검정방법이다. 단일 표본 z-검정의 경우에는 SciPy에 별도의 함수가 준비되어 있지 않으므로 norm 명령의 cdf 메서드를 사용하여 직접 구현해야 한다.

scipy.stats.norm
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html

데이터 갯수 $N=10$, 실제 모수 $\mu_0=0$인 경우 대해 단일 표본 z-검정 명령을 실시해 보자.
Can you write Python code for it?

N = 10
mu_0 = 0
np.random.seed(0)
x = sp.stats.norm(mu_0).rvs(N)
x

def ztest_1samp(x, sigma2=1, mu=0):
    z = (x.mean() - mu)/ np.sqrt(sigma2/len(x))
    return z, 2 * sp.stats.norm().sf(np.abs(z))

ztest_1samp(x)


I am working on the file "Lecture/11. 추정 및 검정/3) SciPy를 사용한 기초적인 검정.ipynb".
The first task is:
유의 확률(p-value)이 34%로 높으므로 귀무 가설을 기각할 수 없다. 따라서 $\theta=0.5$이다.
데이터 갯수 $N=100$, 실제 모수 $\theta_0=0.5$인 경우 대해 이항 검정 명령을 실시해 보자.
Can you write Python code for it?

N = 100
theta_0 = 0.5
np.random.seed(0)
x = sp.stats.bernoulli(theta_0).rvs(N)
n = np.count_nonzero(x)
n

sp.stats.binom_test(n, N)


I am working on the file "Lecture/11. 추정 및 검정/3) SciPy를 사용한 기초적인 검정.ipynb".
The first task is:
유의 확률(p-value)이 4.78%이므로 만약 유의 수준이 5% 이상 이라면 귀무 가설을 기각할 수 있다. 따라서 $\mu \neq 0$이다. 이 경우는 검정 결과가 오류인 예라고 볼 수 있다. 검정 결과가 오류로 나온 이유는 데이터 수가 10개로 부족하기 때문이다.
데이터 갯수 $N=100$, 실제 모수 $\mu_0=0$인 경우 대해 단일 표본 z-검정 명령을 실시해 보자.
Can you write Python code for it?

N = 100
mu_0 = 0
np.random.seed(0)
x = sp.stats.norm(mu_0).rvs(N)
sns.distplot(x, kde=False, fit=sp.stats.norm)
plt.show()

sp.stats.ttest_1samp(x, popmean=0)


I am working on the file "Lecture/11. 추정 및 검정/3) SciPy를 사용한 기초적인 검정.ipynb".
The first task is:
유의 확률(p-value)이 55.62%이므로 귀무 가설을 기각할 수 없다. 따라서 $\mu = 0$이다.
독립 표본 t-검정 (Independent-two-sample t-test)
독립 표본 t-검정(Independent-two-sample t-test)은 간단하게 two sample t-검정이라고도 한다. 두 개의 독립적인 정규 분포에서 나온 두 개의 데이터 셋을 사용하여 두 정규 분포의 기댓값이 동일한지를 검사한다. SciPy stats 서브패키지의 ttest_ind 명령을 사용한다. 독립 표본 t-검정은 두 정규 분포의 분산값이 같은 경우와 같지 않은 경우에 사용하는 검정 통계량이 다르기 때문에  equal_var 인수를 사용하여 이를 지정해 주어야 한다.

scipy.stats.ttest_ind
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html

두 정규 분포의 기댓값이 $\mu_1 = 0$, $\mu_2 = 1$으로 다르고  분산은 $\sigma_1 = \sigma_2 = 1$ 으로 같으며 샘플의 수가 $N_1=N_2=10$인 경우를 실행해 보자
Can you write Python code for it?

N_1 = 10; mu_1 = 0; sigma_1 = 1
N_2 = 10; mu_2 = 0.5; sigma_2 = 1
np.random.seed(0)
x1 = sp.stats.norm(mu_1, sigma_1).rvs(N_1)
x2 = sp.stats.norm(mu_2, sigma_2).rvs(N_2)
sns.distplot(x1, kde=False, fit=sp.stats.norm)
sns.distplot(x2, kde=False, fit=sp.stats.norm)
plt.show()

sp.stats.ttest_ind(x1, x2, equal_var=True)


I am working on the file "Lecture/11. 추정 및 검정/3) SciPy를 사용한 기초적인 검정.ipynb".
The first task is:
유의 확률(p-value)이 68.4%이므로 귀무 가설을 기각할 수 없다. 따라서 $\mu_1 \neq \mu_2$이다. 이 경우는 검정 결과가 오류인 예라고 볼 수 있다.
오류의 유형 중에서 이러한 오류는 귀무 가설이 거짓임에도 불구하고 진실로 나온 경우로 유형 2 오류(Type 2 Error)라고 한다.
데이터 수가 증가하면 이러한 오류가 발생할 가능성이 줄어든다.
Can you write Python code for it?

N_1 = 50; mu_1 = 0; sigma_1 = 1
N_2 = 100; mu_2 = 0.5; sigma_2 = 1
np.random.seed(0)
x1 = sp.stats.norm(mu_1, sigma_1).rvs(N_1)
x2 = sp.stats.norm(mu_2, sigma_2).rvs(N_2)
sns.distplot(x1, kde=False, fit=sp.stats.norm)
sns.distplot(x2, kde=False, fit=sp.stats.norm)
plt.show()

sp.stats.ttest_ind(x1, x2, equal_var=True)


I am working on the file "Lecture/11. 추정 및 검정/3) SciPy를 사용한 기초적인 검정.ipynb".
The first task is:
유의 확률(p-value)이 92%로 높으므로 귀무 가설을 기각할 수 없다. 따라서 $\theta=0.5$이다.
데이터 갯수 $N=100$, 실제 모수 $\theta_0=0.35$인 경우 대해 이항 검정 명령을 실시해 보자.
Can you write Python code for it?

N = 100
theta_0 = 0.35
np.random.seed(0)
x = sp.stats.bernoulli(theta_0).rvs(N)
n = np.count_nonzero(x)
n

sp.stats.binom_test(n, N)


I am working on the file "Lecture/11. 추정 및 검정/6) MLE 모수 추정의 예.ipynb".
The first task is:
다변수 정규 분포의 모수 추정
MLE for Multivariate Gaussian Normal Distribution

각각의 시도 $x_i$에 대한 확률은 다변수 정규 분포

$$ P(x | \theta ) = N(x | \mu, \Sigma) = \dfrac{1}{(2\pi)^{D/2} |\Sigma|^{1/2}} \exp \left( -\dfrac{1}{2} (x-\mu)^T \Sigma^{-1} (x-\mu) \right) $$

샘플이 $N$개 있는 경우, Likelihood
$$ L = P(x_{1:N}|\theta) = \prod_{i=1}^N  \dfrac{1}{(2\pi)^{D/2} |\Sigma|^{1/2}} \exp \left( -\dfrac{1}{2} (x_i-\mu)^T \Sigma^{-1} (x_i-\mu) \right)$$

Log-Likelihood
$$
\begin{eqnarray}
\log L
&=& \log P(x_{1:N}|\theta)  \
&=& \sum_{i=1}^N \left{ -\log((2\pi)^{D/2} |\Sigma|^{1/2}) - \dfrac{1}{2} (x-\mu)^T \Sigma^{-1} (x-\mu) \right} \
&=& C -\dfrac{N}{2} \log|\Sigma| - \dfrac{1}{2} \sum (x-\mu)^T \Sigma^{-1} (x-\mu)
\end{eqnarray}
$$

precision matrix $\Lambda = \Sigma^{-1}$

$$
\begin{eqnarray}
\log L
&=& C + \dfrac{N}{2} \log|\Lambda| - \dfrac{1}{2} \sum(x-\mu)^T \Lambda (x-\mu)
\end{eqnarray}
$$
$$ \dfrac{\partial L}{\partial \mu} = -  \dfrac{\partial}{\partial \mu}  \sum_{i=1}^N (x_i-\mu)^T \Lambda (x_i-\mu) =  \sum_{i=1}^N 2\Lambda (x_i - \mu) = 0 $$
$$ \mu = \dfrac{1}{N}\sum_{i=1}^N x_i $$
$$ \dfrac{\partial L}{\partial \Lambda} = \dfrac{\partial}{\partial \Lambda} \dfrac{N}{2} \log|\Lambda| - \dfrac{\partial}{\partial \Lambda}  \dfrac{1}{2} \sum_{i=1}^N \text{tr}( (x_i-\mu)(x_i-\mu)^T\Lambda) =0  $$
$$ \dfrac{N}{2} \Lambda^{-T} = \dfrac{1}{2}\sum_{i=1}^N (x_i-\mu)(x_i-\mu)^T $$
$$ \Sigma = \dfrac{1}{N}\sum_{i=1}^N (x_i-\mu)(x_i-\mu)^T $$
Can you write Python code for it?

mu0 = np.array([0, 1])
sigma0 = np.array([[1, 0.2], [0.2, 4]])
x = sp.stats.multivariate_normal(mu0, sigma0).rvs(1000)
xbar = x.mean(axis=0)
S2 = np.cov(x, rowvar=0)
print(xbar)
print(S2)


I am working on the file "Lecture/11. 추정 및 검정/6) MLE 모수 추정의 예.ipynb".
The first task is:
정규 분포의 모수 추정

각각의 시도 $x_i$에 대한 확률은 가우시안 정규 분포

$$ P(x | \theta ) = N(x | \mu, \sigma^2) = \dfrac{1}{\sqrt{2\pi\sigma^2}} \exp \left(-\dfrac{(x-\mu)^2}{2\sigma^2}\right) $$

샘플이 $N$개 있는 경우, Likelihood
$$ L = P(x_{1:N}|\theta) = \prod_{i=1}^N  \dfrac{1}{\sqrt{2\pi\sigma^2}} \exp \left(-\dfrac{(x_i-\mu)^2}{2\sigma^2}\right)$$

Log-Likelihood
$$
\begin{eqnarray}
\log L
&=& \log P(x_{1:N}|\theta)  \
&=& \sum_{i=1}^N \left{ -\dfrac{1}{2}\log(2\pi\sigma^2) - \dfrac{(x_i-\mu)^2}{2\sigma^2} \right} \
&=& -\dfrac{N}{2} \log(2\pi\sigma^2) - \dfrac{1}{2\sigma^2}\sum_{i=1}^N (x_i-\mu)^2
\end{eqnarray}
$$

Log-Likelihood Derivative

$$
\begin{eqnarray}
\dfrac{\partial \log L}{\partial \mu}
&=& \dfrac{\partial}{\partial \mu} \left{ \dfrac{N}{2} \log(2\pi\sigma^2) + \dfrac{1}{2\sigma^2}\sum_{i=1}^N (x_i-\mu)^2  \right} = 0 \
\dfrac{\partial \log L}{\partial \sigma^2}
&=& \dfrac{\partial}{\partial \sigma^2} \left{ \dfrac{N}{2} \log(2\pi\sigma^2) + \dfrac{1}{2\sigma^2}\sum_{i=1}^N (x_i-\mu)^2 \right} = 0\
\end{eqnarray}
$$
$$
\dfrac{2}{2\sigma^2}\sum_{i=1}^N (x_i-\mu) = 0
$$
$$
N \mu = \sum_{i=1}^N x_i
$$
$$
\mu = \dfrac{1}{N}\sum_{i=1}^N x_i = \bar{x}
$$
$$
\dfrac{N}{2\sigma^2 } -  \dfrac{1}{2(\sigma^2)^2}\sum_{i=1}^N (x_i-\mu)^2  = 0
$$
$$
\sigma^2  =  \dfrac{1}{N}\sum_{i=1}^N (x_i-\mu)^2 = \dfrac{1}{N}\sum_{i=1}^N (x_i-\bar{x})^2 = s^2
$$
Can you write Python code for it?

mu0 = 1
sigma0 = 2
x = sp.stats.norm(mu0, sigma0).rvs(1000)
xbar = x.mean()
s2 = x.std(ddof=1)
xbar, s2


I am working on the file "Lecture/11. 추정 및 검정/6) MLE 모수 추정의 예.ipynb".
The first task is:
카테고리 분포의 모수 추정

각각의 시도 $x_i$에 대한 확률은 카테고리 분포

$$ P(x | \theta ) = \text{Cat}(x | \theta) = \prod_{k=1}^K \theta_k^{x_k} $$
$$ \sum_{k=1}^K \theta_k = 1 $$

샘플이 $N$개 있는 경우, Likelihood
$$ L = P(x_{1:N}|\theta) = \prod_{i=1}^N \prod_{k=1}^K \theta_k^{x_{i,k}} $$

Log-Likelihood
$$
\begin{eqnarray}
\log L
&=& \log P(x_{1:N}|\theta)  \
&=& \sum_{i=1}^N \sum_{k=1}^K  {x_{i,k}} \log\theta_k \
&=& \sum_{k=1}^K \log\theta_k \sum_{i=1}^N {x_{i,k}}
\end{eqnarray}
$$

$x_k$가 나온 횟수 $N_k = \sum_{i=1}^N {x_{i,k}}$이라고 표시

따라서  Log-Likelihood는
$$
\begin{eqnarray}
\log L
&=& \sum_{k=1}^K \log\theta_k  N_k
\end{eqnarray}
$$

추가 조건
$$ \sum_{k=1}^K \theta_k = 1 $$

Log-Likelihood Derivative with Lagrange multiplier

$$
\begin{eqnarray}
\dfrac{\partial \log L}{\partial \theta_k}
&=& \dfrac{\partial}{\partial \theta_k} \left{ \sum_{k=1}^K \log\theta_k N_k  + \lambda \left(1- \sum_{k=1}^K \theta_k\right)  \right} = 0 \
\dfrac{\partial \log L}{\partial \lambda}
&=& \dfrac{\partial}{\partial \lambda} \left{ \sum_{k=1}^K \log\theta_k N_k  + \lambda \left(1- \sum_{k=1}^K \theta_k \right)  \right} = 0\
\end{eqnarray}
$$
$$
\dfrac{N_1}{\theta_1}  = \dfrac{N_2}{\theta_2} = \cdots = \dfrac{N_K}{\theta_K} = \lambda
$$
$$
\sum_{k=1}^K N_k = N
$$
$$
\lambda \sum_{k=1}^K \theta_k  = \lambda = N
$$
$$
\theta_k = \dfrac{N_k}{N}
$$
Can you write Python code for it?

theta0 = np.array([0.1, 0.3, 0.6])
x = np.random.choice(np.arange(3), 1000, p=theta0)
N0, N1, N2 = np.bincount(x, minlength=3)
N = N0 + N1 + N2
theta = np.array([N0, N1, N2]) / N
theta


I am working on the file "Lecture/11. 추정 및 검정/7) 베이지안 모수 추정의 예.ipynb".
The first task is:
정규 분포의 기댓값 모수 추정
이번에는 정규 분포의 기댓값 모수를 베이지안 방법으로 추정한다. 분산 모수 $\sigma^2$은 알고 있다고 가정한다.
기댓값은 $-\infty$부터 $\infty$까지의 모든 수가 가능하기 때문에 모수의 사전 분포로는 정규 분포를 사용한다.
$$ P(\mu) = N(\mu_0, \sigma^2_0) = \dfrac{1}{\sqrt{2\pi\sigma_0^2}} \exp \left(-\dfrac{(\mu-\mu_0)^2}{2\sigma_0^2}\right)$$
데이터는 모두 독립적인 정규 분포의 곱이므로 우도는 다음과 같이 된다.
$$ P(x_{1},\ldots,x_{N} \mid \mu) = \prod_{i=1}^N N(x_i \mid \mu )  = \prod_{i=1}^N  \dfrac{1}{\sqrt{2\pi\sigma^2}} \exp \left(-\dfrac{(x_i-\mu)^2}{2\sigma^2}\right)  $$
$$
\begin{eqnarray}
P(\theta \mid x_{1},\ldots,x_{N})
&\propto & P(x_{1},\ldots,x_{N} \mid \theta) P(\theta) \
&\propto & \exp \left(-\dfrac{(\mu-\mu'_0)^2}{2\sigma_0^{'2}}\right) \
\end{eqnarray}
$$
베이지안 규칙을 사용하여 사후 분포를 구하면 다음과 같이 갱신된 하이퍼 모수  를 가지는 정규 분포가 된다.
$$
\begin{eqnarray}
\mu'_0 &=& \dfrac{\sigma^2}{N\sigma_0^2 + \sigma^2}\mu_0 + \dfrac{N\sigma_0^2}{N\sigma_0^2 + \sigma^2} \dfrac{\sum x_i}{N} \
\dfrac{1}{\sigma_0^{'2}} &=& \dfrac{1}{\sigma_0^{2}} + \dfrac{N}{\sigma^{'2}}
\end{eqnarray}
$$
Can you write Python code for it?

mu, sigma2 = 2, 4

mu0, sigma20 = 0, 1
xx = np.linspace(1, 3, 1000)

np.random.seed(0)

N = 10
x = sp.stats.norm(mu).rvs(N)
mu0 = sigma2/(N*sigma20 + sigma2) * mu0 + (N*sigma20)/(N*sigma20 + sigma2)*x.mean()
sigma20 = 1/(1/sigma20 + N/sigma2)
plt.plot(xx, sp.stats.norm(mu0, sigma20).pdf(xx), label="1st");
print(mu0)

N = 20
x = sp.stats.norm(mu).rvs(N)
mu0 = sigma2/(N*sigma20 + sigma2) * mu0 + (N*sigma20)/(N*sigma20 + sigma2)*x.mean()
sigma20 = 1/(1/sigma20 + N/sigma2)
plt.plot(xx, sp.stats.norm(mu0, sigma20).pdf(xx), label="2nd");
print(mu0)

N = 50
x = sp.stats.norm(mu).rvs(N)
mu0 = sigma2/(N*sigma20 + sigma2) * mu0 + (N*sigma20)/(N*sigma20 + sigma2)*x.mean()
sigma20 = 1/(1/sigma20 + N/sigma2)
plt.plot(xx, sp.stats.norm(mu0, sigma20).pdf(xx), label="3rd");
print(mu0)

N = 100
x = sp.stats.norm(mu).rvs(N)
mu0 = sigma2/(N*sigma20 + sigma2) * mu0 + (N*sigma20)/(N*sigma20 + sigma2)*x.mean()
sigma20 = 1/(1/sigma20 + N/sigma2)
plt.plot(xx, sp.stats.norm(mu0, sigma20).pdf(xx), label="4th");
print(mu0)

plt.axis([1, 3, 0, 20])
plt.legend()
plt.show()


I am working on the file "Lecture/11. 추정 및 검정/7) 베이지안 모수 추정의 예.ipynb".
The first task is:
카테고리 분포의 모수 추정
다음으로 클래스 갯수가 $K$인 카테고리 분포의 모수 $\theta$ 벡터를 베이지안 추정법으로 추정해 본다.
카테고리 분포의 모수의 각 원소는 모두 0부터 1사이의 값을 가지므로 사전 분포는 하이퍼 모수 $\alpha_i=\dfrac{1}{K}$인 디리클리 분포로 한다.
$$ P(\theta) \propto \prod_{k=1}^K \theta_i^{\alpha_i - 1} \;\;\; (\alpha_i = 1/K , \; \text{ for all } i) $$
데이터는 모두 독립적인 카테고리 분포의 곱이므로 우도는 다음과 같이 다항 분포가 된다.
$$ p(x_{1},\ldots,x_{N} \mid \theta) = \prod_{i=1}^N  \prod_{k=1}^K \theta_k^{x_{i,k}} $$
베이지안 규칙을 사용하여 사후 분포를 구하면 다음과 같이 갱신된 하이퍼 모수 $\alpha'_i$를 가지는 디리클리 분포가 된다.
$$
\begin{eqnarray}
p(\theta \mid x_{1},\ldots,x_{N})
&\propto & p(x_{1},\ldots,x_{N} \mid \theta)  P(\theta) \
&=& \prod_{i=1}^N  \prod_{k=1}^K \theta_k^{x_{i,k}} \cdot \prod_{k=1}^K \theta_i^{\alpha_i - 1}  \
&=& \prod_{k=1}^K  \theta^{\sum_{i=1}^N x_i + \alpha_i − 1}   \
&=& \prod_{k=1}^K  \theta^{N_i + \alpha_i −1}   \
&=& \prod_{k=1}^K  \theta^{\alpha'_i −1}   \
\end{eqnarray}
$$
이 경우에도 conjugated prior 임을 알 수 있다.
갱신된 하이퍼 모수의 값은 다음과 같다.
$$ \alpha'_i = N_i + \alpha_i $$
Can you write Python code for it?

def plot_dirichlet(alpha):

    def project(x):
        n1 = np.array([1, 0, 0])
        n2 = np.array([0, 1, 0])
        n3 = np.array([0, 0, 1])
        n12 = (n1 + n2)/2
        m1 = np.array([1, -1, 0])
        m2 = n3 - n12
        m1 = m1/np.linalg.norm(m1)
        m2 = m2/np.linalg.norm(m2)
        return np.dstack([(x-n12).dot(m1), (x-n12).dot(m2)])[0]

    def project_reverse(x):
        n1 = np.array([1, 0, 0])
        n2 = np.array([0, 1, 0])
        n3 = np.array([0, 0, 1])
        n12 = (n1 + n2)/2
        m1 = np.array([1, -1, 0])
        m2 = n3 - n12
        m1 = m1/np.linalg.norm(m1)
        m2 = m2/np.linalg.norm(m2)
        return x[:,0][:, np.newaxis] * m1 + x[:,1][:, np.newaxis] * m2 + n12

    eps = np.finfo(float).eps * 10
    X = project([[1-eps,0,0], [0,1-eps,0], [0,0,1-eps]])

    import matplotlib.tri as mtri

    triang = mtri.Triangulation(X[:,0], X[:,1], [[0, 1, 2]])
    refiner = mtri.UniformTriRefiner(triang)
    triang2 = refiner.refine_triangulation(subdiv=6)
    XYZ = project_reverse(np.dstack([triang2.x, triang2.y, 1-triang2.x-triang2.y])[0])

    pdf = sp.stats.dirichlet(alpha).pdf(XYZ.T)
    plt.tricontourf(triang2, pdf)
    plt.axis("equal")
    plt.show()

theta0 = np.array([0.2, 0.6, 0.2])

np.random.seed(0)
x1 = np.random.choice(3, 20, p=theta0)
N1 = np.bincount(x1, minlength=3)
x2 = np.random.choice(3, 100, p=theta0)
N2 = np.bincount(x2, minlength=3)
x3 = np.random.choice(3, 1000, p=theta0)
N3 = np.bincount(x3, minlength=3)

a0 = np.ones(3) / 3
plot_dirichlet(a0)

a1 = a0 + N1
plot_dirichlet(a1)
print((a1 - 1)/(a1.sum() - 3))

a2 = a1 + N2
plot_dirichlet(a2)
print((a2 - 1)/(a2.sum() - 3))

a3 = a2 + N3
plot_dirichlet(a3)
print((a3 - 1)/(a3.sum() - 3))


I am working on the file "Lecture/12. Scikit-Learn & statsmodels 패키지 소개/3) Scikit-Learn 패키지의 샘플 데이터 - 회귀 분석용.ipynb".
The first task is:
Scikit-Learn 패키지의 샘플 데이터 - 회귀 분석용
보스턴 집값
load_boston()

Target
Boston, Owner's House Price, 1978
506 Towns' Median Prices (unit: USD 1,000)
Feature
CRIM: 범죄율
INDUS: 비소매상업지역 면적 비율
NOX: 일산화질소 농도
RM: 주택당 방 수
LSTAT: 인구 중 하위 계층 비율
B: 인구 중 흑인 비율
PTRATIO: 학생/교사 비율
ZN: 25,000 평방피트를 초과 거주지역 비율
CHAS: 찰스강의 경계에 위치한 경우는 1, 아니면 0
AGE: 1940년 이전에 건축된 소유주택의 비율
RAD: 방사형 고속도로까지의 거리
DIS: 직업센터의 거리
TAX: 재산세율
Can you write Python code for it?

from sklearn.datasets import load_boston
boston = load_boston()
print(boston.DESCR)

dfX = pd.DataFrame(boston.data, columns=boston.feature_names)
dfy = pd.DataFrame(boston.target, columns=["MEDV"])
df = pd.concat([dfX, dfy], axis=1)
df.tail()

df.describe()

cols = ["LSTAT", "NOX", "RM", "MEDV"]
sns.pairplot(df[cols])
plt.show()


I am working on the file "Lecture/12. Scikit-Learn & statsmodels 패키지 소개/3) Scikit-Learn 패키지의 샘플 데이터 - 회귀 분석용.ipynb".
The first task is:
당뇨병
load_diabetes()

http://www4.stat.ncsu.edu/~boos/var.select/diabetes.html
consists of 10 physiological variables measure on 442 patients
age
sex
body mass index (bmi)
average blood pressure (bp)
six blood serum measurements
tc, ldl, hdl, tch, ltg, glu

indication of disease progression after one year
Can you write Python code for it?

from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
df = pd.concat([pd.DataFrame(diabetes.data, columns=["x%d" % (i + 1) for i in range(diabetes.data.shape[1])]),
                pd.DataFrame(diabetes.target, columns=["target"])],
               axis=1)
df.tail()

df.describe()

sns.pairplot(df.ix[:,:4])
plt.show()