统计学习方法——感知机

  1 #!/usr/bin/env python3
  2 # -*- coding: utf-8 -*-
  3 
  4 ' 统计学习方法 —— 感知机 (perceptron) '
  5 '感知机算法具体实现分为两种方式:' \
  6 ' 原始形式 和 对偶形式 '
  7 '梯度下降方法'
  8 ' 初始参数设置: 学习率n, 其值范围为: 0 < n <= 1' \
  9 ' 默认值设置为 : 1 '
 10 
 11 __author__ = 'qfr'
 12 
 13 import matplotlib
 14 import matplotlib.pyplot as plt
 15 import numpy as np
 16 from numpy import *;#导入numpy的库函数
 17 import sys
 18 
 19 class Perceptron(object):
 20     def __init__(self, n=1):
 21         self.__w = 0
 22         self.__b = 0
 23         self.__n = n
 24 
 25     # 感知机学习算法的原始形式
 26     def StudyModelOri(self, dataT, dataY):
 27 
 28         # 取初始值
 29         w = 0
 30         b = 0
 31         num = dataT.shape[0]
 32         tCount  = 0     # 训练结果正确的个数
 33         i = 0
 34         # 计数检测
 35         count1 = 0
 36         count2 = 0
 37         while tCount != num:        # 知道所有的数据都训练正确
 38             # 在训练集中选取数据
 39             x = dataT[i]
 40             y = dataY[i]
 41 
 42             # 用模型检测数据
 43             tem = w * x
 44             tem = y * (np.sum(tem) + b)
 45 
 46             if tem > 0:
 47                 # 正确分类,正确个数加1
 48                 tCount = tCount + 1
 49             else:
 50                 # 误分类, 更新模型, 同时正确计数清零
 51                 w = w + self.__n * y * x
 52                 b = b + self.__n * y
 53                 tCount = 0
 54                 count1 = count1 + 1
 55 
 56             # 继续检测后续数据
 57             i = i + 1
 58             if i == num:
 59                 i = 0
 60             count2 = count2 + 1
 61 
 62         # 保存模型
 63         self.__w = w
 64         self.__b = b
 65         print('all study count: %d, error count: %d', count2, count1)
 66 
 67     # 感知机学习算法的对偶形式
 68     def StudyModelDual(self, dataT, dataY):
 69         a = 0
 70         b = 0
 71         num = dataT.shape[0]
 72         # 计算 Gram 矩阵
 73         G = self.__CalGramMatrix(dataT)
 74 
 75         tCount = 0  # 训练结果正确的个数
 76         i = 0
 77         # 计数检测
 78         count1 = 0
 79         count2 = 0
 80 
 81 
 82 
 83     # 预测新的数据分类
 84     def PredictData(self, x):
 85         tem = self.__w * x
 86         tem = np.sum(tem) + self.__b
 87         if tem > 0:
 88             return 1
 89         else:
 90             return -1
 91 
 92     # 返回训练的参数
 93     def GetModel(self):
 94         return self.__w, self.__b
 95 
 96     # 计算Gram矩阵
 97     def __CalGramMatrix(self, dataT):
 98         num = dataT.shape[0]
 99         G = np.ones((num, num))
100         for i in range(num):
101             x1 = dataT[i]
102             j = i
103             while j < num:
104                 x2 = dataT[j]
105                 tem = np.sum(x1 * x2)
106                 G[i][j] = tem
107                 G[j][i] = tem
108                 j = j + 1
109         return G
110 
111 if __name__=='__main__':
112     fig1 = plt.figure()
113 
114     #  生成原始数据
115     sigma = 1.0
116     # 正类设置
117     numP = 100
118     xp0 = 30
119     xp1 = 50
120     # 负类设置
121     numN = 100
122     xn0 = 20
123     xn1 = 58
124 
125     noise = sigma * np.random.randn(numP, 1)
126     xp_1 = noise + xp0
127     noise = sigma * np.random.randn(numP, 1)
128     xp_2 = noise + xp1
129     yp = np.ones(numP)
130 
131     sigma = 3
132     noise = sigma * np.random.randn(numN, 1)
133     xn_1 = noise + xn0
134     noise = sigma * np.random.randn(numN, 1)
135     xn_2 = noise + xn1
136     yn = -1 * np.ones(numN)
137 
138     plt.plot(xp_1, xp_2, 'r*')
139     plt.plot(xn_1, xn_2, 'b*')
140 
141     # 组成训练数据集
142     Tp = np.insert(xp_1, [1], xp_2, axis=1)
143     Tn = np.insert(xn_1, [1], xn_2, axis=1)
144     T = np.vstack((Tp, Tn))     # 训练数据集
145     Y = np.hstack((yp, yn))  # 标记结果
146 
147     s = Perceptron()
148     s.StudyModelOri(T, Y)
149 
150     # 返回模型
151     w, b = s.GetModel()
152     tt = np.linspace(20, 35, 1000)
153     ttt = -1 * (w[0] * tt + b)/w[1]
154     plt.plot(tt, ttt, 'g-')
155     plt.show()
156     pass

 

posted @ 2020-06-13 17:59  博客园—哆啦A梦  阅读(153)  评论(0)    收藏  举报