前几日,抓取某股票交易数据后,将原始数据进行了归一化处理,剩下的列尽然有40多个。如何在2维度空间展现这些数据呢?我想到了降维处理(dimensionallity reduction)。
根据百度百科对“降维处理”的定义,降维处理是将高维数据化为低维度数据的操作,包括偏最小二乘、非线性映照和投影寻踪技术等降维处理方法。数据在低维下更容易处理、更容易使用,特别是重要特征更能在数据中明确的显示出来。如果只有两维或者三维的话,更便于可视化展示;同时,还可以去除数据噪声,实现降低算法开销。
一、降维处理
在python中,为实现降维,首先想到了scikit-learn程序包。
scikit-learn针对降维处理,提供专门的函数。
函数说明:
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
n_components:
意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n
类型:int 或者 string,缺省时默认为None,所有成分被保留。
赋值为int,比如n_components=1,将把原始数据降到一个维度。
赋值为string,比如n_components='mle',将自动选取特征个数n,使得满足所要求的方差百分比。
copy:
类型:bool,True或者False,缺省时默认为True。
意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的 值会改,因为是在原始数据上进行降维计算。
whiten:
类型:bool,缺省时默认为False
意义:白化,使得每个特征具有相同的方差。
例子:
from sklearn.decomposition import PCA
pca = PCA(n_components=2) //降维到二维
pca.fit(data)//填入数据
newdata=pca.transform(data)//反馈降维后的数据
二、MYSQL数据读取
我使用的是PYTHON3.6,无法直接使用MySQLdb,后来找到个pymysql的包,感觉还不错。 pymysql在函数定义上与MySQLdb类似。
例子:
import pymysql
pymysql.install_as_MySQLdb()
db = pymysql.connect("localhost", "root", "123456", "shares", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT open_new, high_new, close_new, low_new, volume_new, price_change_new, p_change_new, ma5_new, ma10_new, ma20_new, v_ma5_new, v_ma10_new, v_ma20_new FROM new_data")
# 使用 fetchone() 方法获取一条数据
#data = cursor.fetchone() //如果只取一行,对数据降维处理的结果有影响。
# 获取所有记录列表
data = cursor.fetchall()
# 关闭数据库连接
db.close()
三、回归展示
因为才接触Tensorflow,只有做个简单的线性回归,测试性把数据展示出来。
在降维数据的散点图上,做了个简单的线性拟合,可以看出效果并不好。
这个是模型的损失函数。
四、实现代码
代码比较乱,毕竟当个学习笔记还可以
import numpy as np
from sklearn.decomposition import PCA
import pymysql
pymysql.install_as_MySQLdb()
import matplotlib.pyplot as plt
# 打开数据库连接
db = pymysql.connect("localhost", "root", "203102", "shares", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT open_new, high_new, close_new, low_new, volume_new, price_change_new, p_change_new, ma5_new, ma10_new, ma20_new, v_ma5_new, v_ma10_new, v_ma20_new FROM new_data")
# 使用 fetchone() 方法获取一条数据
#data = cursor.fetchone()
# 获取所有记录列表
data = cursor.fetchall()
# 关闭数据库连接
db.close()
#print(data)
pca = PCA(n_components=2)
pca.fit(data)
newdata=pca.transform(data)
#print(newdata)
#折线图
#plt.plot(newdata[:,0],newdata[:,1])
#散点图
plt.scatter(newdata[:,0],newdata[:,1])
plt.show()
import tensorflow.compat.v1 as tf
plotdata = { "batchsize":[], "loss":[] }
# 创建模型
# 占位符
#tenserflow 2.0的机关
tf.reset_default_graph()
tf.disable_eager_execution()
#
X = tf.placeholder("float")
Y = tf.placeholder("float")
# 模型参数
W = tf.Variable(tf.random_normal([1]), name="weight")
b = tf.Variable(tf.zeros([1]), name="bias")
# 前向结构
z = tf.multiply(X, W)+ b
#反向优化
cost =tf.reduce_mean(tf.square(Y - z))
learning_rate = 0.01
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #Gradient descent
# 初始化变量
init = tf.global_variables_initializer()
# 训练参数
training_epochs = 20
display_step = 2
train_X = newdata[:,0]
train_Y = newdata[:,1]
# 启动session
with tf.Session() as sess:
sess.run(init)
# Fit all training data
for epoch in range(training_epochs):
for (x, y) in zip(train_X, train_Y):
sess.run(optimizer, feed_dict={X: x, Y: y})
#显示训练中的详细信息
if epoch % display_step == 0:
loss = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
print ("Epoch:", epoch+1, "cost=", loss,"W=", sess.run(W), "b=", sess.run(b))
if not (loss == "NA" ):
plotdata["batchsize"].append(epoch)
plotdata["loss"].append(loss)
print (" Finished!")
print ("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))
#图形显示
plt.plot(train_X, train_Y, 'ro', label='Original data')
plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
plt.legend()
plt.show()
五、注意的问题和下步工作
1、 要注意Tensorflow2.0与Tensorflow1.0的区别
1) import tensorflow.compat.v1 as tf
2) tenserflow 2.0的机关,需要加这两行代码,不然占位符又要报错。
tf.reset_default_graph()
tf.disable_eager_execution()
2、继续学习Tensorflow中定义的模型,开始了解keras。
3、写一个 关于pymysql的增删改操作。