#author("2019-11-20T04:35:55+00:00","","")
#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

# ¥Ç¡¼¥¿Æɤ߹þ¤ß
data = np.loadtxt("sample.csv", delimiter=",", skiprows=1)
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]))

x = data[:, :3]
y = data[:, 3]
#y = np.transpose([data[:, 3]])
m = len(y)
    # x0¤òÄɲÃ
    X_norm = np.column_stack([np.ones([m,1]), X_norm])

# Àµµ¬²½(Z-score normalization)
def norm(X):
    X_norm = np.zeros((X.shape[0], X.shape[1]))
    X_mean = np.zeros((1, X.shape[1]))
    X_std = np.zeros((1, X.shape[1]))
    for i in range(X.shape[1]):
        X_mean[:, i] = np.mean(X[:, i])
        X_std[:, i] = np.std(X[:, i])
        X_norm[:, i] = (X[:, i] - float(X_mean[:, i])) / float(X_std[:, i])
    return X_norm, X_mean, X_std
    return X_norm

weight_int = np.zeros((4, 1))

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

# ¥³¥¹¥È´Ø¿ô(¥Ù¥¯¥È¥ë²½ÈÇ)
def cost2(x, y, weight):
def gradient_descent(x, y, w, alpha, iter_num):
    """ºÇµÞ¹ß²¼Ë¡."""
    m = len(y)
    y_shaped = np.transpose([y])
    xw = x.dot(weight)
    result = np.dot((xw - y_shaped).T, (xw - y_shaped)) / (2*m)
    #J = (1.0 / (2 * m)) * result
    return result
    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

def gradient_descent(x, y, weight, alpha, iter_num):
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)
    j_hist = np.zeros((iter_num, 1))
    for i in range(iter_num):
        weight = weight - alpha * (1.0/m) * np.transpose(x).dot(x.dot(weight) - np.transpose([y]))
        j_hist[i] = cost(x, y, weight)
    return weight, j_hist

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

if __name__ == "__main__":
    # ½é´üÃÍ
    w_int = np.zeros((3, 1))

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

    # ·±Îý¥Ç¡¼¥¿¤òÀµµ¬²½¤·¤Æ¡¢x0¤ÎÎó¤òÄɲ乤ë
    x_padded = np.column_stack([np.ones([m,1]), X_norm])
    # 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()

    # Àµµ¬²½¤·¤¿¥Ç¡¼¥¿¤ò»ÈÍѤ·¤ÆºÇµÞ¹ß²¼Ë¡¤Ç W ¤òµá¤á¤ë
    weight, j_hist = gradient_descent(x_padded, y, weight_int, alpha, iter_num)
    # ³Ø½¬Ëè¤Î¥³¥¹¥È¤ò¥°¥é¥Õɽ¼¨
    plt.plot(range(costs.size), costs[:, 0], "r")
    plt.xlabel("iterations")
    plt.ylabel("cost")
    plt.grid(True)
    plt.show()

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

    # ³Ø½¬Ëè¤Î¥³¥¹¥È¤Î²Ä»ë²½
    plt.plot(range(j_hist.size), j_hist[:, 0], "r")
    plt.xlabel("number of iterations")
    plt.ylabel("cost J")
    plt.grid(True)
    plt.show()
    # ºîÀ®¤·¤¿¥â¥Ç¥ë¤ò»ÈÍѤ·¤ÆÊ̤Υǡ¼¥¿¤òͽ¬¤·¤Æ¤ß¤ë
    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