首页 > 编程语言 >Python小项目:利用tkinter搭建粗糙集简约算法软件

Python小项目:利用tkinter搭建粗糙集简约算法软件

时间:2023-08-15 18:07:28浏览次数:47  
标签:tkinter Python text self Label 粗糙集 grid page row



文章目录

  • 1前言
  • 2 粗糙集简约算法简述
  • 2.1 基本概念
  • 2.2 算法原理
  • 2.3 应用领域
  • 3 实验详解
  • 3.1 实验数据
  • 3.2 实验说明及过程截图
  • 3.3 实验结果
  • 4 代码详解
  • 5 结语



Python小项目:利用tkinter搭建粗糙集简约算法软件_tkinter

完整项目下载:下载链接

1前言

在本次旅程中,我们将探索一个令人兴奋的主题——“Python小项目:利用tkinter搭建粗糙集简约算法软件”。粗糙集简约算法的理论基础将为我们提供方向,我们将在这个项目中探索如何将这一理论应用于实际情境。

如果你曾为繁琐的数据处理和分析而烦恼,那么这个项目必将为你带来惊喜。通过详细的代码展示和解释,我们将从头开始构建一个粗糙集简约算法软件,让你能够快速而准确地处理数据,发现有价值的信息。

借助Tkinter库,我们不仅将打造出一个功能强大的工具,还将注重用户友好的界面设计,确保每位使用者都能轻松上手。此外,我们将链接到优质的理论参考,以便深入理解粗糙集简约算法的内涵。

通过本文,你将不仅学会如何构建一个实用的算法软件,还将掌握一个有关数据分析领域的有力工具。让我们一起踏上这个精彩的Python之旅,开启一个全新的算法探索之旅!

2 粗糙集简约算法简述

粗糙集简约算法是一种强大的数据分析工具,可以帮助我们从大量信息中挖掘出有价值的模式和关联。在这一章节中,我们将深入探讨粗糙集简约算法的基本概念、原理和应用。

2.1 基本概念

粗糙集理论最早由波兰学者Pawlak提出,它主要关注于不精确和不完整信息的处理。核心思想是基于决策表中的属性间关系,通过逐步删除不必要的属性,实现数据的简化与压缩。

2.2 算法原理

粗糙集简约算法的核心步骤包括:数据预处理、决策属性的划分、依赖关系的计算和属性简约。在数据预处理阶段,我们对数据进行清洗、转换,以保证算法的有效性。决策属性划分阶段将数据根据不同决策属性值划分为子集,以便后续的计算。依赖关系的计算通过确定属性之间的依赖程度,找出关键属性。属性简约阶段则通过删除无关属性,实现数据的精简。

2.3 应用领域

粗糙集简约算法在数据挖掘、特征选择、模式识别等领域有着广泛应用。在数据挖掘中,它可以帮助我们从海量数据中找出具有实际意义的特征;在特征选择中,它能够帮助我们提高模型的效率和准确性;在模式识别中,它能够帮助我们挖掘出隐藏在数据背后的规律。

3 实验详解

3.1 实验数据

Python小项目:利用tkinter搭建粗糙集简约算法软件_python_02

3.2 实验说明及过程截图

本次粗糙集简约实验使用的算法为领域粗糙集属性简约算法。本平台名为“5433粗糙集属性简约平台”。以下是平台导入数据界面截图:

Python小项目:利用tkinter搭建粗糙集简约算法软件_算法_03

图1 平台导入数据界面截图(未读入数据时)

Python小项目:利用tkinter搭建粗糙集简约算法软件_python_04

图2 平台导入数据截图2(读入数据时)

点击“开始计算”按钮即可进入计算结果展示界面,计算结果展示界面截图如下:

Python小项目:利用tkinter搭建粗糙集简约算法软件_粗糙集_05

图3 计算结果界面截图

3.3 实验结果

导入样例数据于平台数据库,点击“进行计算”。实验结果截图如下:

Python小项目:利用tkinter搭建粗糙集简约算法软件_粗糙集_06

约减后的属性有:x1、x4、x5、x9

不需要的属性有:x2、x3、x6、x7、x8

4 代码详解

main.py

from tkinter import *
from MainPage import *

root = Tk()
root.title('5433粗糙集属性简约平台')
MainPage(root)
root.mainloop()

mainPage.py

from tkinter import *
from data_input import data_input


class MainPage(object):
    def __init__(self, master=None):
        self.root = master  # 定义内部变量root
        self.root.geometry('%dx%d' % (900, 400))  # 设置窗口大小
        self.createPage()

    def createPage(self):
        self.page = Frame(self.root)  # 创建Frame
        self.page.pack()
        Label(self.page, text='欢迎使用5433粗糙集属性简约平台').grid(row=0, columnspan=4, stick=W, pady=10)
        Label(self.page, text='算法思想:').grid(row=1, columnspan=4, stick=W,pady=10)
        Label(self.page, text='前向贪心约简(F2HARNRS)算法的具体策略是:初始化属性约简集合为空集,此时约简集合下的正域为空集,每次选取使正域中对象增加最多的属性加入').grid(
            row=2, columnspan=4, stick=W, pady=10)
        Label(self.page,
              text='到约简集合中,直至正域中的对象不再增加,输出集合。其中,胡玉清等人证明了F2HARNRS算法满足正域单调性,即约简集合中新增加的属性不会使已').grid(
            row=3, columnspan=4, stick=W, pady=10)
        Label(self.page, text='属于正域的样本变为非正域样本这一性质,在算法的计算过程中,每次仅对还未判定为正域的样本进行正域计算,进一步缩减了算法的时间开销。胡玉').grid(row=4, columnspan=4, stick=W, pady=10)
        Label(self.page, text='清经过实验得到的 0.1~0.3 是δ较好的取值区间,此时δ使得分类器有良好的分类效果。(说明 本程序为了计算方便 使用的是每个都是对象或者属性的下标)').grid(row=5, columnspan=4, stick=W, pady=10)

        # emply line
        Label(self.page, text="").grid(row=6, column=2)
        Button(self.page, text='从本地文件读入数据计算', command = self.jump1 ).grid(row=7, columnspan=4)

    def jump1(self):
        self.page.destroy()
        data_input(self.root)

data_input.py

from tkinter import *
import tkinter.messagebox
import os
from tkinter import filedialog, dialog
from count_page import count_page

class data_input(object):
    def __init__(self, master=None):
        self.root = master  # 定义内部变量root
        self.root.geometry('%dx%d' % (700, 500))  # 设置窗口大小
        self.path_ = ""
        self.path = StringVar()
        

    def selectPath(self): #选择路径
        #选择文件path_接收文件地址
        path_ = filedialog.askopenfilename()
        #通过replace函数替换绝对文件地址中的/来使文件可被程序读取
        self.path_ = path_
        #path设置path_的值
        self.path.set(path_)
        with open(file=self.path_, mode='r+', encoding="utf-8") as file:
            self.file_text = file.read()

    def createPage(self):
        def upload_data():
            if self.path_[-1] != "v":
                tkinter.messagebox.showwarning('警告','请导入csv文件!')
            else:
                text1.insert('insert', self.file_text)
        self.page = Frame(self.root)  # 创建Frame
        self.page.pack()
        Label(self.page, text="").grid(row=0, column=0)
        Label(self.page, text="").grid(row=0, column=1)
        Label(self.page, text="").grid(row=0, column=2)
        Label(self.page, text="").grid(row=0, column=3)
        Label(self.page, text="").grid(row=0, column=4)
        Label(self.page, text="").grid(row=0, column=5)

        input_path = Entry(self.page, textvariable=self.path, width=30)
        input_path.grid(row=2, columnspan=2)
        text1 = Text(self.page, width=90, height=25, bg='AliceBlue')
        text1.grid(row=4, columnspan=5)
        Button(self.page, text="选择路径", command=self.selectPath).grid(row=2, column=2)
        Button(self.page, text="导入数据", command=upload_data).grid(row=2, column=3)

        # emply line
        Label(self.page, text="").grid(row=3, column=2)
        Label(self.page, text="").grid(row=7, column=0)

        def count():
            with open("path.txt", 'w', encoding='utf-8') as f:
                f.write(self.path_)
                f.close()
            if not text1.get("2.0","end"):
                tkinter.messagebox.showwarning('警告', '请导入数据!')
            else:
                self.page.destroy()
                count_page(self.root)

        Button(self.page, text="开始计算", command=count).grid(row=11,columnspan=5)

count_page.py

from tkinter import *
import MainPage
from sklearn import preprocessing
import pandas as pd
import numpy as np
import math
import random
import time

class count_page(object):
    def __init__(self, master=None):
        self.root = master  # 定义内部变量root
        self.root.geometry('%dx%d' % (700, 600)) # 设置窗口大小
        self.createPage()

    def read_path(self):
        with open("path.txt", 'r', encoding='utf-8') as f:
            line = f.read()
            f.close()
        return line

    def createPage(self):
        m_chart1 = pd.read_csv(self.read_path())
        m_chart = np.array(m_chart1.values[:, 1:])

        self.page = Frame(self.root)
        self.page.pack()

        start = time.time()
        m_pro = m_chart1.copy(deep=True)
        m_chart2 = m_chart1.drop(columns=[m_chart1.columns[0]])
        dd1 = m_chart1.where(m_chart2.applymap(type).eq(int))
        dd2 = m_chart1.where(m_chart2.applymap(type).eq(str))
        c_num = dd1.dropna(axis=1, how='all')
        c_str = dd2.dropna(axis=1, how='all')
        c_num1 = np.array(c_num)
        c_str1 = np.array(c_str)
        if not c_str.empty:
            c = np.unique(c_str1)
            for i, j in enumerate(c):
                m_chart[m_chart == j] = i
        col = m_chart1.columns
        m_chart1[col[1:]] = m_chart
        o_l, p_l = m_chart.shape
        o_all = list(np.arange(o_l))
        p_all = list(np.arange(p_l - 1))
        smp = list(o_all)
        red = []
        argu = 0.2

        Label(self.page, text='计算可能需要一些时间,请稍后~计算结果于下方展示').grid(row=0,columnspan = 4, stick=W, pady=10)
        Button(self.page, text="返回主界面", command=self.jump_back).grid(row=0,column=3)
        Label(self.page, text="数据对象个数:{}".format(o_l)).grid(row=1, column=0)
        Label(self.page, text="数据属性个数:{}".format(p_l)).grid(row=1, column=3)

        min_max_scaler = preprocessing.MinMaxScaler()
        X_minMax = min_max_scaler.fit_transform(m_chart)
        m_chart = X_minMax
        m_copy = m_chart1.copy(deep=True)
        m_copy[col[1:]] = m_chart

        def f_distance(o_i, o_j, r):
            d = 0
            for k in r:
                d = d + (m_chart[o_i, k] - m_chart[o_j, k]) ** 2
            d = math.sqrt(d)
            return d

        def get_nei(o_i, r):
            nei = [o_i]
            for i in o_all:
                if i != o_i:
                    if f_distance(o_i, i, r) < argu:
                        nei.append(i)
            return nei


        Label(self.page, text="数值化与归一化处理后的决策表:").grid(row=2, columnspan=5)
        text1 = Text(self.page, width=90, height=4, bg='AliceBlue')
        text1.grid(row=3, columnspan=5)

        text1.insert('insert', m_copy)


        Label(self.page, text="决策属性下的分类:").grid(row=4, columnspan=5)
        text2 = Text(self.page, width=90, height=4, bg='AliceBlue')
        text2.grid(row=5, columnspan=5)

        num_d = np.unique(m_chart[:, -1])
        dd = m_chart[:, -1]
        d_cla = {}
        for j in num_d:
            d_cla[j] = list(np.where(dd == j)[0])
        text2.insert('insert', d_cla)
        pos_end = []
        while smp != []:
            test = list(set(p_all) - set(red))
            dict_len = {}
            dict_n = {}
            for p_i in test:
                pos = []
                for o_i in smp:
                    test1 = red + [p_i]
                    nei = get_nei(o_i, test1)
                    if len(set(dd[nei])) == 1:
                        pos.append(o_i)
                dict_len[p_i] = len(pos)
                dict_n[p_i] = pos
            key_max = max(dict_len, key=dict_len.get)
            if dict_n[key_max] != []:
                red.append(key_max)
                pos_end.extend(dict_n[key_max])
                smp = list(set(smp) - set(dict_n[key_max]))
            else:
                break
        red1 = [i + 1 for i in red]
        unimp = list(set(p_all) - set(red))
        unimp1 = [i + 1 for i in unimp]

        Label(self.page, text="约减后的属性").grid(row=6, columnspan=5)
        text6 = Text(self.page, width=90, height=4, bg='AliceBlue')
        text6.grid(row=7, columnspan=5)
        text6.insert('insert', m_chart1.columns[red1].values)

        Label(self.page, text="不需要的属性:").grid(row=8, columnspan=5)
        text7 = Text(self.page, width=90, height=4, bg='AliceBlue')
        text7.grid(row=9, columnspan=5)
        text7.insert('insert', m_chart1.columns[unimp1].values)

        pos_end1 = [i + 1 for i in pos_end]

        Label(self.page, text="对应正域:").grid(row=10, columnspan=5)
        text4 = Text(self.page, width=90, height=4, bg='AliceBlue')
        text4.grid(row=11, columnspan=5)

        text4.insert('insert', pos_end1)

        Label(self.page, text="运行时间{}".format((time.time()-start))).grid(row=14, columnspan=5)



    def jump_back(self):
        self.page.destroy()
        MainPage.MainPage(self.root)

5 结语

在这篇博文中,我们踏上了一段精彩的Python之旅,探索了如何用Tkinter搭建粗糙集简约算法软件。从粗糙集简约算法的基本概念到实际应用,我们深入探讨了数据分析的魅力和力量。

数据时代的来临,让我们面对海量的信息,而粗糙集简约算法则为我们提供了一把挖掘宝藏的钥匙。它不仅是数据分析的工具,更是一种洞察力,能够帮助我们从繁杂的信息中提取有价值的洞见。

通过本文,你不仅学习了粗糙集简约算法的理论,还亲手搭建了一个功能强大的算法软件。这不仅是知识的传承,更是技能的锻炼,让你能够在实际问题中游刃有余。

让我们不断追求技术的创新,将知识转化为实际应用,创造更美好的未来。无论是解决复杂问题还是发现隐藏在数据中的趋势,粗糙集简约算法都将伴随我们前行,为我们的决策和规划提供有力支持。

在未来的道路上,让我们保持好奇心,继续学习,用技术书写更加精彩的篇章。让我们一同驶向数据智能的未知领域,创造出更多的可能性!

Python小项目:利用tkinter搭建粗糙集简约算法软件_粗糙集_07


标签:tkinter,Python,text,self,Label,粗糙集,grid,page,row
From: https://blog.51cto.com/u_15229916/7091657

相关文章

  • Python小项目:利用 U-net 完成细胞图像分割
    文章目录1前言2实验概述3U-net概述4实验过程及代码5结语完整数据集下载:下载链接1前言在当今数字化时代,图像处理和分析已经成为了科学研究和技术应用领域的关键部分。在生物医学领域,图像分析对于诊断、治疗和疾病研究具有重要意义。本项目将带您深入了解U-net细胞分割技......
  • Python小项目:利用tkinter搭建个人所得税计算器
    文章目录1前言2详细介绍3代码介绍4结语完整项目下载:下载链接1前言在当今数字化时代,个人所得税的计算对于每个人来说都是一个重要而复杂的任务。为了让个人所得税的计算变得更加便捷和直观,本实验采用了Python编程语言,并借助tkinter图形化界面库,搭建了一个实用的个人所得......
  • Python小项目:利用tkinter开发测手速小游戏
    文章目录1简介2代码分模块介绍2.1导入需要的包2.2定义全局变量2.3定义页面组件类2.4定义增加类2.5定义结束类3整体代码展示4结语1简介利用tkinter开发测手速的小游戏,大家10s内可以点击鼠标多少次呢?想测试一下吗?来试试测手速下游戏吧!仅供娱乐!试玩视频:测手速小游戏游......
  • Python小项目:利用tkinter开发AI对战井字棋游戏
    文章目录1前言2代码分模块介绍2.1导入需要的库2.2定义全局变量2.2定义玩家类2.3定义页面类2.4定义页面变化类以及玩家与AI轮流转换下子权限2.5定义判断胜负类2.6定义智能AI下子类3整体代码4结语完整项目下载:下载链接1前言在数字的世界里,古老的棋盘游戏焕发出崭新的活......
  • Python小项目:通过商品条形码查询商品信息
    文章目录1商品条形码2查询商品条形码的目的3实现步骤及代码3.1爬取网站介绍3.2python代码实现3.2.1日志模块3.2.2查询模块3.2.3运行结果4结语完整项目下载:下载链接1商品条形码平日大家会购买许许多多的商品,无论是饮料、食品、药品、日用品等在商品的包装上都会有条形码......
  • 【Python&RS】基于GDAL遥感影像分幅裁剪
    ​    随着科技的进步,遥感影像包含的信息越来越多,存储空间也变得很大,这就导致我们在处理影像时软件会非常的卡。同时目前很火的深度学习也需要对影像分割后制作样本集,所以今天给大家分享下如何使用Python的GDAL库对遥感影像进行分幅裁剪!一、导入需要的三方库   ......
  • python中 函数中的self是什么?
      self可视为类的实例,在使用类创建实例时,我们可能需要强制传入一些参数。所以一般在构造函数_init_里给实例的属性赋值。classStudent(obiect):def__init__(self,name,score):self.name=nameself.score=scoredefprint_score(self):......
  • python语言-----------------身份证信息提前验证
    ##截取身份证信息,判断身份证上面的具体信息:上代码:importredefextract_id_card_info(id_card):#匹配身份证号码并提取出生日期和顺序号match=re.match(r'(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d{1})(\d|X)',id_card)ifmatchisNone:returnNonearea......
  • ​python爬虫——爬取天气预报信息
    在本文中,我们将学习如何使用代理IP爬取天气预报信息。我们将使用Python编写程序,并使用requests和BeautifulSoup库来获取和解析HTML。此外,我们还将使用代理服务器来隐藏我们的IP地址,以避免被目标网站封禁。1.安装必须的库首先,我们需要安装必须的库,包括requests、beauti......
  • Python语言中如何实现字符串拼接?
    在学习和应用Python语言的过程中,我们经常会遇到字符串拼接的问题,其实不管是Python还是其他语言,都把字符串列为最基础和最不可或缺的数据类型,拼接字符串也是必备的一项技能,那么Python语言如何实现这个操作呢?以下是详细的内容:1、加号法使用简单直接,但这种方法效率低......