本文的主要内容是感知机的python实现。在阅读程序之前,如果对感知机的原理不了解,可以参考我的上一篇文章:感知机算法原理(PLA原理)及 Python 实现
创建一些用于测试的线性可分数据
机器学习是数据驱动的学科,如果您在网络上很难找到线性可分的数据的话,不妨自己来“捏造一些”。顺便提一下,因为我没有给我的 ubuntu
上的 sublime
添加中文支持,无法输入中文,所以注释使用英文写的。我会在代码中解释。
首先,新建一个名为 pla.py
的文件,将下面的代码添加进去,以导入 numpy
科学计算模块。
from numpy import *
然后,我们来定义一个函数makeLinearSeparableData
以产生我们需要的线性可分的数据。将下面的代码添加到 pla.py
中:
def makeLinearSeparableData(weights, numLines):
''' (list, int) -> array
Return a linear Separable data set.
Randomly generate numLines points on both sides of
the hyperplane weights * x = 0.
Notice: weights and x are vectors.
>>> data = pla.makeLinearSeparableData([2,3],5)
>>> data
array([[ 0.54686091, 3.60017244, 1. ],
[ 2.0201362 , 7.5046425 , 1. ],
[-3.14522458, -7.19333582, -1. ],
[ 9.72172678, -7.99611918, -1. ],
[ 9.68903615, 2.10184495, 1. ]])
>>> data = pla.makeLinearSeparableData([4,3,2],10)
>>> data
array([[ -4.74893955e+00, -5.38593555e+00, 1.22988454e+00, -1.00000000e+00],
[ 4.13768071e-01, -2.64984892e+00, -5.45073234e-03, -1.00000000e+00],
[ -2.17918583e+00, -6.48560310e+00, -3.96546373e+00, -1.00000000e+00],
[ -4.34244286e+00, 4.24327022e+00, -5.32551053e+00, -1.00000000e+00],
[ -2.55826469e+00, 2.65490732e+00, -6.38022703e+00, -1.00000000e+00],
[ -9.08136968e+00, 2.68875119e+00, -9.09804786e+00, -1.00000000e+00],
[ -3.80332893e+00, 7.21070373e+00, -8.70106682e+00, -1.00000000e+00],
[ -6.49790176e+00, -2.34409845e+00, 4.69422613e+00, -1.00000000e+00],
[ -2.57471371e+00, -4.64746879e+00, -2.44909463e+00, -1.00000000e+00],
[ -5.80930468e+00, -9.34624147e+00, 6.54159660e+00, -1.00000000e+00]])
'''
w = array(weights)
numFeatures = len(weights)
dataSet = zeros((numLines, numFeatures + 1))
for i in range(numLines):
x = random.rand(1, numFeatures) * 20 - 10
innerProduct = sum(w * x)
if innerProduct <= 0:
dataSet[i] = append(x, -1)
else:
dataSet[i] = append(x, 1)
return dataSet
代码解释如下:
weights
是一个列表,里面存储的是我们用来产生随机数据的那条直线的法向量。numLines
是一个正整数,表示需要创建多少个数据点。numFeatures
是一个正整数,代表特征的数量dataSet = zeros((numLines, numFeatures + 1))
用于创建一个规模为numLines x (numFeatures + 1)
的数组,且内容全为 0。注意:numFeatures +