感知机(Python实现,简单)

#!/usr/bin/python
#-*-coding:utf-8 -*-
import random
from numpy import *
import numpy as np

def training():
    train_data1 = [[3, 3, 1], [4, 3, 1]]  # 正样本
    train_data2 = [[1, 1, -1]]  # 负样本
    train_datas = train_data1 + train_data2  # 样本集
    leng=len(train_datas[0])
    #选取初值
    w=[0,0]     #权值
    b=0         #偏置
    step=1
    while(judgeErrorPoint(w,b,train_datas)):
        #选取数据(xi,yi)
        ranInt=random.randint(0,2)
        data=train_datas[ranInt]
        xi,yi=selectXiYi(leng,data)
        # print(str(xi)+"----"+str(yi))
        if yi[0]*((calculate(w,xi)+b))<=0:
            w=mat(w)+mat(step*yi[0]*xi)
            b=b+step*yi[0]
    print(w)
    print (b)
    return w,b
#矩阵计算
def calculate(w,xi):
    a1=w
    a1=mat(a1)
    a2=mat(xi).T  #矩阵转置
    a3=a1*a2
    val=a3[0,0]  #把矩阵变为一个数值
    # print (str(val)+"-----val")
    return val

#判断是否有误分类点
def judgeErrorPoint(w,b,train_datas):
    leng=len(train_datas[0])
    judge=False
    for data in train_datas:
        xi,yi=selectXiYi(leng,data)
        if yi[0]*((calculate(w,xi)+b))<=0:
            judge=True
            return judge
    return judge
#把数据源中的xi,yi分开
def selectXiYi(leng,data):
    ranInt=random.randint(0,2)
    # print(ranInt)
    xi=data[:leng-1]
    yi=data[-1:leng]
    return xi,yi

training()

猜你喜欢

转载自blog.csdn.net/qq_18617299/article/details/79113151
今日推荐