- Äɲ䵤줿¹Ô¤Ï¤³¤Î¿§¤Ç¤¹¡£
- ºï½ü¤µ¤ì¤¿¹Ô¤Ï¤³¤Î¿§¤Ç¤¹¡£
#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>)