SquareFace Blog


  • 首页

  • 关于

  • 标签

  • 归档

  • 搜索

制作数据集(4)

发表于 2019-06-27 | 分类于 machine learing
字数统计: 603 | 阅读时长 ≈ 2

readcsv_split_trainX_trainY

今天把区分X和Y的函数写出来,并且可以达到需要的功能。
通过往列表插入数据的方式实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from os import walk
import pandas as pd

def readcsv_split_trainX_trainY(path, cycle):
"""
# path: 文件所在目录
# cycle:第几个周期区分X和Y
"""
# 读取文件夹数据
for root, dirs, files in walk(path, topdown=False):
print(files)
num = len(files)
# 创建列表,用于存储x y
x, y = list(), list()
for i in range(num):
newdata = pd.read_csv(path + '/%s' % files[i], header=None, usecols=[1])
newdata = newdata.drop(index=[0])
newdata = newdata.values
x_new = newdata[0:cycle*588, 0]
x_new = x_new.tolist()
for j in range(len(x_new)):
x.append(x_new[j])
y_new = newdata[cycle*588:, 0]
y_new = y_new.tolist()
for j in range(len(y_new)):
y.append(y_new[j])

return x, y

x, y = readcsv_split_trainX_trainY(path='/Users/squareface/Downloads/salt_5880',cycle=5)

print(len(x))
print(len(y))

函数输出:

1
2
3
4
['DK_6_5880.csv', 'DK_7_5880.csv', 'DK_1_5880.csv', 
'DK_5_5880.csv', 'DK_4_5880.csv', 'DK_2_5880.csv', 'DK_3_5880.csv']
20580
20580

LIRB波形

盐刺激前的波形和盐刺激后的波形是有关系的,刺激后的波形是在刺激前的波形基础上变换的。刺激前后的波形好像是有一个方程对应的。

今天老师有说到“参考波”这个名词,a波即参考波。子洋师兄大论文中写到:

1
2
3
4
5
6
7
8
9
本研究提取了 3 个具有代表性的周期波形进行特征提取,
分别是盐胁迫前最后一组完整周期,称为 a 波;
盐胁迫时的第一周期波形,称为 b 波;
盐胁迫 2 小时后的第一组完 整周期,称为 c 波。
一般情况下:
a 波作为该小麦的参考波,
b 波是盐胁迫后的第一个波,作为反映小麦响应短期盐胁迫的波,
c 波作为小麦响应长期盐胁迫的波
因此本文中不同类型小麦 LIRB 在 a 波和 b 波之间跳变差异,均是由盐胁迫导致细胞极化程度变化导致

需要理解一下这个公式,可能有帮助:

\( E = E_1 - E_2 = E_0 - \frac{RT}{nF} \log\alpha_1 - (E_0 - \frac{RT}{nF} \log{\alpha_2}) \)

式中,\(R\)为气体常数,\(T\)为绝对温度,\(n\)为反应中的电子数,\(F\) 为法拉第常数。
\(E1,E2\) 为换盖子前后的接触电势,\(E0\) 为基础电势,\(\alpha_1,\alpha_2\) 为换盖子前后的氯离子活度
离子活度计算公式如下所示,

\(\alpha_i = c_i \times \gamma_i\)

计算中使用的活度因子为:
10mM KCl: \(\gamma_{CI} \approx 0.9\)

300mM NaCl: \(\gamma_{CI} \approx 0.7^{[255]}\)

制作数据集(3)

发表于 2019-06-26 | 分类于 machine learing
字数统计: 215 | 阅读时长 ≈ 1

人工处理数据

今天把植物电信号原始数据人工处理,
一个周期588个数据
人工找出一个周期的起始点,用代码辅助工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# read csv
df = pd.read_csv(inputdir, header=None, usecols=[1])
df = df.drop(index=[0,1])
# split salt stimulation befor
n=3
befor_start = 932
befor_end = befor_start+(n*588)
df_befor = df[befor_start:befor_end]
df_befor = df_befor.astype(float)
df_befor.plot()
df_befor.shape

# split salt stimulation after
n=5
after_start = 3276
after_end = after_start+(n*588)
df_after = df[after_start:after_end]
df_after = df_after.astype(float)
df_after.plot()
df_after.shape


# merge data

DK_1 = df_befor.append(df_after)
DK_1 = DK_1.astype(float)
a = len(DK_1) / 588
print("all data cycle : ", a)
print(DK_1.values)
DK_1.plot()

# print(df_befor.values)

在处理数据的时候发现,发现变成把问题变成一个拟合问题,有点想预测房价。

x1 —-> y1
x2 —-> y2
x3 —-> y3
x4 —-> y4
x5 —-> y5
…..
xn —-> yn
利用这些数据集建立拟合一个神经网络。

思考

刺激前的信号和刺激后的信号有无关系。

制作数据集(2)

发表于 2019-06-25 | 分类于 machine learing
字数统计: 361 | 阅读时长 ≈ 2

调试成功一个函数,可以把ndarray格式数组保存为csv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def save_to_csv(output_dir, data, name_prefix,
header=None, n_parts=10):
"""
numpy.ndarray ----> save to csv
"""
path_format = os.path.join(output_dir, "{}_{:02d}.csv")
filenames = []

for file_idx, row_indices in enumerate(
np.array_split(np.arange(len(data)), n_parts)):
part_csv = path_format.format(name_prefix, file_idx)
filenames.append(part_csv)
with open(part_csv, "wt", encoding="utf-8") as f:
if header is not None:
f.write(header + "\n")
for row_index in row_indices:
f.write(",".join(
[repr(col) for col in data[row_index]]))
f.write('\n')
return filenames

调用函数,使用fetch_california_housing数据集进行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
output_dir = "/Users/squareface/code/generate_csv"
if not os.path.exists(output_dir):
os.mkdir(output_dir)

train_data = np.c_[x_train_scaled, y_train]
valid_data = np.c_[x_valid_scaled, y_valid]
test_data = np.c_[x_test_scaled, y_test]

header_cols = housing.feature_names + ["MidianHouseValue"]
head_str = ",".join(header_cols)

train_filenames = save_to_csv(output_dir, train_data, "train",
head_str, n_parts=20)
valid_filenames = save_to_csv(output_dir, valid_data, "valid",
head_str, n_parts=10)
test_filenames = save_to_csv(output_dir, test_data, "test",
head_str, n_parts=10)

Tensorflow

阅读大牛的code,tf.dataAPI在读取csv文件比较便捷,去翻看下Tensorflow2.0的API文档。

tf读取一个文件夹里所有的csv文件方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# first step: filename ----> filenames
# second step: read file ----> dataset ----> datasets ----> merge
# third step: parse csv
def parse_csv_line(line, n_fields = 9):
defs = [tf.constant(np.nan)] * n_fields
parsed_fields = tf.io.decode_csv(line, record_defaults=defs)
x = tf.stack(parsed_fields[0:-1])
y = tf.stack(parsed_fields[-1:])
return x, y

# parse_csv_line(b'-0.9868720801669367,0.832863080552588,-0.18684708416901633,-0.14888949288707784,-0.4532302419670616,-0.11504995754593579,1.6730974284189664,-0.7465496877362412,1.138',
# n_fields=9)

def csv_reader_dataset(filenames, n_readers=5,
batch_size=32, n_parse_threads=5,
shuffle_buffer_size=10000):
dataset = tf.data.Dataset.list_files(filenames)
dataset = dataset.repeat()
dataset = dataset.interleave(
lambda filename: tf.data.TextLineDataset(filename).skip(1),
cycle_length = n_readers
)
dataset.shuffle(shuffle_buffer_size)
dataset = dataset.map(parse_csv_line,
num_parallel_calls=n_parse_threads)
dataset = dataset.batch(batch_size)
return dataset

train_set = csv_reader_dataset(train_filenames, batch_size=3)
for x_batch, y_batch in train_set.take(2):
print("x:")
pprint.pprint(x_batch)
print("y:")
pprint.pprint(y_batch)

制作数据集

发表于 2019-06-24 | 分类于 machine learing
字数统计: 380 | 阅读时长 ≈ 2

批量处理信号

把trainX放到一个CSV、trainY放到一个CSV

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def read_salt_data(path,name):

"""
this function reads csv in batch
path is the folder where the files are located
name is the files name
"""
file=glob.glob(os.path.join(path, name))
for f in file:
dl=pd.read_excel(f,header=None,usecols=[1])
dl=dl.drop(index=[0,1])
print(dl.values)
# dl_befor = dl[:1550]
# dl_after = dl[1551:]
# print(dl_befor.shape)
# dl_befor.plot()
# # plt.xlabel("time")
# # plt.ylabel("value")
# # plt.grid(True)
# # dl.plot()

path='/Users/squareface/Downloads/salt_data'
name="*.xlsx"
df = read_salt_data(path,name)

遇到问题:

现在可以把一个文件夹里的csv都存储到dl里面,可以把刺激前和刺激后的数据划分,但是无法对在for循环里保存每次读取到的文件

学习代码:

1
2
3
4
5
6
7
8
9
10
list_l = [[1, 3, 3, 5, 4], [11, 7, 15, 13, 9], [4, 2, 7, 9, 3], [15, 11, 12, 6, 11]]
date_range = pd.date_range(start="20180701", periods=4)
df = pd.DataFrame(list_l, index=date_range,
columns=['a', 'b', 'c', 'd', 'e'])
out:
a b c d e
2018-07-01 1 3 3 5 4
2018-07-02 11 7 15 13 9
2018-07-03 4 2 7 9 3
2018-07-04 15 11 12 6 11

这段代码可以把字典保存为CSV文件,并且可以弹出一个可视化界面选择文件保存路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import tkinter as tk
from tkinter import filedialog
from pandas import DataFrame
# 制作字典数据
Cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'],
'Price': [22000,25000,27000,35000]
}
# 字典存为DataFrame格式
df = DataFrame(Cars, columns= ['Brand', 'Price'])


root= tk.Tk()
canvas1 = tk.Canvas(root,
width = 300,
height = 300,
bg = 'lightsteelblue2',
relief = 'raised')
canvas1.pack()

def exportCSV ():
global df
export_file_path = filedialog.asksaveasfilename(defaultextension='.csv')
df.to_csv (export_file_path, index = None, header=True)

saveAsButton_CSV = tk.Button(text='Export CSV',
command=exportCSV,
bg='green',
fg='white',
font=('helvetica', 12, 'bold'))

canvas1.create_window(150, 150, window=saveAsButton_CSV)
root.mainloop()

LSTM预测盐刺激下植物电信号

发表于 2019-06-23
字数统计: 328 | 阅读时长 ≈ 1

LSTM预测盐刺激下植物电信号

数据处理出现问题

创建的模型预测盐刺激后的电信号拟合程度很好。
使用的模型:

1
2
3
4
5
6
7
8
9
model = Sequential()
model.add(LSTM(units=30, input_shape=(4, 1),return_sequences=True))
model.add(Dropout(0.3))
model.add(Activation('relu'))
model.add(LSTM(units=30))
model.add(Dropout(0.3))
model.add(Activation('relu'))
model.add(Dense(units=4))
model.compile(optimizer=Adam(0.01), loss='mse')

但是在检查代码的时候发现数据划分的时候出现问题:trainX和trainY都是盐刺激后的数据。

解决思路

把电信号分为两个部分:

X:刺激前\((x_1,x_2,x_3,…,x_n)\)

Y:刺激后\((y_1,y_2,y_3,…,y_n)\)

一个思路:

X和Y都选取稳定状态下一个周期的波形。每一个样本总共选择6个周期,即X3个、Y3个。

1、 在软件中手动截取DK小麦稳定状态下的波形,刺激前3个周期,刺激后3个周期,保存为DK-*.xlsx
2、 创建数据集,今日思考:X和Y应该如何对应呢?
同一品种的小麦,在稳定状态下的电信号不一样,那x和y应该如何对应起来?

存在问题:

同一品种的小麦采集到的稳定状态下的波形不像,原因未知。后续把数据弄好,先看看训练效果。

1…232425
Square Face

Square Face

少不吃苦是废人,老不吃苦是贵人

121 日志
3 分类
32 标签
GitHub E-Mail YouTube Instagram
© 2020 Square Face | Site words total count: 45.5k
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4