最小二乘法,可视化UI界面

news/2024/12/2 15:04:24/

在这里插入图片描述

import tkinter as tk
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题# 函数用于执行最小二乘法线性拟合
def linear_regression():x_values = [float(x) for x in x_entry.get().split()]y_values = [float(y) for y in y_entry.get().split()]A = np.vstack([x_values, np.ones(len(x_values))]).Tm, c = np.linalg.lstsq(A, y_values, rcond=None)[0]# 清空画布ax[0].clear()ax[1].clear()# 绘制数据点ax[0].scatter(x_values, y_values, label='数据点')# 绘制最小二乘法拟合线ax[0].plot(x_values, m * np.array(x_values) + c, 'r', label='自己计算的')ax[0].set_title(f'自己计算的: Y = {m:.5f} * X + {c:.5f}')# 从斜率和截距输入框获取备选直线的参数lines_m = [float(m) for m in m_entry.get().split()]lines_c = [float(c) for c in c_entry.get().split()]# 绘制备选直线for i in range(len(lines_m)):ax[0].plot(x_values, lines_m[i] * np.array(x_values) + lines_c[i], label=f'直线 {i + 1}')# 计算备选直线中最好的拟合直线,得到是哪一条直线最好best_line_index = np.argmin([np.sum(np.square(y_values - (m * np.array(x_values) + c))) for m, c inzip(lines_m, lines_c)])ax[0].set_xlabel('X')ax[0].set_ylabel('Y')ax[0].legend()# 在ax[1]绘制最好的直线ax[1].scatter(x_values, y_values, label='数据点')ax[1].plot(x_values, lines_m[best_line_index] * np.array(x_values) + lines_c[best_line_index], 'r',label=f'直线 {best_line_index + 1}')ax[1].set_title(f'最佳备选线: Y = {lines_m[best_line_index]} * X + {lines_c[best_line_index]},Index: {best_line_index + 1}')ax[1].set_xlabel('X')ax[1].set_ylabel('Y')ax[1].legend()canvas.draw()# 创建Tkinter窗口
root = tk.Tk()
root.title('最小二乘法线性拟合')frame = tk.Frame(root)
frame.pack(padx=10, pady=10)# 创建输入框和标签
x_label = tk.Label(frame, text='输入x值(用空格分隔):')
x_label.pack()
x_entry = tk.Entry(frame)
x_entry.insert(0, '2 4 6 8 10')  # 设置默认值
x_entry.pack()y_label = tk.Label(frame, text='输入y值(用空格分隔):')
y_label.pack()
y_entry = tk.Entry(frame)
y_entry.insert(0, '10.046 20.090 30.155 40.125 50.074')  # 设置默认值
y_entry.pack()m_label = tk.Label(frame, text='输入备选直线的斜率(用空格分隔):')
m_label.pack()
m_entry = tk.Entry(frame)
m_entry.insert(0, '5.0 5.01 4.97 4.95 5.08')  # 设置默认值
m_entry.pack()c_label = tk.Label(frame, text='输入备选直线的截距(用空格分隔):')
c_label.pack()
c_entry = tk.Entry(frame)
c_entry.insert(0, '0.08 0.07 0.12 0.15 0.06')  # 设置默认值
c_entry.pack()# 创建确认按钮
calculate_button = tk.Button(frame, text='确认', command=linear_regression)
calculate_button.pack()# 创建大画布
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
canvas = FigureCanvasTkAgg(fig, master=frame)
canvas.get_tk_widget().pack()
canvas.draw()# 运行Tkinter主循环
root.mainloop()

http://www.ppmy.cn/news/1174152.html

相关文章

mybatis书写

mybatis <select id"selectUserList" resultType"map"> select * from user </select><!--根据主键查询一条--> <select id"selectById" resultType"map" parameterType"java.lang.Integer"> sele…

正点原子嵌入式linux驱动开发——异步通知

上一篇笔记中使用阻塞或者非阻塞的方式来读取驱动中按键值都是应用程序主动读取的&#xff0c;对于非阻塞方式来说还需要应用程序通过poll函数不断的轮询。最好的方式就是驱动程序能主动向应用程序发出通知&#xff0c;报告自己可以访问&#xff0c;然后应用程序再从驱动程序中…

【C#进阶】C#语法中一些常用知识点总结

文章目录 1.三目运算符2.循环控制语句 (for while do…while foreach)3.访问修饰符4.静态方法和非静态方法5.数组、字典和其他集合类型1. 数组&#xff08;Array&#xff09;2. 列表&#xff08;List&#xff09;3. 字典&#xff08;Dictionary&#xff09;4. 队列&#xff08;…

一起学数据结构(12)——归并排序的实现

1. 归并排序原理&#xff1a; 归并排序的大概原理如下图所示&#xff1a; 从图中可以看出&#xff0c;归并排序的整体思路就是把已给数组不断分成左右两个区间&#xff0c;当这个区间中的数据数量到达一定数值时&#xff0c;便返回去进行排序&#xff0c;整体的结构类似二叉树…

SqueezeNet 一维,二维网络复现 pytorch 小白易懂版

SqueezeNet 时隔一年我又开始复现神经网络的经典模型&#xff0c;这次主要复的是轻量级网络全家桶&#xff0c;轻量级神经网络旨在使用更小的参数量&#xff0c;无限的接近大模型的准确率&#xff0c;降低处理时间和运算量&#xff0c;这次要复现的是轻量级网络的非常经典的一…

Cesium Vue(七)— GEOJSON数据展示

1. GeoJSON GeoJSON 是一种用于对各种地理数据结构进行编码的格式。 简而言之&#xff0c;GeoJSON为你提供了一种简单的格式来表示简单的地理特征以及它们的非空间属性。 结构&#xff1a; {"type": "Feature","geometry": {"type"…

对GRUB和initramfs的小探究

竞赛时对操作系统启动过程产生了些疑问&#xff0c;于是问题导向地浅浅探究了下GRUB和initramfs相关机制&#xff0c;相关笔记先放在这里了。 内核启动流程 在传统的BIOS系统中&#xff0c;计算机具体的启动流程如下&#xff1a; 电源启动&#xff1a;当计算机的电源打开时&…

周记之马上要答辩了

“ 要变得温柔和强大&#xff0c;就算哪天突然孤身一人&#xff0c;也能平静地活下去&#xff0c;不至于崩溃。” 10.16 今天提前写完了一篇六级阅读&#xff0c;积累了一些词组&#xff1a; speak out against 公然反对&#xff0c;印象最深刻的就这个&#xff1b; 先了解…