Skip to content

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