⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form04.frm

📁 本文档包括了对软件中用到的多元统计分析中判别分析与聚类分析的主要方法(包括距离判别分析,费希尔判别分析,贝叶斯判别分析,逐步判别分析及聚类分析)原理及在本软件中使用的基本方法与设计流程图进行了详尽的阐
💻 FRM
字号:
VERSION 5.00
Begin VB.Form Form04 
   BackColor       =   &H80000013&
   Caption         =   "逐步判别分析"
   ClientHeight    =   6255
   ClientLeft      =   60
   ClientTop       =   465
   ClientWidth     =   10485
   Icon            =   "Form04.frx":0000
   LinkTopic       =   "Form1"
   ScaleHeight     =   6255
   ScaleWidth      =   10485
   StartUpPosition =   3  '窗口缺省
   Begin VB.Frame Frame2 
      BackColor       =   &H80000013&
      Caption         =   "分析结果"
      Height          =   6255
      Left            =   3600
      TabIndex        =   5
      Top             =   0
      Width           =   6735
      Begin VB.PictureBox Picture1 
         AutoRedraw      =   -1  'True
         BackColor       =   &H80000013&
         Height          =   5895
         Left            =   120
         ScaleHeight     =   5835
         ScaleWidth      =   6435
         TabIndex        =   6
         Top             =   240
         Width           =   6495
      End
   End
   Begin VB.Frame Frame1 
      BackColor       =   &H80000013&
      Caption         =   "数据矩阵"
      Height          =   3495
      Left            =   120
      TabIndex        =   3
      Top             =   1200
      Width           =   3375
      Begin VB.TextBox Text4 
         BackColor       =   &H00FFFFFF&
         Height          =   3135
         Left            =   120
         MultiLine       =   -1  'True
         ScrollBars      =   3  'Both
         TabIndex        =   4
         Top             =   240
         Width           =   3135
      End
   End
   Begin VB.TextBox Text1 
      BackColor       =   &H00FFFFFF&
      Height          =   495
      Left            =   120
      TabIndex        =   2
      Top             =   600
      Width           =   3375
   End
   Begin VB.CommandButton Command4 
      BackColor       =   &H00FFFFC0&
      Caption         =   "分  析"
      BeginProperty Font 
         Name            =   "宋体"
         Size            =   12
         Charset         =   134
         Weight          =   400
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   495
      Left            =   1080
      TabIndex        =   0
      Top             =   5280
      UseMaskColor    =   -1  'True
      Width           =   1335
   End
   Begin VB.Label Label1 
      BackColor       =   &H80000013&
      Caption         =   "请按顺序输入各分类的起止样本标号"
      BeginProperty Font 
         Name            =   "宋体"
         Size            =   10.5
         Charset         =   134
         Weight          =   400
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   375
      Left            =   120
      TabIndex        =   1
      Top             =   120
      Width           =   3375
   End
End
Attribute VB_Name = "Form04"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Base 0

Private Sub Command4_Click()

'm = UBound(X, 1) 'x矩阵的行数
'n = UBound(X, 2) 'x矩阵的列数
'Dim k As Integer 'k为用户给出的分类数
'a = Split(Text2.Text, ",")
'k = 0
'    For i = 1 To UBound(a)
'        k = k + i
'    Next i
'k = k / 2

'*****************************************
'以下为验证程序
'*****************************************




Dim A() As String, x1() As String
Const k% = 3
Const m% = 5
Const n% = 23
Dim x!(22, 4), aa!(5)

A = Split(Text1.Text, ",")     '用split只能给字符型数组赋值
x1 = Split(Text4.Text, ",")    '用split赋值的数组下标总是从0开始

For i = 0 To n - 1
    For j = 0 To m - 1
    x(i, j) = Val(x1(j + i * 5))
    Next j
Next i

For i = 0 To UBound(A)
    aa(i) = Val(A(i))
'    Picture1.Print Tab(i * 5); aa(i);
Next i


'*****************************************
'以下为l,w矩阵的计算程序
'*****************************************
Dim sum!(), aver!(), tsum!, taver!()
Dim ll1!(), ww1!(), ll2!(), ww2!(), ll3!(), ww3!(), l!(), w!()
ReDim sum!(k - 1), aver!(m - 1, k - 1), taver!(m - 1)
ReDim ll1!(m - 1, m - 1), ww1!(m - 1, m - 1), ll2!(m - 1, m - 1), ww2!(m - 1, m - 1)
ReDim ll3!(m - 1, m - 1), ww3!(m - 1, m - 1), l!(m - 1, m - 1), w!(m - 1, m - 1)

Dim c As Integer                 'c为控制过程变量

    For t = 0 To m - 1
        tsum = 0                 'tsum是每列的总和
        c = 0
        For k1 = 0 To k - 1
            sum(k1) = 0          'sum(k1)是每列不同分类样本的总和
            aver(t, k1) = 0      'aver(t,k1)是不同分量不同分类的样本均值
                For j = (aa(c) - 1) To (aa(c + 1) - 1)
                    sum(k1) = sum(k1) + x(j, t)
                Next j
                aver(t, k1) = sum(k1) / (aa(c + 1) - aa(c) + 1)
                tsum = tsum + sum(k1)
                c = c + 2
        Next k1
                taver(t) = tsum / n   'taver(t)为不同列样本的均值
    Next t


'    Picture1.Print "这是均值向量输出值"
'    For t = 0 To m - 1
'         For k1 = 0 To k - 1
'         Picture1.Print Tab((k1 Mod 3) * 15); aver(t, k1);
'         Next k1
'    Next t
'
'    For t = 0 To m - 1
'         Picture1.Print Tab((t Mod 5) * 15); taver(t);
'    Next t

   c = 0
   For i1 = 0 To m - 1
       For i2 = 0 To m - 1
           For j = (aa(0) - 1) To (aa(1) - 1)
           ll1(i1, i2) = ll1(i1, i2) + (x(j, i1) - aver(i1, 0)) * (x(j, i2) - aver(i2, 0))
           ww1(i1, i2) = ww1(i1, i2) + (x(j, i1) - taver(i1)) * (x(j, i2) - taver(i2))
           Next j
           c = c + 2
           For j = (aa(2) - 1) To (aa(3) - 1)
           ll2(i1, i2) = ll2(i1, i2) + (x(j, i1) - aver(i1, 1)) * (x(j, i2) - aver(i2, 1))
           ww2(i1, i2) = ww2(i1, i2) + (x(j, i1) - taver(i1)) * (x(j, i2) - taver(i2))
           Next j
           c = c + 2
           For j = (aa(4) - 1) To (aa(5) - 1)
           ll3(i1, i2) = ll3(i1, i2) + (x(j, i1) - aver(i1, 2)) * (x(j, i2) - aver(i2, 2))
           ww3(i1, i2) = ww3(i1, i2) + (x(j, i1) - taver(i1)) * (x(j, i2) - taver(i2))
           Next j
        Next i2
    Next i1

 For i1 = 0 To m - 1
     For i2 = 0 To m - 1
     l(i1, i2) = ll1(i1, i2) + ll2(i1, i2) + ll3(i1, i2)
     w(i1, i2) = ww1(i1, i2) + ww2(i1, i2) + ww3(i1, i2)
     Next i2
Next i1
  Picture1.Print Tab(0); "**********************************************************"
    Picture1.Print Tab(0); "这是l矩阵"
    For m1 = 0 To m - 1
        For n1 = 0 To m - 1
            Picture1.Print Tab((n1 Mod 5) * 15); l(m1, n1);
        Next n1
    Next m1
      Picture1.Print Tab(0); ""
   Picture1.Print Tab(0); "这是w矩阵"
    For m1 = 0 To m - 1
        For n1 = 0 To m - 1
            Picture1.Print Tab((n1 Mod 5) * 15); w(m1, n1);
        Next n1
    Next m1

  
    
'*******************************************

Dim u0!(m - 1), uu0!(m - 1), uuu0!(m - 1), getsma1!, getsma2!, getsma3!, locsma1%, locsma2%, locsma3%
Dim l1!(4, 4), w1!(4, 4), l2!(4, 4), w2!(4, 4), l3!(4, 4), w3!(4, 4), ff!, fff!
Dim lxx!(1, 1), S!(1, 1)
Const f1! = 2.62
Dim cnt%: cnt = 0
Call calu(u0(), l(), w())
Call min(u0(), getsma1, locsma1)
F = ((1 - getsma1) / getsma1) * ((n - k) / (k - 1))
If F > f1 Then
   u0(cnt) = locsma1
   Call change(l(), w(), locsma1, l1(), w1())
   
'   Picture1.Print Tab(0); "这是l1矩阵"
'   For m1 = 0 To m - 1
'        For n1 = 0 To m - 1
'            Picture1.Print Tab((n1 Mod 5) * 15); l1(m1, n1);
'        Next n1
'    Next m1

   Call calu(uu0(), l1(), w1())
   uu0(4) = l1(4, 4) / w1(4, 4)
   getsma2 = uu0(4)
   locsma2 = 4
   ff = ((1 - getsma2) / getsma2) * ((n - k - 1) / (k - 1))
   If ff > f1 Then

        u0(1) = locsma2
        Call change(l1(), w1(), locsma2, l2(), w2())
        
'         Picture1.Print Tab(0); "这是l2矩阵"
'         For m1 = 0 To m - 1
'           For n1 = 0 To m - 1
'            Picture1.Print Tab((n1 Mod 5) * 15); l2(m1, n1);
'          Next n1
'         Next m1

        ul = w2(locsma1, locsma1) / l2(locsma1, locsma1)
        uk = w2(locsma2, locsma2) / l2(locsma2, locsma2)
        If ul < uk And ((1 - uk) / uk) * ((n - k - 1) / (k - 1)) > f1 Then

            lxx(0, 0) = l2(locsma1, locsma1)
            lxx(0, 1) = l2(locsma1, locsma2)
            lxx(1, 0) = l2(locsma2, locsma1)
            lxx(1, 1) = l2(locsma2, locsma2)
            For i = 0 To 1
               For j = 0 To 1
               S(i, j) = (n - k) * lxx(i, j)
               Next j
            Next i

        End If
    End If
End If
'******************************

 Picture1.Print Tab(0); ""
Picture1.Print Tab(0); "输出相关的结果:"
 Picture1.Print Tab(0); ""
Picture1.Print Tab(0); "*******************************************************************************"
Picture1.Print Tab(0); "以下是最终入选的变量指标"
 Picture1.Print Tab(0); ""
Picture1.Print Tab(0); "第"; locsma1 + 1; "个变量和第"; locsma2 + 1; "个变量"
Picture1.Print Tab(0); "*******************************************************************************"
 Picture1.Print Tab(0); ""
Picture1.Print Tab(0); "这是最终的组内离差阵删除未选入变量所对应的主元的行和列剩下的矩阵"
 Picture1.Print Tab(0); ""
For i = 0 To 1
    For j = 0 To 1
    Picture1.Print Tab((j Mod 5) * 15); lxx(i, j);
    Next j
Next i
 Picture1.Print Tab(0); ""
Picture1.Print Tab(0); "这是入选变量的协方差的逆矩阵"
 Picture1.Print Tab(0); ""
For i = 0 To 1
    For j = 0 To 1
    Picture1.Print Tab((j Mod 5) * 15); S(i, j);
    Next j
Next i
End Sub







Sub calu(u() As Single, lo() As Single, wo() As Single)   'calu过程为计算变量的判别能力

    For i = 0 To UBound(lo, 1) - 1
        u(i) = lo(i, i) / wo(i, i)
       'Picture1.Print u(i); "";
    Next i

    'Picture1.Print



End Sub

Sub min(A() As Single, getsma As Single, locsma As Integer)  'min过程为计算一组数值中最小的值并返回,返回位置
    Dim min!, p#

    min = A(0)
    For i = 0 To UBound(A) - 1
     If min > A(i) Then
        min = A(i)
        p = i
     End If
    Next i
    getsma = A(p)
    locsma = p
End Sub


Sub change(lo() As Single, wo() As Single, l As Integer, ll() As Single, ww() As Single) 'l1为变换后的l矩阵,w1为变换后的w矩阵
  Dim i%, j As Integer
    For i = 0 To 4
       For j = 0 To 4
         If i = l And j = l Then
            ll(i, j) = 1 / lo(l, l)
            ww(i, j) = 1 / wo(l, l)
         ElseIf i = l And j <> l Then
            ll(i, j) = lo(i, j) / lo(l, l)
            ww(i, j) = wo(i, j) / wo(l, l)
         ElseIf i <> l And j = l Then
         ll(i, j) = -lo(i, l) / lo(l, l)
         ww(i, j) = -wo(i, l) / wo(l, l)
         ElseIf i <> l And j <> l Then
         ll(i, j) = lo(i, j) - (lo(i, l) * lo(l, j)) / lo(l, l)
         ww(i, j) = wo(i, j) - (wo(i, l) * wo(l, j)) / wo(l, l)
         End If
       Next j
    Next i
End Sub

    
Private Sub Label3_Click()

End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -