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

📄 form1.frm

📁 自编支持向量机程序
💻 FRM
字号:
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   9675
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   7305
   LinkTopic       =   "Form1"
   ScaleHeight     =   9675
   ScaleWidth      =   7305
   StartUpPosition =   3  '窗口缺省
   Begin VB.CommandButton Command1 
      Caption         =   "Command1"
      Height          =   495
      Left            =   4680
      TabIndex        =   0
      Top             =   5280
      Width           =   1215
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'''//////支持向量机回归预测说明
'npt为拟合样本总数据,npol为回归系数总数据,npol<=npt,处理
'uu()为输入样本数据,u()为最小二乘法输入数据,preu()为预测样本输入数据
'a()为回归系数

Private Sub Command1_Click()
    npt = 45
    Dim Y(200), SIG(200), A(50), CVM(50, 50)
    Dim u(200, 50), V(50, 50), W(50), uu(200, 50)
    Dim preu(200, 50), prey(50), preuu(200, 50) As Double '定义预测数据
    'PROGRAM D9R4
    'Driver for routine SVDFIT
    Open App.Path & "\1.dat" For Input As #1
   ' Open App.Path & "\11.dat" For Input As #1
     Open App.Path & "\2.dat" For Output As #2
   
    
    SPREAD = 0.02
    npol = 45 '表示回归系数的总数
   
    'Polynomial fi
    IDUM& = -911
    MP = npt '样本数据总数
    NP = npol '回归系数总数
    For i = 1 To npt
    
       Input #1, uu(i, 2), uu(i, 3), uu(i, 4), uu(i, 5), uu(i, 6), uu(i, 7), uu(i, 8), uu(i, 9), uu(i, 10), uu(i, 11), Y(i)
           'Input #1, uu(i, 2), Y(i)

       'Y(I) = Y(I) + SPREAD * GASDEV(IDUM&)
        SIG(i) = SPREAD
       'SIG(i) = 1
        'Print #1, yyy(i), Y(i), (Y(i) - yyy(i))
    Next i
    For i = 1 To 4
           Input #1, preu(i, 2), preu(i, 3), preu(i, 4), preu(i, 5), preu(i, 6), preu(i, 7), preu(i, 8), preu(i, 9), preu(i, 10), preu(i, 11), prey(i)
        'Input #1, preu(i, 2), Y(i)

    Next i
    
    '////求取内积的矩阵运算
    For j = 2 To npol
     For i = 1 To npt
      u(i, 1) = 1#
     u(i, j) = neiji(uu(), j - 1, uu(), i, 11)
   ' Print #2, u(i, 2)
     Next i
    Next j
    


   For i = 1 To npt
   'Print #2, u(i, 1), u(i, 2), u(i, 3), u(i, 4), u(i, 5), u(i, 6), u(i, 7), u(i, 8), u(i, 9), u(i, 10), u(i, 11), Y(i)
   Next i
    
    Call SVDFIT(Y(), SIG(), npt, A(), npol, u(), V(), W(), MP, NP, CHISQ, "FPOLY") 'u()表示最小二乘法系数对应的输入数据
    Call SVDVAR(V(), npol, NP, W(), CVM(), npol)
    '\\\\\数据预测
 For i = 1 To 4
  sum1 = A(1)
  For j = 2 To npol
          
            sum1 = sum1 + A(j) * neiji(uu(), j - 1, preu(), i, 11)
            If i = 4 Then
            'Print #2, neiji(uu(), j - 1, preu(), i, npol)
            End If
          Next j
    Print #2, sum1
 Next i
 
    Print
    Print Tab(5); "Polynomial fit"
    'Print
    For i = 1 To npol
          Print #2, Tab(5); Format$(A(i), "#.##0000")
         Print Format$(Sqr(CVM(i, i)), ".#####0")
    Next i
  Print Tab(5); "Chi-squared  "; Format$(CHISQ, "###.####00")
  Close #2
   Close #1
End Sub
Sub SVDFIT(Y(), SIG(), NDATA, A(), MA, u(), V(), W(), MP, NP, CHISQ, FUNCS$)
    TOL = 0.00001
    Dim B(1000)
    Dim pry(200, 150)
    For i = 1 To NDATA
        
        TMP = 1# / SIG(i)
        For j = 1 To MA
            pry(i, j) = u(i, j)
            u(i, j) = u(i, j) * TMP
        Next j
        B(i) = Y(i) * TMP
    Next i
    Call SVDCMP(u(), NDATA, MA, W(), V())
    WMAX = 0#
    For j = 1 To MA
        If W(j) > WMAX Then WMAX = W(j)
    Next j
    THRESH = TOL * WMAX
    For j = 1 To MA
        If W(j) < THRESH Then W(j) = 0#
    Next j
    Call SVBKSB(u(), W(), V(), NDATA, MA, B(), A())
    CHISQ = 0#
    For i = 1 To NDATA
        
        sum1 = 0#
        For j = 1 To MA
            sum1 = sum1 + A(j) * pry(i, j)
          Next j
        Print #2, sum1
        CHISQ = CHISQ + ((Y(i) - sum1) / SIG(i)) ^ 2
    Next i
End Sub
  
 
Function GASDEV(IDUM&)
    Static ISET, GSET
    If ISET = 0 Then
      Do
        V1 = 2# * RAN1(IDUM&) - 1#
        V2 = 2# * RAN1(IDUM&) - 1#
        R = V1 ^ 2 + V2 ^ 2
      Loop While R >= 1# Or R = 0
      FAC = Sqr(-2# * Log(R) / R)
      GSET = V1 * FAC
      GASDEV = V2 * FAC
      ISET = 1
    Else
      GASDEV = GSET
      ISET = 0
    End If
End Function
        Static Function RAN1(IDUM&)
    Dim R(97)
    M1& = 259200: IA1& = 7141: IC1& = 54773: RM1 = 0.0000038580247
    M2& = 134456: IA2& = 8121: IC2& = 28411: RM2 = 0.0000074373773
    M3& = 243000: IA3& = 4561: IC3& = 51349
    If IDUM& < 0 Or IFF = 0 Then
        IFF = 1
        IX1& = (IC1& - IDUM&) Mod M1&
        IX1& = (IA1& * IX1& + IC1&) Mod M1&
        IX2& = IX1& Mod M2&
        IX1& = (IA1& * IX1& + IC1&) Mod M1&
        IX3& = IX1& Mod M3&
        For j = 1 To 97
            IX1& = (IA1& * IX1& + IC1&) Mod M1&
            IX2& = (IA2& * IX2& + IC2&) Mod M2&
            R(j) = (CSng(IX1&) + CSng(IX2&) * RM2) * RM1
        Next j
        IDUM& = 1
    End If
    IX1& = (IA1& * IX1& + IC1&) Mod M1&
    IX2& = (IA2& * IX2& + IC2&) Mod M2&
    IX3& = (IA3& * IX3& + IC3&) Mod M3&
    j = 1 + Int((97 * IX3&) / M3&)
    If j > 97 Or j < 1 Then Print "Abnormal exit": Exit Function
    RAN1 = R(j)
    R(j) = (CSng(IX1&) + CSng(IX2&) * RM2) * RM1
End Function
   Sub SVDVAR(V(), MA, NP, W(), CVM(), NCVM)
      Dim WTI(200)
      For i = 1 To MA
          WTI(i) = 0#
          If W(i) <> 0# Then WTI(i) = 1# / (W(i) * W(i))
      Next i
      For i = 1 To MA
          For j = 1 To i
              sum1 = 0#
              For k = 1 To MA
                  sum1 = sum1 + V(i, k) * V(j, k) * WTI(k)
              Next k
              CVM(i, j) = sum1
              CVM(j, i) = sum1
          Next j
      Next i
   End Sub
   Sub SVDCMP(A(), M, N, W(), V())
      Dim RV1(200)
      If M < N Then Print "You must augment A with extra zero rows."
      G = 0#
      SCALE1 = 0#
      ANORM = 0#
      For i = 1 To N
          L = i + 1
          RV1(i) = SCALE1 * G
          G = 0#
          S = 0#
          SCALE1 = 0#
          If i <= M Then
              For k = i To M
                  SCALE1 = SCALE1 + Abs(A(k, i))
              Next k
              If SCALE1 <> 0# Then
                  For k = i To M
                      A(k, i) = A(k, i) / SCALE1
                      S = S + A(k, i) * A(k, i)
                  Next k
                  F = A(i, i)
                  G = -Sqr(S) * Sgn(F)
                  H = F * G - S
                  A(i, i) = F - G
                  If i <> N Then
                      For j = L To N
                          S = 0#
                          For k = i To M
                              S = S + A(k, i) * A(k, j)
                          Next k
                          F = S / H
                          For k = i To M
                              A(k, j) = A(k, j) + F * A(k, i)
                          Next k
                      Next j
                  End If
                  For k = i To M
                      A(k, i) = SCALE1 * A(k, i)
                  Next k
              End If
          End If
          W(i) = SCALE1 * G
          G = 0#
          S = 0#
          SCALE1 = 0#
          If i <= M And i <> N Then
              For k = L To N
                  SCALE1 = SCALE1 + Abs(A(i, k))
              Next k
              If SCALE1 <> 0# Then
                  For k = L To N
                      A(i, k) = A(i, k) / SCALE1
                      S = S + A(i, k) * A(i, k)
                  Next k
                  F = A(i, L)
                  G = -Sqr(S) * Sgn(F)
                  H = F * G - S
                  A(i, L) = F - G
                  For k = L To N
                      RV1(k) = A(i, k) / H
                  Next k
                  If i <> M Then
                      For j = L To M
                          S = 0#
                          For k = L To N
                              S = S + A(j, k) * A(i, k)
                          Next k
                          For k = L To N
                              A(j, k) = A(j, k) + S * RV1(k)
                          Next k
                      Next j
                  End If
                  For k = L To N
                      A(i, k) = SCALE1 * A(i, k)
                  Next k
              End If
          End If
          If ANORM > Abs(W(i)) + Abs(RV1(i)) Then
              ANORM = ANORM
          Else
              ANORM = Abs(W(i)) + Abs(RV1(i))
          End If
      Next i
      For i = N To 1 Step -1
          If i < N Then
              If G <> 0# Then
                  For j = L To N
                      V(j, i) = (A(i, j) / A(i, L)) / G
                  Next j
                  For j = L To N
                      S = 0#
                      For k = L To N
                          S = S + A(i, k) * V(k, j)
                      Next k
                      For k = L To N
                          V(k, j) = V(k, j) + S * V(k, i)
                      Next k
                  Next j
              End If
              For j = L To N
                  V(i, j) = 0#
                  V(j, i) = 0#
              Next j
          End If
          V(i, i) = 1#
          G = RV1(i)
          L = i
      Next i
      For i = N To 1 Step -1
          L = i + 1
          G = W(i)
          If i < N Then
              For j = L To N
                  A(i, j) = 0#
              Next j
          End If
          If G <> 0# Then
              G = 1# / G
              If i <> N Then
                  For j = L To N
                      S = 0#
                      For k = L To M
                          S = S + A(k, i) * A(k, j)
                      Next k
                      F = (S / A(i, i)) * G
                      For k = i To M
                          A(k, j) = A(k, j) + F * A(k, i)
                      Next k
                  Next j
              End If
              For j = i To M
                  A(j, i) = A(j, i) * G
              Next j
          Else
              For j = i To M
                  A(j, i) = 0#
              Next j
          End If
          A(i, i) = A(i, i) + 1#
      Next i
      For k = N To 1 Step -1
          For ITS = 1 To 30
              For L = k To 1 Step -1
                  NM = L - 1
                  If Abs(RV1(L)) + ANORM = ANORM Then GoTo 2
                  If Abs(W(NM)) + ANORM = ANORM Then GoTo 1
              Next L
1             C = 0#
              S = 1#
              For i = L To k
                  F = S * RV1(i)
                  If Abs(F) + ANORM <> ANORM Then
                      G = W(i)
                      H = Sqr(F * F + G * G)
                      W(i) = H
                      H = 1# / H
                      C = (G * H)
                      S = -(F * H)
                      For j = 1 To M
                          Y = A(j, NM)
                          Z = A(j, i)
                          A(j, NM) = (Y * C) + (Z * S)
                          A(j, i) = -(Y * S) + (Z * C)
                      Next j
                  End If
              Next i
2             Z = W(k)
              If L = k Then
                  If Z < 0# Then
                      W(k) = -Z
                      For j = 1 To N
                          V(j, k) = -V(j, k)
                      Next j
                  End If
                  GoTo 3
              End If
              If ITS = 30 Then Print "No convergence in 30 iterations"
              X = W(L)
              NM = k - 1
              Y = W(NM)
              G = RV1(NM)
              H = RV1(k)
              F = ((Y - Z) * (Y + Z) + (G - H) * (G + H)) / (2# * H * Y)
              G = Sqr(F * F + 1#)
              F = ((X - Z) * (X + Z) + H * ((Y / (F + Abs(G) * Sgn(F))) - H)) / X
              C = 1#
              S = 1#
              For j = L To NM
                  i = j + 1
                  G = RV1(i)
                  Y = W(i)
                  H = S * G
                  G = G * C
                  Z = Sqr(F * F + H * H)
                  RV1(j) = Z
                  C = F / Z
                  S = H / Z
                  F = (X * C) + (G * S)
                  G = -(X * S) + (G * C)
                  H = Y * S
                  Y = Y * C
                  For NM = 1 To N
                      X = V(NM, j)
                      Z = V(NM, i)
                      V(NM, j) = (X * C) + (Z * S)
                      V(NM, i) = -(X * S) + (Z * C)
                  Next NM
                  Z = Sqr(F * F + H * H)
                  W(j) = Z
                  If Z <> 0# Then
                      Z = 1# / Z
                      C = F * Z
                      S = H * Z
                  End If
                  F = (C * G) + (S * Y)
                  X = -(S * G) + (C * Y)
                  For NM = 1 To M
                      Y = A(NM, j)
                      Z = A(NM, i)
                      A(NM, j) = (Y * C) + (Z * S)
                      A(NM, i) = -(Y * S) + (Z * C)
                  Next NM
              Next j
              RV1(L) = 0#
              RV1(k) = F
              W(k) = X
          Next ITS
3     AAAAA = 1
      Next k
   End Sub
   Sub SVBKSB(u(), W(), V(), M, N, B(), X())
      Dim TMP(200)
      For j = 1 To N
          S = 0#
          If W(j) <> 0# Then
              For i = 1 To M
                  S = S + u(i, j) * B(i)
              Next i
              S = S / W(j)
          End If
          TMP(j) = S
      Next j
      For j = 1 To N
          S = 0#
          For JJ = 1 To N
              S = S + V(j, JJ) * TMP(JJ)
          Next JJ
          X(j) = S
      Next j
   End Sub

'\\\\\\\\\\\\\\\\\\\\\\定义内积函数
Function neiji(ua(), k1, ub(), k2, npol)
Dim i
Sum = 0
For i = 2 To npol
Sum = Sum + (ua(k1, i) * ub(k2, i)) ^ 2
Next i
neiji = ((Sum) + 1) ^ 3#

End Function
   





⌨️ 快捷键说明

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