Python 生成二维数据(带噪声)(用于求拟合直线)
public-time:2022-10-06 15:11
import random
import numpy as np
class faker_xy_data:
def __init__(self):
"""
"""
self.__data = []
self.__N = None
self.a = None
self.b = None
self.__x_plus = None
# 设置 直线 y= ax +b
self.__init()
self.x = [i[0] for i in self.__data]
self.y = [i[1] for i in self.__data]
def __init(self):
self.a = random.uniform(1, 1.5)
# 系数 a 的范围 1-2
self.b = random.uniform(0, 20)
# 系数 B 的范围 10- 20
self.__x_plus = 20
# x 的起始点
self.__N = 70
# 生成数据点个数
for i in range(self.__N):
self.next_x()
self.__data.append(self.offset())
def next_x(self):
'''
生成下一个 x的坐标
基本加数 为 1
偏移量(-1,1) 符合正太分布
'''
self.__x_plus += np.random.normal(loc=1)
return self.__x_plus
def real_xy(self):
x = self.__x_plus
y = self.__x_plus * self.a + self.b
return x, y
def offset(self):
"""
对真实的数据点 进行偏移
偏移量符合正态分布
"""
x, y = self.real_xy()
# 生成一个在 直线上的点
x_x = x + np.random.normal(0, scale=5)
y_y = y + np.random.normal(0, scale=5)
# round 保留两位小数
# np.random.normal(0, scale=10) 正态分布 均值0 宽度10 (最大加减10)
return x_x, y_y
测试代码
import matplotlib
matplotlib.use('Qt5Agg')
# 需要安装 pyqt5 pip install PyQt5
import matplotlib.pyplot as plt
from practice1.create_xy_data import faker_xy_data
x1 = faker_xy_data()
print(x1.a, x1.b)
for i in range(len(x1.x)):
print(f"{x1.x[i]} , {x1.y[i]}")
plt.scatter(x1.x, x1.y)
plt.show()
上图数据
a= 1.15456089198593
b= 16.521623291686403
26.37843835753799 , 38.88781131383671
15.926733910180308 , 50.56120825874972
31.759994689486277 , 50.58515277418847
21.18964642825237 , 39.066186431554264
23.458382997937573 , 45.220972977322305
23.24274088029642 , 38.607040909263304
21.66982195979676 , 47.474460778608886
24.54929925839269 , 45.298624167666745
33.21968982027801 , 53.56174687754788
25.72326250512588 , 52.27839379774187
34.33297869139098 , 47.143535057940596
29.565219533379434 , 51.39923174617437
41.82438982735456 , 57.324707924014824
45.0253778174422 , 68.0281616612136
36.73819823918567 , 50.99602741501426
42.181319166874886 , 61.58007342668956
40.32336437134522 , 74.38378183673544
49.45187022099627 , 68.5814777747371
42.884645773580665 , 68.31839210380775
40.38352775811292 , 76.13384920143731
42.39588997686951 , 62.18838176756794
40.76822180326208 , 72.13837472279758
42.90764420174304 , 75.68723750477847
44.7237479076397 , 81.91804155192312
45.097887419008906 , 64.16209132190957
39.55118989661344 , 70.30481580771597
46.81734074958264 , 77.36635169880735
56.00571124554431 , 75.06571931611691
44.238691931406215 , 80.97855130930424
54.762026774494686 , 85.10954871543737
56.394902446512226 , 83.15579856280803
52.31435380083688 , 77.3446807295493
53.86096818591754 , 78.30400268105939
58.33564223740496 , 76.56542569879213
57.11096886379646 , 85.60510474999293
57.66041015440072 , 81.59045015122987
58.58682688282706 , 85.0948846647024
72.87837886238388 , 87.85332108328052
68.45321072716602 , 79.91915243229498
54.166462895760205 , 94.42053420099758
62.91810296055206 , 91.78655711820532
69.88534296366507 , 94.72599279761724
68.00025290682699 , 97.69052299342844
73.40019903160879 , 103.2015814957372
75.71157322009707 , 99.17790450524686
74.04592094776487 , 105.10063938542093
78.21622333666188 , 103.36853763594732
67.10895074913928 , 110.1074106174263
66.15989835536648 , 101.52525148759814
70.08086543173333 , 100.23468304623874
70.44018523369807 , 110.5038111086304
76.62575353091907 , 112.14723529138861
82.34143624082678 , 113.25031413663122
84.05078356678129 , 120.89507705594099
78.1421845198758 , 111.1742906073707
89.93883722429597 , 111.62728309279385
85.13375478389518 , 119.39879170717177
93.19863684625793 , 121.18720495575405
88.73693695428068 , 117.86046657771766
90.63074801724981 , 121.48648089772308
80.3015414542223 , 121.57615709698261
92.47750530792442 , 123.62904997328326
81.15243720545521 , 128.96749675353297
102.91284291647645 , 123.2523634040217
85.98593526137407 , 118.97763602005736
99.74022486247776 , 128.99750101716657
92.74060569796963 , 115.94517925748494
109.32264482823093 , 121.01062505661939
106.37554278319595 , 122.67427714536343
104.54258120696417 , 129.7448194869142