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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)