#author("2019-11-20T07:32:38+00:00","","")
#mynavi(µ¡³£³Ø½¬¤Î°Ù¤Î¿ô³Ø¤Î´ðÁÃ)
#setlinebreak(on);

* Ìܼ¡ [#d8db4f2c]
#contents
- ´ØÏ¢
-- [[µ¡³£³Ø½¬¤Î°Ù¤Î¿ô³Ø¤Î´ðÁÃ]]
-- [[Python³Ð¤¨½ñ¤­]]
-- [[IPython¤Î»È¤¤Êý¥á¥â]]
-- [[numpyÆþÌç]]
-- [[pandasÆþÌç]]
-- [[matplotlib¤Ç¥°¥é¥ÕºîÀ®]]

* ³µÍ× [#g644cbdc]
#html(<div style="padding-left: 10px;">)
#TODO
#html(</div>)


* ¼ÂÁõ [#b1b871c1]
#html(<div style="padding-left: 10px;">)

¥Ç¡¼¥¿: &ref(sample_rent1.csv);

sample_rent1.py
#mycode2(python){{
"""
½Å²óµ¢Ê¬ÀÏ.
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def normalize(X, data=None):
    """Àµµ¬²½(Z-score normalization)."""
    data = X if data is None else data
    m = data.shape[0]
    X_norm = np.zeros((data.shape[0], data.shape[1]))
    for i in range(data.shape[1]):
        X_norm[:, i] = (data[:, i] - float(np.mean(X[:, i]))) / float(np.std(X[:, i]))

    # x0¤òÄɲÃ
    X_norm = np.column_stack([np.ones([m,1]), X_norm])

    return X_norm

def cost(x, y, w):
    """¥³¥¹¥È´Ø¿ô."""
    diff = np.power((x.dot(w) - y), 2)
    J = diff.sum(axis=0) / (2 * len(y))
    return J

def gradient_descent(x, y, w, alpha, iter_num):
    """ºÇµÞ¹ß²¼Ë¡."""
    m = len(y)
    costs = np.zeros((iter_num, 1))
    for i in range(iter_num):
        w = w - alpha * (1.0/m) * np.transpose(x).dot(x.dot(w) - y)
        costs[i] = cost(x, y, w)
    return w, costs

if __name__ == "__main__":

    # ¥Ç¡¼¥¿Æɤ߹þ¤ß
    data = np.loadtxt("data/sample_rent1.csv", delimiter=",", skiprows=1)
    x = data[:, 1:3]  # N¹Ô3Îó¤Î¹ÔÎó
    y = data[:, 3:4]  # N¹Ô1Îó¤Î¹ÔÎó

    # ¥Ç¡¼¥¿¥µ¥¤¥º
    m = len(y)

    #  Àµµ¬²½¤·¡¢x0¤òÄɲÃ
    X_norm = normalize(x)

    # ½é´üÃÍ
    w_int = np.zeros((3, 1))

    # ³Ø½¬Î¨¡¢³Ø½¬²ó¿ô
    alpha = 0.01
    iter_num = 1000
    
    # ºÇµÞ¹ß²¼Ë¡¤Ë¤è¤ë½Å²óµ¢Ê¬ÀÏ
    w, costs = gradient_descent(X_norm, y, w_int, alpha, iter_num)

    # 3D¥°¥é¥Õ¤òɽ¼¨
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.scatter(data[:,1], data[:,2], data[:,3], color="#ef1234")
    ax.set_xlabel("Size")
    ax.set_ylabel("Age")
    ax.set_zlabel("Rent")
    plt.show()

    # ³Ø½¬Ëè¤Î¥³¥¹¥È¤ò¥°¥é¥Õɽ¼¨
    plt.plot(range(costs.size), costs[:, 0], "r")
    plt.xlabel("iterations")
    plt.ylabel("cost")
    plt.grid(True)
    plt.show()

    #print("weight:")
    #print(w)

    # ºîÀ®¤·¤¿¥â¥Ç¥ë¤ò»ÈÍѤ·¤ÆÊ̤Υǡ¼¥¿¤òͽ¬¤·¤Æ¤ß¤ë
    z = np.array([[60, 10]])
    result = normalize(x, z).dot(w)
    print("¹­¤µ: {}­Ö, ÃÛǯ¿ô: {}ǯ ¢â {:0.1f}Ëü±ß".format(z[0,0], z[0,1], result[0,0]))
}}

#html(</div>)

¥È¥Ã¥×   °ìÍ÷ ñ¸ì¸¡º÷ ºÇ½ª¹¹¿·   ¥Ø¥ë¥×   ºÇ½ª¹¹¿·¤ÎRSS