统计学习方法——感知机
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
记录每天生活的点点滴滴,呵呵呵呵呵呵

浙公网安备 33010602011771号