使用sklearn自带的莺尾花数据集
import pandas as pd import numpy as np from sklearn.datasets import load_iris import matplotlib.pyplot as plt #导入莺尾花数据集 iris = load_iris() df = pd.Dataframe(iris.data,columns=iris.feature_names) df['label']=iris.target df.columns=['sepal length','sepal width','petal length','petal width','label'] df.label.value_counts()
用图查看sepal length 和 sepal width的散点图
#画图查看概括
plt.scatter(df[:50]['sepal length'],df[:50]['sepal width'],label='0')
plt.scatter(df[50:100]['sepal length'],df[50:100]['sepal width'],label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
plt.show()
创建一个data数据集,将需要的数据放入
data= np.array(df.iloc[:100,[0,1,-1]]) #将sepal length,sepal width,target提出来放在data中 X,y = data[:,:-1],data[:,-1] y = np.array([1 if i == 1 else -1 for i in y]) #将0-1改为-1和1
构建模型
#感知机构建
class Model:
#初始化变量
def __init__(self):
self.w = np.ones(len(data[0])-1,dtype=np.float32)
self.b=0
self.l_rate=0.1
#定义下面的函数,用在梯度下降法中
def sign(self,x,w,b):
y=np.dot(x,w)+b #np.dot(x,y)是将x与y两个矩阵进行矩阵乘法运算
return y
#随机梯度下降法,使用wrong_count进行计数,如果没有分类错误的点,那么wrong_count将会等于0,退出while
def fit(self,X_train,y_train):
is_wrong = False
while not is_wrong:
wrong_count = 0
for j in range(len(X_train)):
X = X_train[j]
y = y_train[j]
if (y * self.sign(X_train,self.w,self.b)).all() <=0 : #如果这里没有.all会报错,因为计算机不知道是有小于等于0即可,还是矩阵的任意一个值都需要小于等于0
self.w = self.w +self.l_rate * np.dot(y,X)
self.b = self.b +self.l_rate*y
wrong_count += 1
if wrong_count == 0:
is_wrong = True
return 'Perceptron Model!'
def score(self):
pass
用莺尾花数据拟合
#用model拟合莺尾花数据 perceptron = Model() perceptron.fit(X,y) perceptron.w perceptron.b
代码参考:
https://github.com/wzyonggege/statistical-learning-method



