• 使用正弦函数生成一个包含两个正弦周期的数据集(振幅可自行设定),从中均匀采样 20 个 数据样本,对每个样本的目标变量 yi 添加一个随机的扰动值(扰动值不要太大),形成数据 集 D1;(10 分)
时间: 2024-10-19 15:11:57 浏览: 39
在Python中,你可以使用numpy库生成这样的数据集。首先,我们需要导入必要的库并设置一些参数:
```python
import numpy as np
import random
# 设置参数
amplitude = 1.0 # 振幅
frequency = 2 * np.pi / 2 # 正弦周期(选择一个半周期)
number_of_samples = 20
noise_level = 0.1 # 扰动值范围
# 生成两个正弦周期的数据
x = np.linspace(0, 4 * frequency, number_of_samples) # 时间轴,跨度覆盖两个完整周期
y = amplitude * np.sin(x) # 标准正弦波形
# 添加随机扰动
D1 = y + noise_level * np.random.normal(size=y.shape) # 随机扰动
# 确保每个yi都在扰动范围内
D1[D1 < -1] = -1
D1[D1 > 1] = 1
# 输出前5个样本作为示例
print("前5个数据样本:", D1[:5])
```
这个代码会生成一个包含20个样本的数据集`D1`,每个样本都是一个经过随机扰动后的正弦值。
相关问题
使用正弦函数生成一个包含两个正弦周期的数据集(振幅可自行设定),从中均匀采样 20 个 数据样本,对每个样本的目标变量 yi 添加一个随机的扰动值(扰动值不要太大),形成数据 集 D1
首先,我们可以使用Python和numpy库生成这样一个数据集。我们将创建一个函数来完成这个任务:
```python
import numpy as np
import random
def generate_sine_dataset(amplitude=1, frequency=1, num_samples=20, noise_level=0.1):
"""
生成包含两个正弦周期的数据集,添加随机扰动
"""
# 定义基本的正弦波形
t = np.linspace(0, 2 * np.pi, num=num_samples * 2, endpoint=False) # 生成两个完整周期的时间点
base_signal = amplitude * np.sin(frequency * t)
# 添加第二个正弦周期
double_sine = np.concatenate((base_signal, base_signal + np.pi), axis=0)
# 平均切割两个周期,得到所需数量的样本
data_points = double_sine[:num_samples]
# 添加随机扰动
noise = np.random.normal(scale=noise_level, size=data_points.shape)
noisy_data = data_points + noise
return noisy_data
# 示例:生成一个含有20个样本,振幅为2,频率为1,噪声水平为0.1的数据集
D1 = generate_sine_dataset(amplitude=2, frequency=1, num_samples=20, noise_level=0.1)
# 打印数据集前几个样本
print("Data set D1 (first few samples):", D1[:5])
• 使用正弦函数生成一个包含两个正弦周期的数据集(振幅可自行设定),从中均匀采样 20 个数据样本,对每个样本的目标变量 yi 添加一个随机的扰动值(扰动值不要太大),形成数据集 D1
生成一个包含两个正弦周期的数据集可以按照以下步骤操作:
1. **确定参数**:首先,你需要设定正弦函数的振幅(amplitude)、频率(frequency)、相位偏移(phase shift)以及数据集的起始角度(start angle)。假设振幅为A、频率为f、初始角度为θ。
2. **创建基本正弦波**:对于每个时间点t,你可以计算对应的正弦值,公式为 `y = A * sin(2 * π * f * t + θ)`。
3. **设置两个周期**:为了得到两个正弦周期,选择一个合适的间隔(如半个周期length),然后在每个周期内生成一些数据点,比如每隔`length / (2 * n_periods)`。
4. **采样数据**:均匀地从这两个周期之间抽取20个数据样本。例如,你可以将时间范围划分为20份,并取每个区间内的中心点作为数据点。
5. **添加随机扰动**:对于每个采样的yi值,生成一个小于某个阈值(比如正负0.1)的随机数,然后加上这个扰动。这样就得到了带扰动的目标变量yi。
具体实现Python代码示例:
```python
import numpy as np
import matplotlib.pyplot as plt
# 参数设定
A = 1.0 # 振幅
f = 1.0 # 频率
n_periods = 2 # 正弦周期数
time_length = 1 # 总时间长度
扰动范围 = 0.1 # 扰动的最大值
sample_points = 20 # 数据点数量
# 创建时间轴
t = np.linspace(0, time_length, sample_points)
# 计算基础正弦波
base_sine = A * np.sin(2 * np.pi * f * t)
# 两个周期的位置
periods = [i * time_length / n_periods for i in range(n_periods)]
# 在每个周期内采样
data = []
for period_start in periods:
data.extend(base_sine[period_start:period_start + len(t)])
# 添加随机扰动
perturbed_data = data.copy()
np.random.seed(42) # 设置随机种子保证每次结果一致
noise = np.random.uniform(-扰动范围, +扰动_range, size=len(data))
perturbed_data += noise
# 绘制原始数据和扰动后的数据
plt.figure()
plt.plot(t, base_sine, label="Base Sine")
plt.plot(t, perturbed_data, 'o', label="Data with Noise")
plt.legend()
plt.title("Two-Sinusoid Data Set D1")
plt.show()
D1 = list(zip(t, perturbed_data)) # 形成二维数据集
```
阅读全文