|
|
|
|
# -*- encoding: utf-8 -*-
|
|
|
|
|
"""
|
|
|
|
|
@Author: packy945
|
|
|
|
|
@FileName: data.py
|
|
|
|
|
@DateTime: 2023/5/31 11:42
|
|
|
|
|
@SoftWare: PyCharm
|
|
|
|
|
"""
|
|
|
|
|
import tkinter as tk
|
|
|
|
|
from tkinter import *
|
|
|
|
|
import random
|
|
|
|
|
import numpy as np
|
|
|
|
|
FITT_SAVE = {}
|
|
|
|
|
FITT_LIST = []
|
|
|
|
|
X = [] # 等待拟合的x值
|
|
|
|
|
Y = [] # 等待拟合的y值
|
|
|
|
|
global Canvas2 # 用于显示函数的画布
|
|
|
|
|
Img1 = None # 绘制的dot.png图像
|
|
|
|
|
Img2 = None # 绘制的line.png图像
|
|
|
|
|
Xian_index = 0 # 当前选择的函数编号
|
|
|
|
|
Quadrant = 0 # 当前选择的象限信息0为四象限,1为一象限
|
|
|
|
|
MAXV = 1000 # 最大值
|
|
|
|
|
INDEX = 5 # 拟合函数索引
|
|
|
|
|
Out = '' # 拟合输出信息
|
|
|
|
|
LOW = -MAXV # 坐标轴显示上界
|
|
|
|
|
HIGH = MAXV # 坐标轴显示下界
|
|
|
|
|
MAGNIDICATION = 1.0 # 放大倍数
|
|
|
|
|
|
|
|
|
|
def random_points():
|
|
|
|
|
x=[]
|
|
|
|
|
y=[]
|
|
|
|
|
for i in range(20):
|
|
|
|
|
x_= random.uniform(0, 1000)#生成随机浮点数
|
|
|
|
|
y_= random.uniform(0, 1000)#生成随机浮点数
|
|
|
|
|
x.append(x_) #加入列表
|
|
|
|
|
y.append(y_)
|
|
|
|
|
x=np.array(x) #列表转数组
|
|
|
|
|
y=np.array(y)
|
|
|
|
|
arr = np.array(list(zip(x, y)))# 将两个一维数组拼接成二维数组
|
|
|
|
|
return arr
|
|
|
|
|
|
|
|
|
|
def compute_curveData(num, step, coefficient):#coefficient代表二次函数系数,数组形式
|
|
|
|
|
def quadratic_function(x):#构造二次函数y = a * X^2 + b * X + C
|
|
|
|
|
return coefficient[0] * x ** 2 + coefficient[1] * x + coefficient[2]
|
|
|
|
|
x_values = np.arange(-num, num, step)
|
|
|
|
|
y_values = quadratic_function(x_values)#调用quadratic_function(x)函数得到y值
|
|
|
|
|
curve_data = np.column_stack((x_values, y_values))#将两个一维数组堆叠成二维数组,形成(x,y)的形式
|
|
|
|
|
return curve_data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# #################################拟合优度R^2的计算######################################
|
|
|
|
|
def __sst(y_no_fitting):
|
|
|
|
|
"""
|
|
|
|
|
计算SST(total sum of squares) 总平方和
|
|
|
|
|
:param y_no_predicted: List[int] or array[int] 待拟合的y
|
|
|
|
|
:return: 总平方和SST
|
|
|
|
|
"""
|
|
|
|
|
y_mean = sum(y_no_fitting) / len(y_no_fitting)
|
|
|
|
|
s_list =[(y - y_mean)**2 for y in y_no_fitting]
|
|
|
|
|
sst = sum(s_list)
|
|
|
|
|
return sst
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __ssr(y_fitting, y_no_fitting):
|
|
|
|
|
"""
|
|
|
|
|
计算SSR(regression sum of squares) 回归平方和
|
|
|
|
|
:param y_fitting: List[int] or array[int] 拟合好的y值
|
|
|
|
|
:param y_no_fitting: List[int] or array[int] 待拟合y值
|
|
|
|
|
:return: 回归平方和SSR
|
|
|
|
|
"""
|
|
|
|
|
y_mean = sum(y_no_fitting) / len(y_no_fitting)
|
|
|
|
|
s_list =[(y - y_mean)**2 for y in y_fitting]
|
|
|
|
|
ssr = sum(s_list)
|
|
|
|
|
return ssr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __sse(y_fitting, y_no_fitting):
|
|
|
|
|
"""
|
|
|
|
|
计算SSE(error sum of squares) 残差平方和
|
|
|
|
|
:param y_fitting: List[int] or array[int] 拟合好的y值
|
|
|
|
|
:param y_no_fitting: List[int] or array[int] 待拟合y值
|
|
|
|
|
:return: 残差平方和SSE
|
|
|
|
|
"""
|
|
|
|
|
s_list = [(y_fitting[i] - y_no_fitting[i])**2 for i in range(len(y_fitting))]
|
|
|
|
|
sse = sum(s_list)
|
|
|
|
|
return sse
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def goodness_of_fit(y_fitting, y_no_fitting):
|
|
|
|
|
"""
|
|
|
|
|
计算拟合优度R^2
|
|
|
|
|
:param y_fitting: List[int] or array[int] 拟合好的y值
|
|
|
|
|
:param y_no_fitting: List[int] or array[int] 待拟合y值
|
|
|
|
|
:return: 拟合优度R^2
|
|
|
|
|
"""
|
|
|
|
|
ssr = __ssr(y_fitting, y_no_fitting)
|
|
|
|
|
sst = __sst(y_no_fitting)
|
|
|
|
|
rr = ssr /sst
|
|
|
|
|
return rr
|
|
|
|
|
|
|
|
|
|
def least_sqaure(x,y):
|
|
|
|
|
n = len(x)
|
|
|
|
|
sumx, sumy, sumxy, sumxx = 0, 0, 0, 0
|
|
|
|
|
for i in range(0, n):
|
|
|
|
|
sumx += x[i]
|
|
|
|
|
sumy += y[i]
|
|
|
|
|
sumxx += x[i] * x[i]
|
|
|
|
|
sumxy += x[i] * y[i]
|
|
|
|
|
a = (n * sumxy - sumx * sumy) / (n * sumxx - sumx * sumx)
|
|
|
|
|
b = (sumxx * sumy - sumx * sumxy) / (n * sumxx - sumx * sumx)
|
|
|
|
|
return a, b
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
def gradient_descent(x, y):
|
|
|
|
|
s = time.time()
|
|
|
|
|
x = 10000 * np.random.randn(1) # 产生服从正太分布的一个数(均值=0,方差=1),扩大10000倍
|
|
|
|
|
eta = 0.09
|
|
|
|
|
i = 1
|
|
|
|
|
while True:
|
|
|
|
|
y = x ^ 2 / 2 - 2 * x
|
|
|
|
|
x -= eta * 2 * x
|
|
|
|
|
if y <= 0.0001:
|
|
|
|
|
print('x is %.6f\ny is %.6f\nand steps are %d' % (x, y, i))
|
|
|
|
|
break
|
|
|
|
|
i += 1
|
|
|
|
|
e = time.time()
|
|
|
|
|
print('time is %.4f second' % (e - s))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
random_points()
|
|
|
|
|
pass
|