#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>)