From 26aed799c55ab83e9177383060ee36c164e0d205 Mon Sep 17 00:00:00 2001
From: loverwenxin <45945056+loverwenxin@users.noreply.github.com>
Date: Sun, 12 May 2019 20:52:39 +0800
Subject: [PATCH 01/26] Add files via upload
---
...5_\344\272\216\351\207\221\346\263\275.md" | 15 ++++++
...5_\344\272\216\351\207\221\346\263\275.py" | 48 +++++++++++++++++++
2 files changed, 63 insertions(+)
create mode 100644 "PM2.5_\344\272\216\351\207\221\346\263\275.md"
create mode 100644 "PM2.5_\344\272\216\351\207\221\346\263\275.py"
diff --git "a/PM2.5_\344\272\216\351\207\221\346\263\275.md" "b/PM2.5_\344\272\216\351\207\221\346\263\275.md"
new file mode 100644
index 0000000..d25479b
--- /dev/null
+++ "b/PM2.5_\344\272\216\351\207\221\346\263\275.md"
@@ -0,0 +1,15 @@
+# 实现思路
+- 读取文件,获取PM2.5的数据
+- 9个小时为一组进行整合,存储在列表中
+- 对x添加一列1起偏置作用
+- 循环更新w参数
+- 读取测试文件,计算预测值和真实值的偏差,计算平均误差
+
+# 学习内容
+- 实现了辛普森一家的分类,并且实现了处理视频
+- 学习了LSTM和RNN的实现原理
+
+# 学习预期
+- 实现至少5个kaggle项目,使用pytorch实现
+- 制作一个简易的chatbot
+- 制作一个爬取公众号的scrapy项目,尽量实现界面化
diff --git "a/PM2.5_\344\272\216\351\207\221\346\263\275.py" "b/PM2.5_\344\272\216\351\207\221\346\263\275.py"
new file mode 100644
index 0000000..a17a186
--- /dev/null
+++ "b/PM2.5_\344\272\216\351\207\221\346\263\275.py"
@@ -0,0 +1,48 @@
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+
+data = pd.read_csv('train.csv', encoding='gbk')
+
+pm2_5 = data[data['class']=='PM2.5'].ix[:, 3:]
+
+tempxlist = []
+tempylist = []
+for i in range(15):
+ tempx = pm2_5.iloc[:, i:i+9]
+ tempx.columns = np.array(range(9))
+ tempy = pm2_5.iloc[:, i+9]
+ tempy.columns = ['1']
+ tempxlist.append(tempx)
+ tempylist.append(tempy)
+xdata = pd.concat(tempxlist)
+x = np.array(xdata, float)
+ydata = pd.concat(tempylist)
+y = np.array(ydata, float)
+
+x = np.concatenate((np.ones((x.shape[0], 1)), x), axis=1)
+
+w = np.zeros((len(x[0])))
+lr = 10
+iteration = 10000
+s_grad = np.zeros(len(x[0]))
+for i in range(iteration):
+ tem = np.dot(x, w)
+ loss = y - tem
+ grad = np.dot(x.transpose(), loss)*(-2)
+ s_grad += grad**2
+ ada = np.sqrt(s_grad)
+ w = w - lr*grad/ada
+
+testdata = pd.read_csv('test.csv', encoding='gbk')
+pm2_5_test = testdata[testdata['class']=='PM2.5'].ix[:, 2:]
+x_test = np.array(pm2_5_test, float)
+x_test_b = np.concatenate((np.ones((x_test.shape[0], 1)), x_test), axis=1)
+y_star = np.dot(x_test_b, w)
+y_pre = pd.read_csv('sampleSubmission.csv', encoding='gbk')
+y_pre.value = y_star
+
+real = pd.read_csv('ans.csv', encoding='gbk')
+erro = abs(y_pre.value - real.value).sum()/len(real.value)
+print(erro)
+
From 25efe74d17a34294ce2208fda9d0783e345b80fd Mon Sep 17 00:00:00 2001
From: Yue Wu <39611267+Wulele1998@users.noreply.github.com>
Date: Sun, 12 May 2019 21:32:29 +0800
Subject: [PATCH 02/26] Add files via upload
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
参考CSDN博客的代码和算法,通过修改和DeBug,实现了对PM2.5数据集分析
---
pm.py | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 126 insertions(+)
create mode 100644 pm.py
diff --git a/pm.py b/pm.py
new file mode 100644
index 0000000..5cd8aaf
--- /dev/null
+++ b/pm.py
@@ -0,0 +1,126 @@
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+from random import randint
+
+import os
+os.environ["CUDA_VISIBLE_DEVICES"] = "0"
+
+'''读取数据'''
+data = pd.read_csv('train.csv') # DataFrame类型
+# 对数据表格进行加工
+del data['datetime']
+del data['item']
+del data['location']
+data.drop([0])
+data = data.replace("NR", 0)
+
+'''整理训练集合'''
+ItemNum = 18
+X_Train = [] # 训练样本features集合
+Y_Train = [] # 训练样本目标PM2.5集合
+for i in range(int(len(data)/ItemNum)):
+ day = data[i*ItemNum:(i+1)*ItemNum] # 一天的观测数据
+ for j in range(15):
+ x = day.iloc[:, j:j + 9]
+ y = int(day.iloc[9, j+9])
+ X_Train.append(x)
+ Y_Train.append(y)
+
+'''绘制散点图'''
+x_AMB_TEMP = []
+x_CH4 = []
+x_CO = []
+x_NMHC = []
+y = []
+for i in range(len(Y_Train)):
+ y.append(Y_Train[i])
+ x = X_Train[i]
+ #求各测项的平均值
+ x_AMB_TEMP_sum = 0
+ x_CH4_sum = 0
+ x_CO_sum = 0
+ x_NMHC_sum = 0
+
+ for j in range(9):
+ x_AMB_TEMP_sum = x_AMB_TEMP_sum + float(x.iloc[0, j])
+ x_CH4_sum = x_CH4_sum + float(x.iloc[1, j])
+ x_CO_sum = x_CO_sum + float(x.iloc[2, j])
+ x_NMHC_sum = x_NMHC_sum + float(x.iloc[3, j])
+ x_AMB_TEMP.append(x_AMB_TEMP_sum / 9)
+ x_CH4.append(x_CH4_sum / 9)
+ x_CO.append(x_CO_sum / 9)
+ x_NMHC.append(x_NMHC_sum / 9)
+plt.figure(figsize=(10, 6))
+plt.subplot(2, 2, 1)
+plt.title('AMB_TEMP')
+plt.scatter(x_AMB_TEMP, y)
+plt.subplot(2, 2, 2)
+plt.title('CH4')
+plt.scatter(x_CH4, y)
+plt.subplot(2, 2, 3)
+plt.title('CO')
+plt.scatter(x_CO, y)
+plt.subplot(2, 2, 4)
+plt.title('NMHC')
+plt.scatter(x_NMHC, y)
+plt.show()
+
+'''小批量梯度下降'''
+dict={0:8,1:8,2:8,3:8,4:8,5:8,6:8,7:8,8:8,9:9,10:9,11:9,12:9,13:9,14:9,15:9,16:9,17:9,18:12,19:12,20:12,21:12,22:12,23:12,24:12,25:12,26:12}
+iteration_count = 10000 #迭代次数
+learning_rate = 0.000001 #学习速率
+b=0.0001 #初始化偏移项
+parameters=[0.001]*27 #初始化27个参数
+loss_history=[]
+for i in range(iteration_count):
+ loss=0
+ b_grad=0
+ w_grad=[0]*27
+ examples=list(randint(0, len(X_Train)-1) for index in range(100))
+ for j in range(100):
+ index=examples.pop()
+ day = X_Train[index]
+ partsum = b + parameters[0] * float(day.iloc[8,0]) + parameters[1] * float(day.iloc[8,1]) + parameters[2] * float(day.iloc[8,2])+ parameters[3] * float(day.iloc[8,3]) + parameters[4] * float(day.iloc[8,4]) + parameters[5] * float(day.iloc[8,5]) + parameters[6] * float(day.iloc[8,6]) + parameters[7] * float(day.iloc[8,7]) + parameters[8] * float(day.iloc[8,8]) + parameters[9] * float(day.iloc[9,0]) + parameters[10] * float(day.iloc[9,1]) + parameters[11] * float(day.iloc[9,2]) + parameters[12] * float(day.iloc[9,3]) + parameters[13] * float(day.iloc[9,4]) + parameters[14] * float(day.iloc[9,5]) + parameters[15] * float(day.iloc[9,6]) + parameters[16] * float(day.iloc[9,7]) + parameters[17] * float(day.iloc[9,8]) + parameters[18] * float(day.iloc[12,0]) + parameters[19] * float(day.iloc[12,1]) + parameters[20] * float(day.iloc[12,2]) + parameters[21] * float(day.iloc[12,3]) + parameters[22] * float(day.iloc[12,4]) + parameters[23] * float(day.iloc[12,5]) + parameters[24] * float(day.iloc[12,6]) + parameters[25] * float(day.iloc[12,7]) + parameters[26] * float(day.iloc[12,8]) - Y_Train[index]
+ loss=loss + partsum * partsum
+ b_grad = b_grad + partsum
+ for k in range(27):
+ w_grad[k]=w_grad[k]+ partsum * float(day.iloc[dict[k],k % 9])
+ loss_history.append(loss/2)
+ #更新参数
+ b = b - learning_rate * b_grad
+ for t in range(27):
+ parameters[t] = parameters[t] - learning_rate * w_grad[t]
+ if i % 100 == 0:
+ print(i)
+
+
+'''评价模型'''
+data1 = pd.read_csv('test.csv')
+# 对数据进行加工
+del data1['id']
+del data1['item']
+data1.drop([0])
+data.replace("NR", 0)
+X_Test=[]
+ItemNum=18
+for i in range(int(len(data1)/ItemNum)):
+ day = data1[i*ItemNum:(i+1)*ItemNum] #一天的观测数据
+ X_Test.append(day)
+Y_Test=[]
+data2 = pd.read_csv('ans.csv')
+for i in range(len(data2)):
+ Y_Test.append(data2.iloc[i,1])
+b=0.00371301266193
+parameters=[-0.0024696993501677625, 0.0042664323568029619, -0.0086174899917209787, -0.017547874680980298, -0.01836289806786489, -0.0046459546176775678, -0.031425910733080147, 0.018037490234208024, 0.17448898242705385, 0.037982590870111861, 0.025666115101346722, 0.02295437149703404, 0.014272058968395849, 0.011573452230087483, 0.010984971346586308, -0.0061003639742210781, 0.19310213021199321, 0.45973205224805752, -0.0034995637680653086, 0.00094072189075279807, 0.00069329550591916357, 0.002966257320079194, 0.0050690506276038138, 0.007559004246038563, 0.013296350700555241, 0.027251049329127801, 0.039423988570899793]
+Y_predict=[]
+for i in range(len(X_Test)):
+ day=X_Test[i]
+ p = b + parameters[0] * float(day.iloc[8,0]) + parameters[1] * float(day.iloc[8,1]) + parameters[2] * float(day.iloc[8,2])+ parameters[3] * float(day.iloc[8,3]) + parameters[4] * float(day.iloc[8,4]) + parameters[5] * float(day.iloc[8,5]) + parameters[6] * float(day.iloc[8,6]) + parameters[7] * float(day.iloc[8,7]) + parameters[8] * float(day.iloc[8,8]) + parameters[9] * float(day.iloc[9,0]) + parameters[10] * float(day.iloc[9,1]) + parameters[11] * float(day.iloc[9,2]) + parameters[12] * float(day.iloc[9,3]) + parameters[13] * float(day.iloc[9,4]) + parameters[14] * float(day.iloc[9,5]) + parameters[15] * float(day.iloc[9,6]) + parameters[16] * float(day.iloc[9,7]) + parameters[17] * float(day.iloc[9,8]) + parameters[18] * float(day.iloc[12,0]) + parameters[19] * float(day.iloc[12,1]) + parameters[20] * float(day.iloc[12,2]) + parameters[21] * float(day.iloc[12,3]) + parameters[22] * float(day.iloc[12,4]) + parameters[23] * float(day.iloc[12,5]) + parameters[24] * float(day.iloc[12,6]) + parameters[25] * float(day.iloc[12,7]) + parameters[26] * float(day.iloc[12,8])
+ Y_predict.append(p)
+def dev_degree(y_true,y_predict): #评价函数
+ sum=0
+ for i in range(len(y_predict)):
+ sum=sum+(y_true[i]-y_predict[i])*(y_true[i]-y_predict[i])
+ return sum/len(y_predict)
+print(dev_degree(Y_Test,Y_predict))
From 11e708a5f97fbd0255ed107615fd450b11a1eae6 Mon Sep 17 00:00:00 2001
From: Yue Wu <39611267+Wulele1998@users.noreply.github.com>
Date: Sun, 12 May 2019 21:37:23 +0800
Subject: [PATCH 03/26] =?UTF-8?q?Rename=20pm.py=20to=20pm=5F=E5=90=B4?=
=?UTF-8?q?=E8=B6=8A.py?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pm.py => "pm_\345\220\264\350\266\212.py" | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename pm.py => "pm_\345\220\264\350\266\212.py" (100%)
diff --git a/pm.py "b/pm_\345\220\264\350\266\212.py"
similarity index 100%
rename from pm.py
rename to "pm_\345\220\264\350\266\212.py"
From a3387b5813adb717ef68ce91d5c774dfb7bbaaa1 Mon Sep 17 00:00:00 2001
From: Yue Wu <39611267+Wulele1998@users.noreply.github.com>
Date: Sun, 12 May 2019 21:38:47 +0800
Subject: [PATCH 04/26] =?UTF-8?q?Rename=20pm=5F=E5=90=B4=E8=B6=8A.py=20to?=
=?UTF-8?q?=20PM2.5=5F=E5=90=B4=E8=B6=8A.py?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...220\264\350\266\212.py" => "PM2.5_\345\220\264\350\266\212.py" | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename "pm_\345\220\264\350\266\212.py" => "PM2.5_\345\220\264\350\266\212.py" (100%)
diff --git "a/pm_\345\220\264\350\266\212.py" "b/PM2.5_\345\220\264\350\266\212.py"
similarity index 100%
rename from "pm_\345\220\264\350\266\212.py"
rename to "PM2.5_\345\220\264\350\266\212.py"
From b84f3e15b51ff3f2612277fee955fae431c92c67 Mon Sep 17 00:00:00 2001
From: loverwenxin <45945056+loverwenxin@users.noreply.github.com>
Date: Sun, 12 May 2019 21:52:37 +0800
Subject: [PATCH 05/26] Add files via upload
From 27db2e666669d2292e9fc38ddb4876cf14abe772 Mon Sep 17 00:00:00 2001
From: loverwenxin <45945056+loverwenxin@users.noreply.github.com>
Date: Sun, 12 May 2019 21:53:16 +0800
Subject: [PATCH 06/26] Add files via upload
---
Sampsons.py | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 178 insertions(+)
create mode 100644 Sampsons.py
diff --git a/Sampsons.py b/Sampsons.py
new file mode 100644
index 0000000..777650e
--- /dev/null
+++ b/Sampsons.py
@@ -0,0 +1,178 @@
+
+import keras
+import cv2
+import numpy as np
+import matplotlib.pyplot as plt
+import sklearn
+from collections import Counter
+import pickle
+from keras.preprocessing.image import ImageDataGenerator
+from keras.models import Sequential
+from keras.layers import Dense, Dropout, Activation, Flatten
+from keras.layers import Conv2D, MaxPooling2D
+from mpl_toolkits.axes_grid1 import AxesGrid
+from sklearn.metrics import confusion_matrix
+from keras.optimizers import SGD, Adam
+from random import shuffle
+import os
+''''''
+map_characters = {0 : 'abraham_grampa_simpson',
+ 1 : 'agnes_skinner',
+ 2 : 'apu_nahasapeemapetilon',
+ 3 : 'barney_gumble',
+ 4 : 'bart_simpson',
+ 5 : 'carl_carlson',
+ 6 : 'charles_montgomery_burns',
+ 7 : 'chief_wiggum',
+ 8 : 'cletus_spuckler',
+ 9 : 'comic_book_guy',
+ 10 : 'disco_stu',
+ 11 : 'edna_krabappel',
+ 12 : 'fat_tony',
+ 13 : 'gil',
+ 14 : 'groundskeeper_willie',
+ 15 : 'homer_simpson',
+ 16 : 'kent_brockman',
+ 17 : 'krusty_the_clown',
+ 18 : 'lenny_leonard',
+ 19 : 'lionel_hutz',
+ 20 : 'lisa_simpson',
+ 21 : 'maggie_simpson',
+ 22 : 'marge_simpson',
+ 23 : 'martin_prince',
+ 24 : 'mayor_quimby',
+ 25 : 'milhouse_van_houten',
+ 26 : 'miss_hoover',
+ 27 : 'moe_szyslak',
+ 28 : 'ned_flanders',
+ 29 : 'nelson_muntz',
+ 30 : 'otto_mann',
+ 31 : 'patty_bouvier',
+ 32 : 'principal_skinner',
+ 33 : 'professor_john_frink',
+ 34 : 'rainier_wolfcastle',
+ 35 : 'ralph_wiggum',
+ 36 : 'selma_bouvier',
+ 37 : 'sideshow_bob',
+ 38 : 'sideshow_mel',
+ 39 : 'snake_jailbird',
+ 40 : 'troy_mcclure',
+ 41 : 'waylon_smithers'}
+check_characters = {v:k for k,v in map_characters.items()}
+
+pic_size = 64
+batch_size = 32
+epochs = 200
+num_classes = len(map_characters)
+
+def create_model_six_conv(input_shape):
+ model = Sequential()
+ model.add(Conv2D(32, (3,3), padding='same', input_shape=input_shape))
+ model.add(Activation('relu'))
+ model.add(Conv2D(32, (3,3)))
+ model.add(Activation('relu'))
+ model.add(MaxPooling2D(pool_size=(2,2)))
+ model.add(Dropout(0.2))
+
+ model.add(Conv2D(64, (3,3), padding='same'))
+ model.add(Activation('relu'))
+ model.add(Conv2D(64, (3,3)))
+ model.add(Activation('relu'))
+ model.add(MaxPooling2D(pool_size=(2,2)))
+ model.add(Dropout(0.2))
+
+ model.add(Conv2D(256, (3,3), padding='same'))
+ model.add(Activation('relu'))
+ model.add(Conv2D(256, (3,3)))
+ model.add(Activation('relu'))
+ model.add(MaxPooling2D(pool_size=(2,2)))
+ model.add(Dropout(0.2))
+
+ model.add(Flatten())
+ model.add(Dense(1024))
+ model.add(Activation('relu'))
+ model.add(Dropout(0.5))
+ model.add(Dense(18, activation='softmax'))
+ opt = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
+
+ return model, opt
+
+def load_model_from_checkpoint(weights_path, input_shape=(pic_size,pic_size,3)):
+ model, opt = create_model_six_conv(input_shape)
+ model.load_weights(weights_path)
+ model.compile(loss='categorical_crossentropy',
+ optimizer=opt,
+ metrics=['accuracy'])
+ return model
+
+def load_test_set(path):
+ pics, labels = [], []
+ reverse_dict = {v:k for k,v in map_characters.items()}
+ paths = os.listdir(path)
+ for pic in paths:
+ pic = path + pic
+ char_name = "_".join(pic.split('/')[3].split('_')[:-1])
+ if char_name in reverse_dict.keys():
+ temp = cv2.imread(pic)
+ temp = cv2.resize(temp, (pic_size, pic_size)).astype('float32')/255
+ pics.append(temp)
+ labels.append(reverse_dict[char_name])
+ X_test = np.array(pics)
+ y_test = np.array(labels)
+ y_test = keras.utils.to_categorical(y_test, num_classes)
+ print('Test set', X_test.shape, y_test.shape)
+ return X_test, y_test
+
+model = load_model_from_checkpoint(r'E:\the-simpsons-characters-dataset\weights.best.hdf5')
+X_test, y_test = load_test_set('E:/the-simpsons-characters-dataset/kaggle_simpson_testset/')
+#print('\n', sklearn.metrics.classification_report(np.where(y_test >= 0)[1], np.argmax(y_pred, axis=1), target_names=list(map_characters.values())), sep='')
+'''
+
+F = plt.figure(1, (15,20))
+grid = AxesGrid(F, 111, nrows_ncols=(4,4), axes_pad=0, label_mode='1')
+path = 'E:/the-simpsons-characters-dataset/kaggle_simpson_testset/'
+
+for i in range(16):
+ char = map_characters[i]
+ list = [path+k for k in os.listdir(path) if char in k]
+ image = cv2.imread(np.random.choice(list))
+
+
+ img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
+ pic = cv2.resize(image, (64,64)).astype('float32')/255
+ a = model.predict(pic.reshape(1, 64, 64, 3))[0]
+ actual = char.split('_')[0].title()
+ text = sorted(['{:s} : {:.1f}%'.format(map_characters[i].split('_')[0].title(), 100*v) for k,v in enumerate(a)],
+ key=lambda x:float(x.split(':')[1].split('%')[0]), reverse=True)[:3]
+ img = cv2.resize(img, (352, 352))
+ cv2.rectangle(img, (0,260), (215,352), (255,255,255), -1)
+ font = cv2.FONT_HERSHEY_SIMPLEX
+ cv2.putText(img, 'Actual : %s' % actual, (10,280), font, 0.7, (0,0,0), 2, cv2.LINE_AA)
+ for k,t in enumerate(text):
+ cv2.putText(img, t, (10, 300+k*18), font, 0.65, (0,0,0), 2, cv2.LINE_AA)
+ grid[i].imshow(img)
+plt.show()
+'''
+path = r'D:\app\pycharm\codes\deeplearning\HongyiLi\yyy.mp4'
+video_capture = cv2.VideoCapture(path)
+fps = video_capture.get(cv2.CAP_PROP_FPS)
+size = (int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
+ int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
+video_write = cv2.VideoWriter('test.avi', cv2.VideoWriter_fourcc('m','p','4','v'), fps, size)
+success, frame = video_capture.read()
+while success:
+ img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+ pic = cv2.resize(frame, (64,64)).astype('float32')/255
+ a = model.predict(pic.reshape(1, 64, 64, 3))[0]
+ text = sorted(['{:s} : {:.1f}%'.format(map_characters[k].split('_')[0].title(), 100*v) for k,v in enumerate(a)],
+ key=lambda x:float(x.split(':')[1].split('%')[0]), reverse=True)[:3]
+ img = cv2.resize(img, (size[0], size[1]))
+ #cv2.rectangle(img, (0,260), (215,352), (255,255,255), -1)
+ font = cv2.FONT_HERSHEY_SIMPLEX
+ for k,t in enumerate(text):
+ cv2.putText(img, t, (10, 680+k*18), font, 0.65, (0,0,0), 2, cv2.LINE_AA)
+ img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
+ video_write.write(img)
+ success, frame = video_capture.read()
+video_write.release()
+video_capture.release()
From 257d1a8f8ad1aa40eee126a560e08ea73217bcb3 Mon Sep 17 00:00:00 2001
From: loverwenxin <45945056+loverwenxin@users.noreply.github.com>
Date: Sun, 12 May 2019 21:53:45 +0800
Subject: [PATCH 07/26] Delete Sampsons.py
---
Sampsons.py | 178 ----------------------------------------------------
1 file changed, 178 deletions(-)
delete mode 100644 Sampsons.py
diff --git a/Sampsons.py b/Sampsons.py
deleted file mode 100644
index 777650e..0000000
--- a/Sampsons.py
+++ /dev/null
@@ -1,178 +0,0 @@
-
-import keras
-import cv2
-import numpy as np
-import matplotlib.pyplot as plt
-import sklearn
-from collections import Counter
-import pickle
-from keras.preprocessing.image import ImageDataGenerator
-from keras.models import Sequential
-from keras.layers import Dense, Dropout, Activation, Flatten
-from keras.layers import Conv2D, MaxPooling2D
-from mpl_toolkits.axes_grid1 import AxesGrid
-from sklearn.metrics import confusion_matrix
-from keras.optimizers import SGD, Adam
-from random import shuffle
-import os
-''''''
-map_characters = {0 : 'abraham_grampa_simpson',
- 1 : 'agnes_skinner',
- 2 : 'apu_nahasapeemapetilon',
- 3 : 'barney_gumble',
- 4 : 'bart_simpson',
- 5 : 'carl_carlson',
- 6 : 'charles_montgomery_burns',
- 7 : 'chief_wiggum',
- 8 : 'cletus_spuckler',
- 9 : 'comic_book_guy',
- 10 : 'disco_stu',
- 11 : 'edna_krabappel',
- 12 : 'fat_tony',
- 13 : 'gil',
- 14 : 'groundskeeper_willie',
- 15 : 'homer_simpson',
- 16 : 'kent_brockman',
- 17 : 'krusty_the_clown',
- 18 : 'lenny_leonard',
- 19 : 'lionel_hutz',
- 20 : 'lisa_simpson',
- 21 : 'maggie_simpson',
- 22 : 'marge_simpson',
- 23 : 'martin_prince',
- 24 : 'mayor_quimby',
- 25 : 'milhouse_van_houten',
- 26 : 'miss_hoover',
- 27 : 'moe_szyslak',
- 28 : 'ned_flanders',
- 29 : 'nelson_muntz',
- 30 : 'otto_mann',
- 31 : 'patty_bouvier',
- 32 : 'principal_skinner',
- 33 : 'professor_john_frink',
- 34 : 'rainier_wolfcastle',
- 35 : 'ralph_wiggum',
- 36 : 'selma_bouvier',
- 37 : 'sideshow_bob',
- 38 : 'sideshow_mel',
- 39 : 'snake_jailbird',
- 40 : 'troy_mcclure',
- 41 : 'waylon_smithers'}
-check_characters = {v:k for k,v in map_characters.items()}
-
-pic_size = 64
-batch_size = 32
-epochs = 200
-num_classes = len(map_characters)
-
-def create_model_six_conv(input_shape):
- model = Sequential()
- model.add(Conv2D(32, (3,3), padding='same', input_shape=input_shape))
- model.add(Activation('relu'))
- model.add(Conv2D(32, (3,3)))
- model.add(Activation('relu'))
- model.add(MaxPooling2D(pool_size=(2,2)))
- model.add(Dropout(0.2))
-
- model.add(Conv2D(64, (3,3), padding='same'))
- model.add(Activation('relu'))
- model.add(Conv2D(64, (3,3)))
- model.add(Activation('relu'))
- model.add(MaxPooling2D(pool_size=(2,2)))
- model.add(Dropout(0.2))
-
- model.add(Conv2D(256, (3,3), padding='same'))
- model.add(Activation('relu'))
- model.add(Conv2D(256, (3,3)))
- model.add(Activation('relu'))
- model.add(MaxPooling2D(pool_size=(2,2)))
- model.add(Dropout(0.2))
-
- model.add(Flatten())
- model.add(Dense(1024))
- model.add(Activation('relu'))
- model.add(Dropout(0.5))
- model.add(Dense(18, activation='softmax'))
- opt = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
-
- return model, opt
-
-def load_model_from_checkpoint(weights_path, input_shape=(pic_size,pic_size,3)):
- model, opt = create_model_six_conv(input_shape)
- model.load_weights(weights_path)
- model.compile(loss='categorical_crossentropy',
- optimizer=opt,
- metrics=['accuracy'])
- return model
-
-def load_test_set(path):
- pics, labels = [], []
- reverse_dict = {v:k for k,v in map_characters.items()}
- paths = os.listdir(path)
- for pic in paths:
- pic = path + pic
- char_name = "_".join(pic.split('/')[3].split('_')[:-1])
- if char_name in reverse_dict.keys():
- temp = cv2.imread(pic)
- temp = cv2.resize(temp, (pic_size, pic_size)).astype('float32')/255
- pics.append(temp)
- labels.append(reverse_dict[char_name])
- X_test = np.array(pics)
- y_test = np.array(labels)
- y_test = keras.utils.to_categorical(y_test, num_classes)
- print('Test set', X_test.shape, y_test.shape)
- return X_test, y_test
-
-model = load_model_from_checkpoint(r'E:\the-simpsons-characters-dataset\weights.best.hdf5')
-X_test, y_test = load_test_set('E:/the-simpsons-characters-dataset/kaggle_simpson_testset/')
-#print('\n', sklearn.metrics.classification_report(np.where(y_test >= 0)[1], np.argmax(y_pred, axis=1), target_names=list(map_characters.values())), sep='')
-'''
-
-F = plt.figure(1, (15,20))
-grid = AxesGrid(F, 111, nrows_ncols=(4,4), axes_pad=0, label_mode='1')
-path = 'E:/the-simpsons-characters-dataset/kaggle_simpson_testset/'
-
-for i in range(16):
- char = map_characters[i]
- list = [path+k for k in os.listdir(path) if char in k]
- image = cv2.imread(np.random.choice(list))
-
-
- img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
- pic = cv2.resize(image, (64,64)).astype('float32')/255
- a = model.predict(pic.reshape(1, 64, 64, 3))[0]
- actual = char.split('_')[0].title()
- text = sorted(['{:s} : {:.1f}%'.format(map_characters[i].split('_')[0].title(), 100*v) for k,v in enumerate(a)],
- key=lambda x:float(x.split(':')[1].split('%')[0]), reverse=True)[:3]
- img = cv2.resize(img, (352, 352))
- cv2.rectangle(img, (0,260), (215,352), (255,255,255), -1)
- font = cv2.FONT_HERSHEY_SIMPLEX
- cv2.putText(img, 'Actual : %s' % actual, (10,280), font, 0.7, (0,0,0), 2, cv2.LINE_AA)
- for k,t in enumerate(text):
- cv2.putText(img, t, (10, 300+k*18), font, 0.65, (0,0,0), 2, cv2.LINE_AA)
- grid[i].imshow(img)
-plt.show()
-'''
-path = r'D:\app\pycharm\codes\deeplearning\HongyiLi\yyy.mp4'
-video_capture = cv2.VideoCapture(path)
-fps = video_capture.get(cv2.CAP_PROP_FPS)
-size = (int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
- int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
-video_write = cv2.VideoWriter('test.avi', cv2.VideoWriter_fourcc('m','p','4','v'), fps, size)
-success, frame = video_capture.read()
-while success:
- img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
- pic = cv2.resize(frame, (64,64)).astype('float32')/255
- a = model.predict(pic.reshape(1, 64, 64, 3))[0]
- text = sorted(['{:s} : {:.1f}%'.format(map_characters[k].split('_')[0].title(), 100*v) for k,v in enumerate(a)],
- key=lambda x:float(x.split(':')[1].split('%')[0]), reverse=True)[:3]
- img = cv2.resize(img, (size[0], size[1]))
- #cv2.rectangle(img, (0,260), (215,352), (255,255,255), -1)
- font = cv2.FONT_HERSHEY_SIMPLEX
- for k,t in enumerate(text):
- cv2.putText(img, t, (10, 680+k*18), font, 0.65, (0,0,0), 2, cv2.LINE_AA)
- img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
- video_write.write(img)
- success, frame = video_capture.read()
-video_write.release()
-video_capture.release()
From 741708df7b76ba34d1eb14fe18993be74e7227f3 Mon Sep 17 00:00:00 2001
From: cixisy <50036302+cixisy@users.noreply.github.com>
Date: Sun, 12 May 2019 22:34:16 +0800
Subject: [PATCH 08/26] =?UTF-8?q?PM2.5=20=E9=99=88=E5=B0=8F=E6=9D=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
。
---
... \351\231\210\345\260\217\346\235\276 .md" | 235 ++++++++++++++++++
...5 \351\231\210\345\260\217\346\235\276.py" | 235 ++++++++++++++++++
2 files changed, 470 insertions(+)
create mode 100644 "PM2.5 \351\231\210\345\260\217\346\235\276 .md"
create mode 100644 "PM2.5 \351\231\210\345\260\217\346\235\276.py"
diff --git "a/PM2.5 \351\231\210\345\260\217\346\235\276 .md" "b/PM2.5 \351\231\210\345\260\217\346\235\276 .md"
new file mode 100644
index 0000000..c3f28a1
--- /dev/null
+++ "b/PM2.5 \351\231\210\345\260\217\346\235\276 .md"
@@ -0,0 +1,235 @@
+
+
+
+
+
+
+ PM2.5 陈小松 .md (editing)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/PM2.5 \351\231\210\345\260\217\346\235\276.py" "b/PM2.5 \351\231\210\345\260\217\346\235\276.py"
new file mode 100644
index 0000000..20593b1
--- /dev/null
+++ "b/PM2.5 \351\231\210\345\260\217\346\235\276.py"
@@ -0,0 +1,235 @@
+
+
+
+
+
+
+ PM2.5 陈小松.py (editing)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From 5b06546684fff7260d1fd6a887142dfe1da271d2 Mon Sep 17 00:00:00 2001
From: cixisy <50036302+cixisy@users.noreply.github.com>
Date: Sun, 12 May 2019 22:43:51 +0800
Subject: [PATCH 09/26] =?UTF-8?q?Delete=20PM2.5=20=E9=99=88=E5=B0=8F?=
=?UTF-8?q?=E6=9D=BE=20.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
... \351\231\210\345\260\217\346\235\276 .md" | 235 ------------------
1 file changed, 235 deletions(-)
delete mode 100644 "PM2.5 \351\231\210\345\260\217\346\235\276 .md"
diff --git "a/PM2.5 \351\231\210\345\260\217\346\235\276 .md" "b/PM2.5 \351\231\210\345\260\217\346\235\276 .md"
deleted file mode 100644
index c3f28a1..0000000
--- "a/PM2.5 \351\231\210\345\260\217\346\235\276 .md"
+++ /dev/null
@@ -1,235 +0,0 @@
-
-
-
-
-
-
- PM2.5 陈小松 .md (editing)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
From 37e2670e2b8ea354d1201dc294f3f88432e9fab8 Mon Sep 17 00:00:00 2001
From: cixisy <50036302+cixisy@users.noreply.github.com>
Date: Sun, 12 May 2019 22:44:20 +0800
Subject: [PATCH 10/26] =?UTF-8?q?Delete=20PM2.5=20=E9=99=88=E5=B0=8F?=
=?UTF-8?q?=E6=9D=BE.py?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...5 \351\231\210\345\260\217\346\235\276.py" | 235 ------------------
1 file changed, 235 deletions(-)
delete mode 100644 "PM2.5 \351\231\210\345\260\217\346\235\276.py"
diff --git "a/PM2.5 \351\231\210\345\260\217\346\235\276.py" "b/PM2.5 \351\231\210\345\260\217\346\235\276.py"
deleted file mode 100644
index 20593b1..0000000
--- "a/PM2.5 \351\231\210\345\260\217\346\235\276.py"
+++ /dev/null
@@ -1,235 +0,0 @@
-
-
-
-
-
-
- PM2.5 陈小松.py (editing)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
From b73ae4013dba37361af42cc4f01f8a960a826e86 Mon Sep 17 00:00:00 2001
From: Yue Wu <39611267+Wulele1998@users.noreply.github.com>
Date: Sun, 12 May 2019 22:52:21 +0800
Subject: [PATCH 11/26] =?UTF-8?q?Update=20PM2.5=5F=E5=90=B4=E8=B6=8A.py?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
"PM2.5_\345\220\264\350\266\212.py" | 45 +++++++++++++++++++++++++----
1 file changed, 40 insertions(+), 5 deletions(-)
diff --git "a/PM2.5_\345\220\264\350\266\212.py" "b/PM2.5_\345\220\264\350\266\212.py"
index 5cd8aaf..2cc0560 100644
--- "a/PM2.5_\345\220\264\350\266\212.py"
+++ "b/PM2.5_\345\220\264\350\266\212.py"
@@ -32,6 +32,11 @@
x_CH4 = []
x_CO = []
x_NMHC = []
+x_SO2 = []
+x_NO2 = []
+x_NOX = []
+x_PM10 = []
+x_PM2 = []
y = []
for i in range(len(Y_Train)):
y.append(Y_Train[i])
@@ -41,34 +46,64 @@
x_CH4_sum = 0
x_CO_sum = 0
x_NMHC_sum = 0
+ x_SO2_sum = 0
+ x_NO2_sum = 0
+ x_NOX_sum = 0
+ x_PM10_sum = 0
+ x_PM2_sum = 0
for j in range(9):
x_AMB_TEMP_sum = x_AMB_TEMP_sum + float(x.iloc[0, j])
x_CH4_sum = x_CH4_sum + float(x.iloc[1, j])
x_CO_sum = x_CO_sum + float(x.iloc[2, j])
x_NMHC_sum = x_NMHC_sum + float(x.iloc[3, j])
+ x_SO2_sum = x_SO2_sum + float(x.iloc[12, j])
+ x_NO2_sum = x_NO2_sum + float(x.iloc[5, j])
+ x_NOX_sum = x_NOX_sum + float(x.iloc[6, j])
+ x_PM10_sum = x_PM10_sum + float(x.iloc[8, j])
+ x_PM2_sum = x_PM2_sum + float(x.iloc[9, j])
x_AMB_TEMP.append(x_AMB_TEMP_sum / 9)
x_CH4.append(x_CH4_sum / 9)
x_CO.append(x_CO_sum / 9)
x_NMHC.append(x_NMHC_sum / 9)
+ x_NO2.append(x_NO2_sum / 9)
+ x_NOX.append(x_NOX_sum / 9)
+ x_SO2.append(x_SO2_sum / 9)
+ x_PM10.append(x_PM10_sum / 9)
+ x_PM2.append(x_PM2_sum / 9)
plt.figure(figsize=(10, 6))
-plt.subplot(2, 2, 1)
+plt.subplot(2, 5, 1)
plt.title('AMB_TEMP')
plt.scatter(x_AMB_TEMP, y)
-plt.subplot(2, 2, 2)
+plt.subplot(2, 5, 2)
plt.title('CH4')
plt.scatter(x_CH4, y)
-plt.subplot(2, 2, 3)
+plt.subplot(2, 5, 3)
plt.title('CO')
plt.scatter(x_CO, y)
-plt.subplot(2, 2, 4)
+plt.subplot(2, 5, 4)
plt.title('NMHC')
plt.scatter(x_NMHC, y)
+plt.subplot(2, 5, 5)
+plt.title('SO2')
+plt.scatter(x_SO2, y)
+plt.subplot(2, 5, 6)
+plt.title('NO2')
+plt.scatter(x_NO2, y)
+plt.subplot(2, 5, 7)
+plt.title('NOX')
+plt.scatter(x_NOX, y)
+plt.subplot(2, 5, 8)
+plt.title('PM 10')
+plt.scatter(x_PM10, y)
+plt.subplot(2, 5, 9)
+plt.title('PM 2.5')
+plt.scatter(x_PM2, y)
plt.show()
'''小批量梯度下降'''
dict={0:8,1:8,2:8,3:8,4:8,5:8,6:8,7:8,8:8,9:9,10:9,11:9,12:9,13:9,14:9,15:9,16:9,17:9,18:12,19:12,20:12,21:12,22:12,23:12,24:12,25:12,26:12}
-iteration_count = 10000 #迭代次数
+iteration_count = 200 #迭代次数
learning_rate = 0.000001 #学习速率
b=0.0001 #初始化偏移项
parameters=[0.001]*27 #初始化27个参数
From 3e3af6860e91dd7ea83dab1758c548584fffb542 Mon Sep 17 00:00:00 2001
From: cixisy <50036302+cixisy@users.noreply.github.com>
Date: Sun, 12 May 2019 22:57:45 +0800
Subject: [PATCH 12/26] Add files via upload
---
...51\231\210\345\260\217\346\235\276 .md.docx" | Bin 0 -> 12192 bytes
...351\231\210\345\260\217\346\235\276.py.docx" | Bin 0 -> 13027 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 "PM2.5 \351\231\210\345\260\217\346\235\276 .md.docx"
create mode 100644 "PM2.5 \351\231\210\345\260\217\346\235\276.py.docx"
diff --git "a/PM2.5 \351\231\210\345\260\217\346\235\276 .md.docx" "b/PM2.5 \351\231\210\345\260\217\346\235\276 .md.docx"
new file mode 100644
index 0000000000000000000000000000000000000000..c107d10ebcdfec2946e304fefd989f756c756fa8
GIT binary patch
literal 12192
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
r^dHfMU*W$xcz+V8Ci{bX|91BjWWe9V
Date: Sun, 12 May 2019 22:59:08 +0800
Subject: [PATCH 13/26] =?UTF-8?q?Delete=20PM2.5=20=E9=99=88=E5=B0=8F?=
=?UTF-8?q?=E6=9D=BE=20.md.docx?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...51\231\210\345\260\217\346\235\276 .md.docx" | Bin 12192 -> 0 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 "PM2.5 \351\231\210\345\260\217\346\235\276 .md.docx"
diff --git "a/PM2.5 \351\231\210\345\260\217\346\235\276 .md.docx" "b/PM2.5 \351\231\210\345\260\217\346\235\276 .md.docx"
deleted file mode 100644
index c107d10ebcdfec2946e304fefd989f756c756fa8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 12192
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
l|Mh_PhX5zC-?jIj
Date: Sun, 12 May 2019 22:59:30 +0800
Subject: [PATCH 14/26] =?UTF-8?q?PM2.5test=20=E5=A7=9A=E4=BA=9A=E5=A8=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
PM2.5test.md | 13 ++++
pm2.5test.py | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 192 insertions(+)
create mode 100644 PM2.5test.md
create mode 100644 pm2.5test.py
diff --git a/PM2.5test.md b/PM2.5test.md
new file mode 100644
index 0000000..56cb34f
--- /dev/null
+++ b/PM2.5test.md
@@ -0,0 +1,13 @@
+###用训练集和测试集进行训练并测试,最终生成结果如图所示。
+一共分为四个步骤:
+设计模型,定义Loss函数,评价模型。
+### 项目简介
+建立一个模型,根据前9个小时的观测数据预测此时间点的PM2.5值。训练数据集为train.csv,测试数据集为test.csv。
+本次采用的是Linear Regression模型,此模型的关键在于选择features,为此我绘制了训练数据集的各个测项和PM2.5的散点图,通过对散点图的分析,初步选择我认为必要的feature来建立模型。
+###定义LOSS函数
+由于本文采用小批量梯度下降算法,所以本文的LOSS函数定义如下
+###评价模型
+ 评价模型必须有一个评价标准和测试样本。评价标准定义为若预测值与真实值平均偏差程度低,则模型可认为比较好。其中预测值与真实值平均偏差程度为预测值和真实值之差的平方和的平均值。
+
+
+
diff --git a/pm2.5test.py b/pm2.5test.py
new file mode 100644
index 0000000..73ce984
--- /dev/null
+++ b/pm2.5test.py
@@ -0,0 +1,179 @@
+import pandas as pd
+import matplotlib.pyplot as plt
+from random import randint
+from numba import jit
+
+# @jit
+def test():
+ '''读取数据'''
+ data = pd.read_csv('train.csv') #DataFrame类型
+ # print(data)
+ # # del data[:3]
+ del data['datetime']
+ del data['stations']
+ del data['observations']
+ data.drop([0])
+ # print(data)
+ data = data.replace('NR', 0)
+ # print(data)
+ # print(data)
+
+
+ '''整理训练集合'''
+ ItemNum=18
+ X_Train=[] #训练样本features集合
+ Y_Train=[] #训练样本目标PM2.5集合
+ for i in range(int(len(data)/ItemNum)):
+ day = data[i*ItemNum:(i+1)*ItemNum] #一天的观测数据
+ for j in range(15):
+ x = day.iloc[:, j:j + 9]
+ y = int(day.iloc[9,j+9])
+ X_Train.append(x)
+ Y_Train.append(y)
+
+
+ '''绘制散点图'''
+ x_AMB_TEMP=[]
+ x_CH4=[]
+ x_CO=[]
+ x_NMHC=[]
+ y=[]
+ for i in range(len(Y_Train)):
+ y.append(Y_Train[i])
+ x=X_Train[i]
+ #求各测项的平均值
+ x_AMB_TEMP_sum=0
+ x_CH4_sum=0
+ x_CO_sum=0
+ x_NMHC_sum=0
+ for j in range(9):
+ # print(x.iloc[0,j])
+ x_AMB_TEMP_sum=x_AMB_TEMP_sum+float(x.iloc[0,j])
+ # print(x.iloc[1, j])
+ x_CH4_sum = x_CH4_sum + float(x.iloc[1, j])
+ x_CO_sum = x_CO_sum + float(x.iloc[2, j])
+ x_NMHC_sum = x_NMHC_sum + float(x.iloc[3, j])
+ x_AMB_TEMP.append(x_AMB_TEMP_sum / 9)
+ x_CH4.append(x_CH4_sum / 9)
+ x_CO.append(x_CO_sum / 9)
+ x_NMHC.append(x_NMHC_sum / 9)
+ plt.figure(figsize=(10, 6))
+ plt.subplot(2, 2, 1)
+ plt.title('AMB_TEMP')
+ plt.scatter(x_AMB_TEMP, y)
+ plt.subplot(2, 2, 2)
+ plt.title('CH4')
+ plt.scatter(x_CH4, y)
+ plt.subplot(2, 2, 3)
+ plt.title('CO')
+ plt.scatter(x_CO, y)
+ plt.subplot(2, 2, 4)
+ plt.title('NMHC')
+ plt.scatter(x_NMHC, y)
+ plt.show()
+
+ '''小批量梯度下降'''
+ dict={0:8,1:8,2:8,3:8,4:8,5:8,6:8,7:8,8:8,9:9,10:9,11:9,12:9,13:9,14:9,15:9,16:9,17:9,18:12,19:12,20:12,21:12,22:12,23:12,24:12,25:12,26:12}
+ iteration_count = 10 #迭代次数
+ learning_rate = 0.000001 #学习速率
+ b=0.0001 #初始化偏移项
+ parameters=[0.001]*27 #初始化27个参数
+ loss_history=[]
+ for i in range(iteration_count):
+ loss=0
+ b_grad=0
+ w_grad=[0]*27
+ examples=list(randint(0, len(X_Train)-1) for index in range(100))
+ print("标记1",i,"\n")
+ for j in range(100):
+ index=examples.pop()
+ day = X_Train[index]
+ # print(day)
+ # # print(parameters[0])
+ # print(day.iloc[8,0])
+ # print(day.iloc[8,1])
+ # print(type(day.iloc[8,1]))
+
+
+ # print(day.iloc[8,:])
+ # print(day.iloc[9,:])
+ # print(day.iloc[12,:])
+ # # print(day.iloc[8,1])
+ # # print(day.iloc[8,2])
+ # # print(day.iloc[8,1])
+
+ partsum = b+parameters[0]*float(day.iloc[8,0])+parameters[1]*float(day.iloc[8,1])+parameters[2]*float(day.iloc[8,2])+parameters[3]*float(day.iloc[8,3])+parameters[4]*float(day.iloc[8,4])+parameters[5]*float(day.iloc[8,5])+parameters[6]*float(day.iloc[8,6])+parameters[7]*float(day.iloc[8,7])+parameters[8]*float(day.iloc[8,8])+parameters[9]*float(day.iloc[9,0])+parameters[10]*float(day.iloc[9,1])+parameters[11]*float(day.iloc[9,2])+parameters[12]*float(day.iloc[9,3])+parameters[13]*float(day.iloc[9,4])+parameters[14]*float(day.iloc[9,5])+parameters[15]*float(day.iloc[9,6])+parameters[16]*float(day.iloc[9,7])+parameters[17]*float(day.iloc[9,8])+parameters[18]*float(day.iloc[12,0])+parameters[19]*float(day.iloc[12,1])+parameters[20]*float(day.iloc[12,2])+parameters[21]*float(day.iloc[12,3])+parameters[22]*float(day.iloc[12,4])+parameters[23]*float(day.iloc[12,5])+parameters[24]*float(day.iloc[12,6])+parameters[25]*float(day.iloc[12,7])+parameters[26]*float(day.iloc[12,8])-Y_Train[index]
+ loss=loss + partsum * partsum
+ b_grad = b_grad + partsum
+ for k in range(27):
+ # print(day.iloc[dict[k],k % 9])
+ w_grad[k]=w_grad[k]+ partsum * float(day.iloc[dict[k],k % 9])
+ loss_history.append(loss/2)
+ #更新参数
+ b = b - learning_rate * b_grad
+ for t in range(27):
+ parameters[t] = parameters[t] - learning_rate * w_grad[t]
+ # print("jieshu ")
+
+ '''小批量梯度下降'''
+ dict={0:8,1:8,2:8,3:8,4:8,5:8,6:8,7:8,8:8,9:9,10:9,11:9,12:9,13:9,14:9,15:9,16:9,17:9,18:12,19:12,20:12,21:12,22:12,23:12,24:12,25:12,26:12}
+ iteration_count = 10 #迭代次数
+ learning_rate = 0.000001 #学习速率
+ b=0.0001 #初始化偏移项
+ parameters=[0.001]*27 #初始化27个参数
+ loss_history=[]
+ for i in range(iteration_count):
+ print("标记2",i,"\n")
+ loss=0
+ b_grad=0
+ w_grad=[0]*27
+ examples=list(randint(0, len(X_Train)-1) for index in range(100))
+ for j in range(100):
+ index=examples.pop()
+ day = X_Train[index]
+ partsum = b+parameters[0]*float(day.iloc[8,0])+parameters[1]*float(day.iloc[8,1])+parameters[2]*float(day.iloc[8,2])+parameters[3]*float(day.iloc[8,3])+parameters[4]*float(day.iloc[8,4])+parameters[5]*float(day.iloc[8,5])+parameters[6]*float(day.iloc[8,6])+parameters[7]*float(day.iloc[8,7])+parameters[8]*float(day.iloc[8,8])+parameters[9]*float(day.iloc[9,0])+parameters[10]*float(day.iloc[9,1])+parameters[11]*float(day.iloc[9,2])+parameters[12]*float(day.iloc[9,3])+parameters[13]*float(day.iloc[9,4])+parameters[14]*float(day.iloc[9,5])+parameters[15]*float(day.iloc[9,6])+parameters[16]*float(day.iloc[9,7])+parameters[17]*float(day.iloc[9,8])+parameters[18]*float(day.iloc[12,0])+parameters[19]*float(day.iloc[12,1])+parameters[20]*float(day.iloc[12,2])+parameters[21]*float(day.iloc[12,3])+parameters[22]*float(day.iloc[12,4])+parameters[23]*float(day.iloc[12,5])+parameters[24]*float(day.iloc[12,6])+parameters[25]*float(day.iloc[12,7])+parameters[26]*float(day.iloc[12,8])-Y_Train[index]
+ loss=loss + partsum * partsum
+ b_grad = b_grad + partsum
+ for k in range(27):
+ w_grad[k]=w_grad[k]+ partsum * float(day.iloc[dict[k],k % 9])
+ loss_history.append(loss/2)
+ #更新参数
+ b = b - learning_rate * b_grad
+ for t in range(27):
+ parameters[t] = parameters[t] - learning_rate * w_grad[t]
+
+ '''评价模型'''
+ data1 = pd.read_csv('test.csv')
+ del data1['id']
+ del data1['item']
+ # data.drop([0], axis=1)
+
+
+ X_Test=[]
+ ItemNum=18
+ for i in range(int(len(data1)/ItemNum)):
+ day = data1[i*ItemNum:(i+1)*ItemNum] #一天的观测数据
+ X_Test.append(day)
+ Y_Test=[]
+ data2 = pd.read_csv('answer.csv')
+ for i in range(len(data2)):
+ Y_Test.append(data2.iloc[i,1])
+ b=0.00371301266193
+ parameters=[-0.0024696993501677625, 0.0042664323568029619, -0.0086174899917209787, -0.017547874680980298, -0.01836289806786489, -0.0046459546176775678, -0.031425910733080147, 0.018037490234208024, 0.17448898242705385, 0.037982590870111861, 0.025666115101346722, 0.02295437149703404, 0.014272058968395849, 0.011573452230087483, 0.010984971346586308, -0.0061003639742210781, 0.19310213021199321, 0.45973205224805752, -0.0034995637680653086, 0.00094072189075279807, 0.00069329550591916357, 0.002966257320079194, 0.0050690506276038138, 0.007559004246038563, 0.013296350700555241, 0.027251049329127801, 0.039423988570899793]
+ Y_predict=[]
+ for i in range(len(X_Test)):
+ day=X_Test[i]
+ p=b+parameters[0]*float(day.iloc[8,0])+parameters[1]*float(day.iloc[8,1])+parameters[2]*float(day.iloc[8,2])+parameters[3]*float(day.iloc[8,3])+parameters[4]*float(day.iloc[8,4])+parameters[5]*float(day.iloc[8,5])+parameters[6]*float(day.iloc[8,6])+parameters[7]*float(day.iloc[8,7])+parameters[8]*float(day.iloc[8,8])+parameters[9]*float(day.iloc[9,0])+parameters[10]*float(day.iloc[9,1])+parameters[11]*float(day.iloc[9,2])+parameters[12]*float(day.iloc[9,3])+parameters[13]*float(day.iloc[9,4])+parameters[14]*float(day.iloc[9,5])+parameters[15]*float(day.iloc[9,6])+parameters[16]*float(day.iloc[9,7])+parameters[17]*float(day.iloc[9,8])+parameters[18]*float(day.iloc[12,0])+parameters[19]*float(day.iloc[12,1])+parameters[20]*float(day.iloc[12,2])+parameters[21]*float(day.iloc[12,3])+parameters[22]*float(day.iloc[12,4])+parameters[23]*float(day.iloc[12,5])+parameters[24]*float(day.iloc[12,6])+parameters[25]*float(day.iloc[12,7])+parameters[26]*float(day.iloc[12,8])
+ Y_predict.append(p)
+ def dev_degree(y_true,y_predict): #评价函数
+ sum=0
+ for i in range(len(y_predict)):
+ sum=sum+(y_true[i]-y_predict[i])*(y_true[i]-y_predict[i])
+ return sum/len(y_predict)
+ print(dev_degree(Y_Test,Y_predict))
+
+def main():
+ test()
+
+if __name__ == '__main__':
+ main()
\ No newline at end of file
From a1684f186e11203f3724764d8d798422684e3e2c Mon Sep 17 00:00:00 2001
From: cixisy <50036302+cixisy@users.noreply.github.com>
Date: Sun, 12 May 2019 22:59:33 +0800
Subject: [PATCH 15/26] =?UTF-8?q?Delete=20PM2.5=20=E9=99=88=E5=B0=8F?=
=?UTF-8?q?=E6=9D=BE.py.docx?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...351\231\210\345\260\217\346\235\276.py.docx" | Bin 13027 -> 0 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 "PM2.5 \351\231\210\345\260\217\346\235\276.py.docx"
diff --git "a/PM2.5 \351\231\210\345\260\217\346\235\276.py.docx" "b/PM2.5 \351\231\210\345\260\217\346\235\276.py.docx"
deleted file mode 100644
index 0c1ecffdd5107f8f1ab54748e677b796cb32ccee..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 13027
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
r^dHfMU*W$xcz+V8Ci{bX|91BjWWe9V
Date: Sun, 12 May 2019 23:12:38 +0800
Subject: [PATCH 16/26] Add files via upload
---
..._ \345\256\213\346\226\207\345\256\207.py" | 179 ++++++++++++++++++
1 file changed, 179 insertions(+)
create mode 100644 "PM2.5_ \345\256\213\346\226\207\345\256\207.py"
diff --git "a/PM2.5_ \345\256\213\346\226\207\345\256\207.py" "b/PM2.5_ \345\256\213\346\226\207\345\256\207.py"
new file mode 100644
index 0000000..0ea88d2
--- /dev/null
+++ "b/PM2.5_ \345\256\213\346\226\207\345\256\207.py"
@@ -0,0 +1,179 @@
+import pandas as pd
+import matplotlib.pyplot as plt
+from random import randint
+from numba import jit
+
+# @jit
+def test():
+ '''读取数据'''
+ data = pd.read_csv('train.csv') #DataFrame类型
+ # print(data)
+ # # del data[:3]
+ del data['datetime']
+ del data['stations']
+ del data['observations']
+ data.drop([0])
+ # print(data)
+ data = data.replace('NR', 0)
+ # print(data)
+ # print(data)
+
+
+ '''整理训练集合'''
+ ItemNum=18
+ X_Train=[] #训练样本features集合
+ Y_Train=[] #训练样本目标PM2.5集合
+ for i in range(int(len(data)/ItemNum)):
+ day = data[i*ItemNum:(i+1)*ItemNum] #一天的观测数据
+ for j in range(15):
+ x = day.iloc[:, j:j + 9]
+ y = int(day.iloc[9,j+9])
+ X_Train.append(x)
+ Y_Train.append(y)
+
+
+ '''绘制散点图'''
+ x_AMB_TEMP=[]
+ x_CH4=[]
+ x_CO=[]
+ x_NMHC=[]
+ y=[]
+ for i in range(len(Y_Train)):
+ y.append(Y_Train[i])
+ x=X_Train[i]
+ #求各测项的平均值
+ x_AMB_TEMP_sum=0
+ x_CH4_sum=0
+ x_CO_sum=0
+ x_NMHC_sum=0
+ for j in range(9):
+ # print(x.iloc[0,j])
+ x_AMB_TEMP_sum=x_AMB_TEMP_sum+float(x.iloc[0,j])
+ # print(x.iloc[1, j])
+ x_CH4_sum = x_CH4_sum + float(x.iloc[1, j])
+ x_CO_sum = x_CO_sum + float(x.iloc[2, j])
+ x_NMHC_sum = x_NMHC_sum + float(x.iloc[3, j])
+ x_AMB_TEMP.append(x_AMB_TEMP_sum / 9)
+ x_CH4.append(x_CH4_sum / 9)
+ x_CO.append(x_CO_sum / 9)
+ x_NMHC.append(x_NMHC_sum / 9)
+ plt.figure(figsize=(10, 6))
+ plt.subplot(2, 2, 1)
+ plt.title('AMB_TEMP')
+ plt.scatter(x_AMB_TEMP, y)
+ plt.subplot(2, 2, 2)
+ plt.title('CH4')
+ plt.scatter(x_CH4, y)
+ plt.subplot(2, 2, 3)
+ plt.title('CO')
+ plt.scatter(x_CO, y)
+ plt.subplot(2, 2, 4)
+ plt.title('NMHC')
+ plt.scatter(x_NMHC, y)
+ plt.show()
+
+ '''小批量梯度下降'''
+ dict={0:8,1:8,2:8,3:8,4:8,5:8,6:8,7:8,8:8,9:9,10:9,11:9,12:9,13:9,14:9,15:9,16:9,17:9,18:12,19:12,20:12,21:12,22:12,23:12,24:12,25:12,26:12}
+ iteration_count = 100 #迭代次数
+ learning_rate = 0.000001 #学习速率
+ b=0.0001 #初始化偏移项
+ parameters=[0.001]*27 #初始化27个参数
+ loss_history=[]
+ for i in range(iteration_count):
+ loss=0
+ b_grad=0
+ w_grad=[0]*27
+ examples=list(randint(0, len(X_Train)-1) for index in range(100))
+ print("标记1",i,"\n")
+ for j in range(100):
+ index=examples.pop()
+ day = X_Train[index]
+ # print(day)
+ # # print(parameters[0])
+ # print(day.iloc[8,0])
+ # print(day.iloc[8,1])
+ # print(type(day.iloc[8,1]))
+
+
+ # print(day.iloc[8,:])
+ # print(day.iloc[9,:])
+ # print(day.iloc[12,:])
+ # # print(day.iloc[8,1])
+ # # print(day.iloc[8,2])
+ # # print(day.iloc[8,1])
+
+ partsum = b+parameters[0]*float(day.iloc[8,0])+parameters[1]*float(day.iloc[8,1])+parameters[2]*float(day.iloc[8,2])+parameters[3]*float(day.iloc[8,3])+parameters[4]*float(day.iloc[8,4])+parameters[5]*float(day.iloc[8,5])+parameters[6]*float(day.iloc[8,6])+parameters[7]*float(day.iloc[8,7])+parameters[8]*float(day.iloc[8,8])+parameters[9]*float(day.iloc[9,0])+parameters[10]*float(day.iloc[9,1])+parameters[11]*float(day.iloc[9,2])+parameters[12]*float(day.iloc[9,3])+parameters[13]*float(day.iloc[9,4])+parameters[14]*float(day.iloc[9,5])+parameters[15]*float(day.iloc[9,6])+parameters[16]*float(day.iloc[9,7])+parameters[17]*float(day.iloc[9,8])+parameters[18]*float(day.iloc[12,0])+parameters[19]*float(day.iloc[12,1])+parameters[20]*float(day.iloc[12,2])+parameters[21]*float(day.iloc[12,3])+parameters[22]*float(day.iloc[12,4])+parameters[23]*float(day.iloc[12,5])+parameters[24]*float(day.iloc[12,6])+parameters[25]*float(day.iloc[12,7])+parameters[26]*float(day.iloc[12,8])-Y_Train[index]
+ loss=loss + partsum * partsum
+ b_grad = b_grad + partsum
+ for k in range(27):
+ # print(day.iloc[dict[k],k % 9])
+ w_grad[k]=w_grad[k]+ partsum * float(day.iloc[dict[k],k % 9])
+ loss_history.append(loss/2)
+ #更新参数
+ b = b - learning_rate * b_grad
+ for t in range(27):
+ parameters[t] = parameters[t] - learning_rate * w_grad[t]
+ # print("jieshu ")
+
+ '''小批量梯度下降'''
+ dict={0:8,1:8,2:8,3:8,4:8,5:8,6:8,7:8,8:8,9:9,10:9,11:9,12:9,13:9,14:9,15:9,16:9,17:9,18:12,19:12,20:12,21:12,22:12,23:12,24:12,25:12,26:12}
+ iteration_count = 100 #迭代次数
+ learning_rate = 0.000001 #学习速率
+ b=0.0001 #初始化偏移项
+ parameters=[0.001]*27 #初始化27个参数
+ loss_history=[]
+ for i in range(iteration_count):
+ print("标记2",i,"\n")
+ loss=0
+ b_grad=0
+ w_grad=[0]*27
+ examples=list(randint(0, len(X_Train)-1) for index in range(100))
+ for j in range(100):
+ index=examples.pop()
+ day = X_Train[index]
+ partsum = b+parameters[0]*float(day.iloc[8,0])+parameters[1]*float(day.iloc[8,1])+parameters[2]*float(day.iloc[8,2])+parameters[3]*float(day.iloc[8,3])+parameters[4]*float(day.iloc[8,4])+parameters[5]*float(day.iloc[8,5])+parameters[6]*float(day.iloc[8,6])+parameters[7]*float(day.iloc[8,7])+parameters[8]*float(day.iloc[8,8])+parameters[9]*float(day.iloc[9,0])+parameters[10]*float(day.iloc[9,1])+parameters[11]*float(day.iloc[9,2])+parameters[12]*float(day.iloc[9,3])+parameters[13]*float(day.iloc[9,4])+parameters[14]*float(day.iloc[9,5])+parameters[15]*float(day.iloc[9,6])+parameters[16]*float(day.iloc[9,7])+parameters[17]*float(day.iloc[9,8])+parameters[18]*float(day.iloc[12,0])+parameters[19]*float(day.iloc[12,1])+parameters[20]*float(day.iloc[12,2])+parameters[21]*float(day.iloc[12,3])+parameters[22]*float(day.iloc[12,4])+parameters[23]*float(day.iloc[12,5])+parameters[24]*float(day.iloc[12,6])+parameters[25]*float(day.iloc[12,7])+parameters[26]*float(day.iloc[12,8])-Y_Train[index]
+ loss=loss + partsum * partsum
+ b_grad = b_grad + partsum
+ for k in range(27):
+ w_grad[k]=w_grad[k]+ partsum * float(day.iloc[dict[k],k % 9])
+ loss_history.append(loss/2)
+ #更新参数
+ b = b - learning_rate * b_grad
+ for t in range(27):
+ parameters[t] = parameters[t] - learning_rate * w_grad[t]
+
+ '''评价模型'''
+ data1 = pd.read_csv('test.csv')
+ del data1['id']
+ del data1['item']
+ # data.drop([0], axis=1)
+
+
+ X_Test=[]
+ ItemNum=18
+ for i in range(int(len(data1)/ItemNum)):
+ day = data1[i*ItemNum:(i+1)*ItemNum] #一天的观测数据
+ X_Test.append(day)
+ Y_Test=[]
+ data2 = pd.read_csv('answer.csv')
+ for i in range(len(data2)):
+ Y_Test.append(data2.iloc[i,1])
+ b=0.00371301266193
+ parameters=[-0.0024696993501677625, 0.0042664323568029619, -0.0086174899917209787, -0.017547874680980298, -0.01836289806786489, -0.0046459546176775678, -0.031425910733080147, 0.018037490234208024, 0.17448898242705385, 0.037982590870111861, 0.025666115101346722, 0.02295437149703404, 0.014272058968395849, 0.011573452230087483, 0.010984971346586308, -0.0061003639742210781, 0.19310213021199321, 0.45973205224805752, -0.0034995637680653086, 0.00094072189075279807, 0.00069329550591916357, 0.002966257320079194, 0.0050690506276038138, 0.007559004246038563, 0.013296350700555241, 0.027251049329127801, 0.039423988570899793]
+ Y_predict=[]
+ for i in range(len(X_Test)):
+ day=X_Test[i]
+ p=b+parameters[0]*float(day.iloc[8,0])+parameters[1]*float(day.iloc[8,1])+parameters[2]*float(day.iloc[8,2])+parameters[3]*float(day.iloc[8,3])+parameters[4]*float(day.iloc[8,4])+parameters[5]*float(day.iloc[8,5])+parameters[6]*float(day.iloc[8,6])+parameters[7]*float(day.iloc[8,7])+parameters[8]*float(day.iloc[8,8])+parameters[9]*float(day.iloc[9,0])+parameters[10]*float(day.iloc[9,1])+parameters[11]*float(day.iloc[9,2])+parameters[12]*float(day.iloc[9,3])+parameters[13]*float(day.iloc[9,4])+parameters[14]*float(day.iloc[9,5])+parameters[15]*float(day.iloc[9,6])+parameters[16]*float(day.iloc[9,7])+parameters[17]*float(day.iloc[9,8])+parameters[18]*float(day.iloc[12,0])+parameters[19]*float(day.iloc[12,1])+parameters[20]*float(day.iloc[12,2])+parameters[21]*float(day.iloc[12,3])+parameters[22]*float(day.iloc[12,4])+parameters[23]*float(day.iloc[12,5])+parameters[24]*float(day.iloc[12,6])+parameters[25]*float(day.iloc[12,7])+parameters[26]*float(day.iloc[12,8])
+ Y_predict.append(p)
+ def dev_degree(y_true,y_predict): #评价函数
+ sum=0
+ for i in range(len(y_predict)):
+ sum=sum+(y_true[i]-y_predict[i])*(y_true[i]-y_predict[i])
+ return sum/len(y_predict)
+ print(dev_degree(Y_Test,Y_predict))
+
+def main():
+ test()
+
+if __name__ == '__main__':
+ main()
\ No newline at end of file
From c8f418e8c973484e052a67b9793037a171b5f386 Mon Sep 17 00:00:00 2001
From: cixisy <50036302+cixisy@users.noreply.github.com>
Date: Sun, 12 May 2019 23:20:28 +0800
Subject: [PATCH 17/26] Add files via upload
---
... \351\231\210\345\260\217\346\235\276 .md" | 8 +++
...5 \351\231\210\345\260\217\346\235\276.py" | 49 +++++++++++++++++++
2 files changed, 57 insertions(+)
create mode 100644 "PM2.5 \351\231\210\345\260\217\346\235\276 .md"
create mode 100644 "PM2.5 \351\231\210\345\260\217\346\235\276.py"
diff --git "a/PM2.5 \351\231\210\345\260\217\346\235\276 .md" "b/PM2.5 \351\231\210\345\260\217\346\235\276 .md"
new file mode 100644
index 0000000..78a3163
--- /dev/null
+++ "b/PM2.5 \351\231\210\345\260\217\346\235\276 .md"
@@ -0,0 +1,8 @@
+项目流程:
+1.设计模型:
+ 先整理集合,绘制散点图,因为建立的是Linear Regression模型,结合散点图选择features.
+2.定义LOSS函数
+ 设计Loss函数,梯度下降
+总结:
+ 在项目进行中,发现自己python掌握很差,应当多学习学习
+ 对LOSS函数的建立,及梯度下降还是不太懂,应加强学习。
\ No newline at end of file
diff --git "a/PM2.5 \351\231\210\345\260\217\346\235\276.py" "b/PM2.5 \351\231\210\345\260\217\346\235\276.py"
new file mode 100644
index 0000000..b8f1f31
--- /dev/null
+++ "b/PM2.5 \351\231\210\345\260\217\346\235\276.py"
@@ -0,0 +1,49 @@
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+
+data = pd.read_csv(r'C:\Users\18801\Documents\WeChat Files\wxid_8vs9i3nhli4u22\FileStorage\File\2019-05\2017fall-ml-hw1-master\train.csv')
+
+pm2_5 = data[data['class']=='PM2.5'].ix[:, 3:]
+
+tempxlist = []
+tempylist = []
+for i in range(15):
+ tempx = pm2_5.iloc[:, i:i+9]
+ tempx.columns = np.array(range(9))
+ tempy = pm2_5.iloc[:, i+9]
+ tempy.columns = ['1']
+ tempxlist.append(tempx)
+ tempylist.append(tempy)
+xdata = pd.concat(tempxlist)
+x = np.array(xdata, float)
+ydata = pd.concat(tempylist)
+y = np.array(ydata, float)
+
+x = np.concatenate((np.ones((x.shape[0], 1)), x), axis=1)
+
+w = np.zeros((len(x[0])))
+lr = 10
+iteration = 10000
+s_grad = np.zeros(len(x[0]))
+for i in range(iteration):
+ tem = np.dot(x, w)
+ loss = y - tem
+ grad = np.dot(x.transpose(), loss)*(-2)
+ s_grad += grad**2
+ ada = np.sqrt(s_grad)
+ w = w - lr*grad/ada
+
+testdata = pd.read_csv(r'C:\Users\18801\Documents\WeChat Files\wxid_8vs9i3nhli4u22\FileStorage\File\2019-05\2017fall-ml-hw1-master\test.csv')
+pm2_5_test = testdata[testdata['class']=='PM2.5'].ix[:, 2:]
+x_test = np.array(pm2_5_test, float)
+x_test_b = np.concatenate((np.ones((x_test.shape[0], 1)), x_test), axis=1)
+y_star = np.dot(x_test_b, w)
+y_pre = pd.read_csv(r'C:\Users\18801\Documents\WeChat Files\wxid_8vs9i3nhli4u22\FileStorage\File\2019-05\2017fall-ml-hw1-master\sampleSubmission.csv', encoding='gbk')
+y_pre.value = y_star
+
+real = pd.read_csv(r'C:\Users\18801\Documents\WeChat Files\wxid_8vs9i3nhli4u22\FileStorage\File\2019-05\2017fall-ml-hw1-master\ans.csv')
+erro = abs(y_pre.value - real.value).sum()/len(real.value)
+print(erro)
+
+输出:4.97442948413
\ No newline at end of file
From 8b163a7755d3fdd786a451a1d5a30ee75541864a Mon Sep 17 00:00:00 2001
From: nortonzj <50541210+nortonzj@users.noreply.github.com>
Date: Sun, 12 May 2019 23:42:19 +0800
Subject: [PATCH 18/26] Add files via upload
---
"PM2.5\345\274\240\351\235\226.md" | 11 +++++++
"PM2.5\345\274\240\351\235\226.py" | 48 ++++++++++++++++++++++++++++++
2 files changed, 59 insertions(+)
create mode 100644 "PM2.5\345\274\240\351\235\226.md"
create mode 100644 "PM2.5\345\274\240\351\235\226.py"
diff --git "a/PM2.5\345\274\240\351\235\226.md" "b/PM2.5\345\274\240\351\235\226.md"
new file mode 100644
index 0000000..5e56a14
--- /dev/null
+++ "b/PM2.5\345\274\240\351\235\226.md"
@@ -0,0 +1,11 @@
+## 李宏毅PM2.5问题 ##
+建立一个模型,根据前9个小时的观测数据预测此时间点的PM2.5值
+##实现思路##
+从训练数据中提取出连续十个小时的观测数据,最后一个小时的PM2.5作为该条数据的类标签,而前九个小时的PM2.5值作为特征。一天24个小时,一天内总共有24-10+1 =15条记录。
+将cha更新
+读取测试文件,计算预测值和真实值的偏差,计算平均误差
+## 学习内容 ##
+部分python基础知识
+吴恩达第一、二周课程
+## 预期学习 ##
+吴恩达第三四周课程,继续学习python
\ No newline at end of file
diff --git "a/PM2.5\345\274\240\351\235\226.py" "b/PM2.5\345\274\240\351\235\226.py"
new file mode 100644
index 0000000..b012e9c
--- /dev/null
+++ "b/PM2.5\345\274\240\351\235\226.py"
@@ -0,0 +1,48 @@
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+
+data = pd.read_csv(r'C:\Users\zjnorton\Desktop\2017fall-ml-hw1-master\train.csv')
+
+pm2_5 = data[data['class']=='PM2.5'].ix[:, 3:]
+
+tempxlist = []
+tempylist = []
+for i in range(15):
+ tempx = pm2_5.iloc[:, i:i+9]
+ tempx.columns = np.array(range(9))
+ tempy = pm2_5.iloc[:, i+9]
+ tempy.columns = ['1']
+ tempxlist.append(tempx)
+ tempylist.append(tempy)
+xdata = pd.concat(tempxlist)
+x = np.array(xdata, float)
+ydata = pd.concat(tempylist)
+y = np.array(ydata, float)
+
+x = np.concatenate((np.ones((x.shape[0], 1)), x), axis=1)
+
+w = np.zeros((len(x[0])))
+lr = 10
+iteration = 10000
+s_grad = np.zeros(len(x[0]))
+for i in range(iteration):
+ tem = np.dot(x, w)
+ loss = y - tem
+ grad = np.dot(x.transpose(), loss)*(-2)
+ s_grad += grad**2
+ ada = np.sqrt(s_grad)
+ w = w - lr*grad/ada
+
+testdata = pd.read_csv(r'C:\Users\zjnorton\Desktop\2017fall-ml-hw1-master\test.csv')
+pm2_5_test = testdata[testdata['class']=='PM2.5'].ix[:, 2:]
+x_test = np.array(pm2_5_test, float)
+x_test_b = np.concatenate((np.ones((x_test.shape[0], 1)), x_test), axis=1)
+y_star = np.dot(x_test_b, w)
+y_pre = pd.read_csv(r'C:\Users\zjnorton\Desktop\2017fall-ml-hw1-master\sampleSubmission.csv', encoding='gbk')
+y_pre.value = y_star
+
+real = pd.read_csv(r'C:\Users\zjnorton\Desktop\2017fall-ml-hw1-master\ans.csv')
+erro = abs(y_pre.value - real.value).sum()/len(real.value)
+print(erro)
+
From 19fd6ee356087d1580a0e8c7c8139fb63c6ddb2c Mon Sep 17 00:00:00 2001
From: Car Jeff <49448671+carjeff@users.noreply.github.com>
Date: Mon, 13 May 2019 00:06:44 +0800
Subject: [PATCH 19/26] Add files via upload
---
...5_\350\275\246\345\255\220\346\235\260.py" | 46 +++++++++++++++++++
1 file changed, 46 insertions(+)
create mode 100644 "PM2.5_\350\275\246\345\255\220\346\235\260.py"
diff --git "a/PM2.5_\350\275\246\345\255\220\346\235\260.py" "b/PM2.5_\350\275\246\345\255\220\346\235\260.py"
new file mode 100644
index 0000000..230975a
--- /dev/null
+++ "b/PM2.5_\350\275\246\345\255\220\346\235\260.py"
@@ -0,0 +1,46 @@
+import pandas as pd
+import numpy as np
+
+data = pd.read_csv('train.csv', encoding='gbk')
+pm2_5 = data[data["class"]=="PM2.5"].ix[:, 3:]
+
+tempxlist = []
+tempylist = []
+for i in range(15):
+ tempx = pm2_5.iloc[:, i:i+9]
+ tempx.columns = np.array(range(9))
+ tempy = pm2_5.iloc[:, i+9]
+ tempy.columns = ['1']
+ tempxlist.append(tempx)
+ tempylist.append(tempy)
+xdata = pd.concat(tempxlist)
+x = np.array(xdata, float)
+ydata = pd.concat(tempylist)
+y = np.array(ydata, float)
+
+x = np.concatenate((np.ones((x.shape[0], 1)), x), axis=1)
+
+w = np.zeros((len(x[0])))
+lr = 10
+iteration = 10000
+s_grad = np.zeros(len(x[0]))
+for i in range(iteration):
+ tem = np.dot(x, w)
+ loss = y - tem
+ grad = np.dot(x.transpose(), loss)*(-2)
+ s_grad += grad**2
+ ada = np.sqrt(s_grad)
+ w = w - lr*grad/ada
+''''''
+
+testdata = pd.read_csv('test.csv', encoding='gbk')
+pm2_5_test = testdata[testdata['class']=='PM2.5'].ix[:, 2:]
+x_test = np.array(pm2_5_test, float)
+x_test_b = np.concatenate((np.ones((x_test.shape[0], 1)), x_test), axis=1)
+y_star = np.dot(x_test_b, w)
+y_pre = pd.read_csv('sampleSubmission.csv', encoding='gbk')
+y_pre.value = y_star
+
+real = pd.read_csv('ans.csv', encoding='gbk')
+erro = abs(y_pre.value - real.value).sum()/len(real.value)
+print(erro)
From ce35301da9358ddf1f8daef3c5772db112d4ddbb Mon Sep 17 00:00:00 2001
From: Car Jeff <49448671+carjeff@users.noreply.github.com>
Date: Mon, 13 May 2019 00:07:57 +0800
Subject: [PATCH 20/26] Add files via upload
---
...5_\350\275\246\345\255\220\346\235\260.md" | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
create mode 100644 "PM2.5_\350\275\246\345\255\220\346\235\260.md"
diff --git "a/PM2.5_\350\275\246\345\255\220\346\235\260.md" "b/PM2.5_\350\275\246\345\255\220\346\235\260.md"
new file mode 100644
index 0000000..c39ece7
--- /dev/null
+++ "b/PM2.5_\350\275\246\345\255\220\346\235\260.md"
@@ -0,0 +1,19 @@
+#实现思路
+首先导入pandas库,读取test.csv和train.csv文件, 以此读取数据
+以前9小时数据为一组存入data中
+通过获取的数据,根据计算方式,计算预测值和真实偏差
+计算平均误差
+
+#实现结果
+成功获得平均误差
+但是平均误差相对来说较大
+没有实现另一个csdn中给出的散点绘图,plt的用法还在学习中
+
+#学习内容
+观看李宏毅视频至PM2.5处
+学习python的基本用法
+
+#下阶段学习计划
+继续深入学习python用法,了解其他库文件用法
+继续学习李宏毅视频
+尝试实现一下辛普森一家问题
From 6526bbff05ec7b0cba029c219c64e4c5846ea876 Mon Sep 17 00:00:00 2001
From: Car Jeff <49448671+carjeff@users.noreply.github.com>
Date: Mon, 13 May 2019 00:09:21 +0800
Subject: [PATCH 21/26] =?UTF-8?q?Delete=20PM2.5=5F=E8=BD=A6=E5=AD=90?=
=?UTF-8?q?=E6=9D=B0.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...5_\350\275\246\345\255\220\346\235\260.md" | 19 -------------------
1 file changed, 19 deletions(-)
delete mode 100644 "PM2.5_\350\275\246\345\255\220\346\235\260.md"
diff --git "a/PM2.5_\350\275\246\345\255\220\346\235\260.md" "b/PM2.5_\350\275\246\345\255\220\346\235\260.md"
deleted file mode 100644
index c39ece7..0000000
--- "a/PM2.5_\350\275\246\345\255\220\346\235\260.md"
+++ /dev/null
@@ -1,19 +0,0 @@
-#实现思路
-首先导入pandas库,读取test.csv和train.csv文件, 以此读取数据
-以前9小时数据为一组存入data中
-通过获取的数据,根据计算方式,计算预测值和真实偏差
-计算平均误差
-
-#实现结果
-成功获得平均误差
-但是平均误差相对来说较大
-没有实现另一个csdn中给出的散点绘图,plt的用法还在学习中
-
-#学习内容
-观看李宏毅视频至PM2.5处
-学习python的基本用法
-
-#下阶段学习计划
-继续深入学习python用法,了解其他库文件用法
-继续学习李宏毅视频
-尝试实现一下辛普森一家问题
From d79dd527a478089f9f1c126dae780f72f27b7ff6 Mon Sep 17 00:00:00 2001
From: Car Jeff <49448671+carjeff@users.noreply.github.com>
Date: Mon, 13 May 2019 00:14:27 +0800
Subject: [PATCH 22/26] Add files via upload
---
...5_\350\275\246\345\255\220\346\235\260.md" | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
create mode 100644 "PM2.5_\350\275\246\345\255\220\346\235\260.md"
diff --git "a/PM2.5_\350\275\246\345\255\220\346\235\260.md" "b/PM2.5_\350\275\246\345\255\220\346\235\260.md"
new file mode 100644
index 0000000..3733e71
--- /dev/null
+++ "b/PM2.5_\350\275\246\345\255\220\346\235\260.md"
@@ -0,0 +1,24 @@
+
+#实现思路
+首先导入pandas库,读取test.csv和train.csv文件, 以此读取数据
+以前9小时数据为一组存入data中
+通过获取的数据,根据计算方式,计算预测值和真实偏差
+计算平均误差
+
+#实现结果
+成功获得平均误差
+但是平均误差相对来说较大
+没有实现另一个csdn中给出的散点绘图,plt的用法还在学习中
+
+#学习内容
+观看李宏毅视频至PM2.5处
+学习python的基本用法
+
+#下阶段学习计划
+继续深入学习python用法,了解其他库文件用法
+继续学习李宏毅视频
+尝试实现一下辛普森一家问题
+
+
+
+
From eb60bb42763c2aa6077b9fba8b47b8734721c695 Mon Sep 17 00:00:00 2001
From: Yue Wu <39611267+Wulele1998@users.noreply.github.com>
Date: Mon, 13 May 2019 00:18:52 +0800
Subject: [PATCH 23/26] Add files via upload
---
"PM2.5_\345\220\264\350\266\212.md" | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100644 "PM2.5_\345\220\264\350\266\212.md"
diff --git "a/PM2.5_\345\220\264\350\266\212.md" "b/PM2.5_\345\220\264\350\266\212.md"
new file mode 100644
index 0000000..f016c38
--- /dev/null
+++ "b/PM2.5_\345\220\264\350\266\212.md"
@@ -0,0 +1,25 @@
+# PM 2.5数据分析及预测及近期学习报告#
+
+## 已完成 ##
+对文章的进行关于PM2.5的分析预测思路有了大致的了解,并通过对csv文件的预处理,成功运行实现了代码,但对于核心梯度下降的代码部分仍有遗留问题
+
+文章通过对18项空气质量指标,通过绘制各个空气指标前9小时与待预测PM2.5值的散点图,从中筛选出关键特征(Features),至于散点图的筛选标准,我个人觉得为该散点图的正相关程度,作者最终选择了S02,PM 10以及PM 2.5作为三个关键特征带入后续计算,而这三者图像均倾向于正相关趋势
+
+三个特征项,每一项前9个小时的数据,因而有27个weight权重值进入梯度下降计算中
+
+
+## 存疑(代码运行中存在问题) ##
+博客作者最后评价体系给出了他所得到的最佳的27个weight权值值,而我通过运算的到的Loss值73.65,与博客最终提供的45.68有较大的出入
+
+尝试自己迭代进行小批量梯度下降计算,得到的权值十分巨大,迭代部分核心代码有较大问题,仍在思考解决中(按照源码迭代出的权值,超级大,以至于最后的Loss值为Inf,不得不说,真是惊了)
+
+## 学习进展 ##
+看了两集李宏毅的学习教程,在宝可梦的谜一样世界里梦游,不得不说,这样的老师讲课,学生不会瞌睡倒是真的
+
+通过Mooc入门学习了TensorFlow框架,目前学至神经网络的正则化,TensorFlow函数实在千姿百态,刚入门,实在记不太住具体用法和使用情景
+
+完成辛普森一家角色人物分拣,第一次使用热门的数据平台Kaggle,用的很蹩脚,希望以后多多使用,增加熟悉
+
+吴越
+
+2019.5.13
\ No newline at end of file
From 5bb94ed0546af0339e8f999b45d46ec15240c29c Mon Sep 17 00:00:00 2001
From: Car Jeff <49448671+carjeff@users.noreply.github.com>
Date: Mon, 13 May 2019 00:20:53 +0800
Subject: [PATCH 24/26] =?UTF-8?q?Delete=20PM2.5=5F=E8=BD=A6=E5=AD=90?=
=?UTF-8?q?=E6=9D=B0.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...5_\350\275\246\345\255\220\346\235\260.md" | 24 -------------------
1 file changed, 24 deletions(-)
delete mode 100644 "PM2.5_\350\275\246\345\255\220\346\235\260.md"
diff --git "a/PM2.5_\350\275\246\345\255\220\346\235\260.md" "b/PM2.5_\350\275\246\345\255\220\346\235\260.md"
deleted file mode 100644
index 3733e71..0000000
--- "a/PM2.5_\350\275\246\345\255\220\346\235\260.md"
+++ /dev/null
@@ -1,24 +0,0 @@
-
-#实现思路
-首先导入pandas库,读取test.csv和train.csv文件, 以此读取数据
-以前9小时数据为一组存入data中
-通过获取的数据,根据计算方式,计算预测值和真实偏差
-计算平均误差
-
-#实现结果
-成功获得平均误差
-但是平均误差相对来说较大
-没有实现另一个csdn中给出的散点绘图,plt的用法还在学习中
-
-#学习内容
-观看李宏毅视频至PM2.5处
-学习python的基本用法
-
-#下阶段学习计划
-继续深入学习python用法,了解其他库文件用法
-继续学习李宏毅视频
-尝试实现一下辛普森一家问题
-
-
-
-
From 953b2beadb15037d4c2439f57399bf8da5e17aaa Mon Sep 17 00:00:00 2001
From: Car Jeff <49448671+carjeff@users.noreply.github.com>
Date: Mon, 13 May 2019 00:21:15 +0800
Subject: [PATCH 25/26] Add files via upload
---
...5_\350\275\246\345\255\220\346\235\260.md" | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
create mode 100644 "PM2.5_\350\275\246\345\255\220\346\235\260.md"
diff --git "a/PM2.5_\350\275\246\345\255\220\346\235\260.md" "b/PM2.5_\350\275\246\345\255\220\346\235\260.md"
new file mode 100644
index 0000000..ee1efdb
--- /dev/null
+++ "b/PM2.5_\350\275\246\345\255\220\346\235\260.md"
@@ -0,0 +1,24 @@
+
+## 实现思路
+> 首先导入pandas库,读取test.csv和train.csv文件, 以此读取数据
+> 以前9小时数据为一组存入data中
+> 通过获取的数据,根据计算方式,计算预测值和真实偏差
+> 计算平均误差
+
+## 实现结果
+>成功获得平均误差
+但是平均误差相对来说较大
+没有实现另一个csdn中给出的散点绘图,plt的用法还在学习中
+
+## 学习内容
+>观看李宏毅视频至PM2.5处
+学习python的基本用法
+
+## 下阶段学习计划
+>继续深入学习python用法,了解其他库文件用法
+继续学习李宏毅视频
+尝试实现一下辛普森一家问题
+
+
+
+
From 2252d8fde0987ef17b20e4925732c99d0791ace5 Mon Sep 17 00:00:00 2001
From: Yue Wu <39611267+Wulele1998@users.noreply.github.com>
Date: Mon, 13 May 2019 00:23:40 +0800
Subject: [PATCH 26/26] =?UTF-8?q?Update=20PM2.5=5F=E5=90=B4=E8=B6=8A.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
近期学习报告 吴越
---
"PM2.5_\345\220\264\350\266\212.md" | 36 +++++++++++++++++++++--------
1 file changed, 26 insertions(+), 10 deletions(-)
diff --git "a/PM2.5_\345\220\264\350\266\212.md" "b/PM2.5_\345\220\264\350\266\212.md"
index f016c38..761df1f 100644
--- "a/PM2.5_\345\220\264\350\266\212.md"
+++ "b/PM2.5_\345\220\264\350\266\212.md"
@@ -1,25 +1,41 @@
# PM 2.5数据分析及预测及近期学习报告#
## 已完成 ##
-对文章的进行关于PM2.5的分析预测思路有了大致的了解,并通过对csv文件的预处理,成功运行实现了代码,但对于核心梯度下降的代码部分仍有遗留问题
-文章通过对18项空气质量指标,通过绘制各个空气指标前9小时与待预测PM2.5值的散点图,从中筛选出关键特征(Features),至于散点图的筛选标准,我个人觉得为该散点图的正相关程度,作者最终选择了S02,PM 10以及PM 2.5作为三个关键特征带入后续计算,而这三者图像均倾向于正相关趋势
-三个特征项,每一项前9个小时的数据,因而有27个weight权重值进入梯度下降计算中
+- 对文章的进行关于PM2.5的分析预测思路有了大致的了解,并通过对csv文件的预处理,成功运行实现了代码,但对于核心梯度下降的代码部分仍有遗留问题
+
+
+
+- 文章通过对18项空气质量指标,通过绘制各个空气指标前9小时与待预测PM2.5值的散点图,从中筛选出关键特征(Features),至于散点图的筛选标准,我个人觉得为该散点图的正相关程度,作者最终选择了S02,PM 10以及PM 2.5作为三个关键特征带入后续计算,而这三者图像均倾向于正相关趋势
+
+
+
+- 三个特征项,每一项前9个小时的数据,因而有27个weight权重值进入梯度下降计算中

## 存疑(代码运行中存在问题) ##
-博客作者最后评价体系给出了他所得到的最佳的27个weight权值值,而我通过运算的到的Loss值73.65,与博客最终提供的45.68有较大的出入
-尝试自己迭代进行小批量梯度下降计算,得到的权值十分巨大,迭代部分核心代码有较大问题,仍在思考解决中(按照源码迭代出的权值,超级大,以至于最后的Loss值为Inf,不得不说,真是惊了)
+
+- 博客作者最后评价体系给出了他所得到的最佳的27个weight权值值,而我通过运算的到的Loss值73.65,与博客最终提供的45.68有较大的出入
+
+
+
+- 尝试自己迭代进行小批量梯度下降计算,得到的权值十分巨大,迭代部分核心代码有较大问题,仍在思考解决中(按照源码迭代出的权值,超级大,以至于最后的Loss值为Inf,不得不说,真是惊了)
## 学习进展 ##
-看了两集李宏毅的学习教程,在宝可梦的谜一样世界里梦游,不得不说,这样的老师讲课,学生不会瞌睡倒是真的
-通过Mooc入门学习了TensorFlow框架,目前学至神经网络的正则化,TensorFlow函数实在千姿百态,刚入门,实在记不太住具体用法和使用情景
-完成辛普森一家角色人物分拣,第一次使用热门的数据平台Kaggle,用的很蹩脚,希望以后多多使用,增加熟悉
+- 看了两集李宏毅的学习教程,在宝可梦的谜一样世界里梦游,不得不说,这样的老师讲课,学生不会瞌睡倒是真的
+
+
+
+- 通过Mooc入门学习了TensorFlow框架,目前学至神经网络的正则化,TensorFlow函数实在千姿百态,刚入门,实在记不太住具体用法和使用情景
+
+
+
+- 完成辛普森一家角色人物分拣,第一次使用热门的数据平台Kaggle,用的很蹩脚,希望以后多多使用,增加熟悉
+
-吴越
-2019.5.13
\ No newline at end of file
+5/13/2019 12:22:49 AM