import numpy as np
import matplotlib.pyplot as plt
class MyPerception:
def __init__(self):
"""
完成对于权值,偏置和学习率的初始化
"""
self.w = None # 权值
self.b = 0 # 偏置
self.l_rate = 1 # 学习率
def fit(self, X_train, y_train):
"""
该函数完成对于感知机算法的实现
:param X_train:
:param y_train:
:return:
"""
self.w = np.zeros(X_train.shape[1]) # shape[0]获得变量的特征数,调用zeros生成零向量赋值给w
i = 0
while i < X_train.shape[0]: # shape[0]代表数据的个数
x = X_train[i] # 获取数据i的值
y = y_train[i] # 获取数据i所对应的标签为正例还是负例
# 判断是否分类错误,如果分类错误则进行调整,dot()返回的是两个数组的点积,如果是一维数组,则得到的是两个数组的内积
if y*(np.dot(self.w, x) + self.b) <= 0:
# 对误分类点进行更新
self.w += self.l_rate * np.dot(y, x)
self.b += self.l_rate * y
draw(X_train, self.w, self.b)
i = 0 # 由于每次更新都需要重新进行点进行判断是否误分类,因此将i置为0
else:
i += 1
def draw(X, w, b):
"""
该函数完成图像的绘制
:param X:
:param w:
:param b:
:return:
"""
X_new = np.array([[0],[6]])
y_new = -b - (w[0] * X_new) / w[1]
print(X_new)
print(y_new)
plt.plot(X[:2,0], X[:2,1], "b*", label="A")
plt.plot(X[2:,0], X[2:,1], "r*", label="B")
plt.plot(X_new, y_new, "b-")
plt.axis([0, 6, 0, 6])
plt.xlabel("x1")
plt.ylabel("x2")
plt.legend()
plt.show()
def main():
X_train = np.array([[3,3], [4,3], [1,1],[1,2],[4,5],[1,6],[4,2]]) # 三个数据点
y_train = np.array([1,1,-1,-1,1,-1,1]) # 各个数据点所对应的标签,是正例还是负例
perception = MyPerception() # 创建MyPerciption对象
perception.fit(X_train, y_train) # 感知机算法调用
print(perception.w)
print(perception.b)
draw(X_train, perception.w, perception.b)
if __name__ == '__main__':
main()
统计学习方法感知机算法Python实现
最新推荐文章于 2020-09-21 21:30:39 发布