感知机
最近在啃《统计学习方法》这本书,准备将自己实现的模型上传到博客进行记录。
- dataClass.py
这个文件主要是用来创建需要的数据集,目前只写了课本上的三个数据
from numpy import *
from numpy import array
class dataCreate():
def __init__(self) -> None:
pass
def getData(self):
dataItems = array([[3, 3], [4, 3], [1, 1]])
flagItems = [1, 1, -1]
return dataItems, flagItems
#还没写,可以使用数据集来分类
def getRandomData():
return -1
- 感知机的主代码,用于训练和输出最后得到的结果
from numpy import *
import numpy
import dataClass
#训练感知机对偶形式
#Datas为数据,Flags为数据对应的样本。
#
def perceptronClassify(Datas,Flags):
b = 0
lenData = len(Datas)
#权重
w = [0] * len(Datas[0])
#-.-
a = [0] * lenData
#计算Gram矩阵
#写完发现矩阵是对称的,可以采用方法优化存储空间
Grams = numpy.full((lenData,lenData), -1, dtype=int)
for i in range(lenData):
for j in range(lenData):
temp = 0
for k in range(len(Datas[i])):
temp += Datas[i][k] * Datas[j][k]
Grams[i][j] = temp
isComplete = False
while(not isComplete):
# 样本分类正确
numTrue = 0
for i in range(lenData):
temp = 0;
#误分条件
for j in range(lenData):
temp = temp + a[j]*Flags[j]*Grams[i][j]
key = Flags[i] * (temp + b)
if(key > 0):
numTrue += 1
elif key <= 0:
a[i] += 1
b = b + Flags[i]
break
if numTrue == lenData:
isComplete = True
break
#求解w,b
for i in range(len(Datas[0])):
for j in range(lenData):
#此处第一次写的时候忘记了flags,求出答案不正确
w[i] += a[j] * Datas[j][i] * Flags[j]
return w,b
data1 = dataClass.dataCreate()
testData,testFlag = data1.getData()
w,b = perceptronClassify(testData,testFlag)
#训练结果与《统计学习方法》上一致
print(w,b)
结果展示
环境为:python3.8.12
编辑器为:VSCode
以上为全部的内容。