통계 학습 방법 제2장 예제 2.2 코드 실천, 감지기의 대구 형식의 코드 실현

통계 학습 방법 제2장의 두 번째 예제에 대해 다음과 같은 코드를 설계했다.
(주석 부분은 자신이 틀린 부분의 디버깅 코드이고 작은 백 코드 코드는 약간 마음에 든다)
#-*- coding:utf-8 -*-
import sys
from numpy import *
import os
from compiler.ast import flatten
reload(sys)
sys.setdefaultencoding('utf-8')

#           
def loadDataset():
    dataset=[[3,3],[4,3],[1,1]]
    labels=[1,1,-1]
    return dataset,labels

#  sign  
def function_sign(x):
    if x>=0:return 1
    else:return -1

#  AMat    W   ,  flatten                
def calc_w(mat1,mat2,labels):
    mat2List=flatten(mat2.tolist())
    m,n=mat1.shape
    for i in range(m):
        mat1[i] *= (mat2List[i]*labels[i])
    return sum(mat1,axis=0).T

#          AMat b  
def judge_functon(dataMat,labels,labelsMat,b,m,AMat):
    for i in range(m):
        if (labels[i] * (sum(multiply(dataMat * dataMat[i].T, multiply(AMat, labelsMat))) + b)) <= 0:
        #if (labels[i]*(sum(array(dataMat*dataMat[i].T)*labels*array(AMat.T))+b))<=0:
            return True
    return False
#     
def perceptron(dataset,labels,alpha):
    dataMat=mat(dataset)
    m,n=shape(dataMat)
    aArr=zeros((m,1))
    AMat=mat(aArr);b=0
    w=mat(zeros((n,1)))
    labelsMat=mat(labels).T
    #while ([function_sign(j) for j in array(dataMat * w+b)]) != labels:
    while judge_functon(dataMat,labels,labelsMat,b,m,AMat):
        #print array(dataMat*dataMat[i].T
        for i in range(m):
            #print sum(multiply(dataMat*dataMat[i].T,multiply(AMat,labelsMat))
            if (labels[i]*(sum(multiply(dataMat*dataMat[i].T,multiply(AMat,labelsMat)))+b))<=0:
            #if (labels[i]*(sum(array(dataMat*dataMat[i].T)*labels*array(AMat.T))+b))<=0:
                #print array(dataMat*dataMat[i].T)*labels*array(AMat.T)
                AMat[i] += alpha
                b += alpha*labels[i]
                #print AMat
                #print b
    return AMat,b



dataSet,labels=loadDataset()
dataMat=mat(dataSet);labelsMat=mat(labels)
AMat,b=perceptron(dataSet,labels,1)
print AMat,b
w=mat(calc_w(dataMat,AMat,labels))
print w,'
',b
결과는 다음과 같습니다.
w=  [[1]     [1]]  b=  -3
made by zcl at CUMT

좋은 웹페이지 즐겨찾기