Linear Regression
用的是李宏毅老师第一节课的课后作业讲义。纯用numpy搭建一个线性回归网络。
最简单的线性回归Y=WX
Load 'train.csv'
import pandas as pd
import numpy as np
data = pd.read_csv('./train.csv', encoding = 'big5') #big5为繁体中文的编码
Preprocessing
数据预处理,把文档中有效的数据提取出来,再把数据中的无效值,全部替换成 0
data = data.iloc[:, 3:] #选取测试集数据 第三列至最后一列,所有行
data[data == 'NR'] = 0 #数据清洗,把数据中值为 NR 的数据全部变成0
raw_data = data.to_numpy() #把pandas数据转换为Numpy格式
Extract Features (1)
提取数据特征
month_data = {} #按照 月 切分数据
# np.set_printoptions(threshold=np.inf)
for month in range(12):
sample = np.empty([18, 480]) #随机生成一个shape=(18,480)的矩阵,480=20*24
for day in range(20): #一个月中有20天的数据,每天有24个小时的数据
sample[:, day * 24 : (day + 1) * 24] = raw_data[18 * (20 * month + day) : 18 * (20 * month + day + 1), :]
# 把raw_data中的数据按照(18,480)的格式,依次分配到sample中
month_data[month] = sample
#month_data中按 月 存储数据
Extract Features (2)
x = np.empty([12 * 471, 18 * 9], dtype = float) #随机生成一个shape=(5652,162)的数组,用于存放特征值
y = np.empty([12 * 471, 1], dtype = float) #随机生成一个shape=(5652,1)的数组,用于存放标签值
for month in range(12):
for day in range(20):
for hour in range(24):
if day == 19 and hour > 14:
continue
x[month * 471 + day * 24 + hour, :] = month_data[month][:,day * 24 + hour : day * 24 + hour + 9].reshape(1, -1)
#拉平month_data,每次从month_data中获取9个特征,赋值到x中
y[month * 471 + day * 24 + hour, 0] = month_data[month][9, day * 24 + hour + 9]
#y获取month_data的第九行,PM2.5的值作为标签值
print(x)
print(y)
Normalize (1)
把数据做标准归一化处理,防止一些较大的特征值对模型产生影响
mean_x = np.mean(x, axis = 0) #18 * 9
std_x = np.std(x, axis = 0) #18 * 9
#Z-Score标准化
for i in range(len(x)): #12 * 471
for j in range(len(x[0])): #18 * 9
if std_x[j] != 0:
x[i][j] = (x[i][j] - mean_x[j]) / std_x[j]
x
Traning Datesets
#训练集
dim = 18 * 9 + 1
w = np.zeros([dim, 1]) #权值w的初始值设为全0
x = np.concatenate((np.ones([12 * 471, 1]), x), axis = 1).astype(float)
learning_rate = 100 #学习率
iter_time = 1000 #迭代次数
adagrad = np.zeros([dim, 1]) #adagrad优化器
eps = 0.0000000001 #防止梯度消失
print(w.shape,x.shape)
for t in range(iter_time):
loss = np.sqrt(np.sum(np.power(np.dot(x, w) - y, 2))/471/12)# 损失函数为 rmse
if(t%100==0):
print(str(t) + ":" + str(loss)) #每迭代100轮输出一次损失值
gradient = 2 * np.dot(x.transpose(), np.dot(x, w) - y) #dim*1
adagrad += gradient ** 2
w = w - learning_rate * gradient / np.sqrt(adagrad + eps) #自适应学习率
np.save('weight.npy', w) #保存权值
w
这里用了adagrad优化器,这个优化器的算法还没彻底理解,,,下次再补
Testing
#测试集训练
testdata = pd.read_csv('./test.csv', header = None, encoding = 'big5')
test_data = testdata.iloc[:, 2:]
test_data[test_data == 'NR'] = 0
test_data = test_data.to_numpy()
#和之前一样的数据预处理
test_x = np.empty([240, 18*9], dtype = float)
for i in range(240):
test_x[i, :] = test_data[18 * i: 18* (i + 1), :].reshape(1, -1)
#标准化
for i in range(len(test_x)):
for j in range(len(test_x[0])):
if std_x[j] != 0:
test_x[i][j] = (test_x[i][j] - mean_x[j]) / std_x[j]
test_x = np.concatenate((np.ones([240, 1]), test_x), axis = 1).astype(float)
test_x
Prediction
w = np.load('weight.npy') #读取权值
ans_y = np.dot(test_x, w) #点乘,输出值
ans_y
树莓派遇坑环节
这回彻底被我玩坏了,每天都要重装一次系统,私以为这个32bit的Raspberry OS 已经不适合现在这个版本了,许多网上能用的软件到了这个OS上,总会有各种各种的错误。现在准备买个HDMI连接线,然后装个64bit 的Ubuntu Mate系统。
之前那个改变分辨率崩溃的问题好像有些眉目了,可能是因为我没有用root用户去改。
现在先把服务器的东西放一下,多去学一点机器学习的东西。
概率论部分
刷了一些基本的题目,感觉学得很蛇,还要继续学习。。。









网友评论