- 一、逻辑回归算法初步理解
- 二、代码实现
- 1.数据集处理
- 2.创建model
- 总结
逻辑回归不是解决回归任务,是为了解决分类任务。通过wx>0和wx<0可以直接判断出样本类别。
二、代码实现 1.数据集处理from math import exp import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split #数据集 def create_data(): 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'] data = np.array(df.iloc[:100, [0,1,-1]]) # print(data) return data[:,:2], data[:,-1] X, y = create_data() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)2.创建model
class Logist_Regression: def __init__(self,max_iter=200,learning_rate=0.01): self.iter=max_iter self.lr=learning_rate #sigmoid函数 def sigmoid(self,x): return 1/(1+exp(-x)) #data_matrix的作用主要事为了添加一列,将b作为参数 def data_matrix(self, X): #data_mat列表:[[1.0, 6.8, 2.8], [1.0, 5.4, 3.4], [1.0, 5.0, 3.4],....] data_mat = [] for d in X: #*d的用法 data_mat.append([1.0, *d]) return data_mat #训练 def fit(self,X,y): data_mat=self.data_matrix(X) #np.zeros(3)为[1.0,1.0,1.0] np.zeros(3,1)为[[1.0],[1.0],[1.0]] self.w=np.zeros((len(data_mat[0]),1),dtype=np.float32) #迭代数 for iter_ in range(self.iter): #每次迭代一个样本 for i in range(len(X)): #计算概率 result=self.sigmoid(np.dot(data_mat[i],self.w)) #损失函数公式的一部分 error=y[i]-result #更新w,加转置是为了符合w的shape(3,1) self.w+=self.lr*error*np.transpose([data_mat[i]]) print("Logistic_Regression(learing_rate={},max_iter={}".format(self.lr,iter_)) #预测 def score(self,x_test,y_test): right=0 x_test=self.data_matrix(x_test) for x,y in zip(x_test,y_test): result=np.dot(x,self.w) #只要z大于0且y=1或者z小于0且y=0,则预测正确 if(result>0 and y==1) or (result<0 and y==0): right+=1 return right/len(x_test) #实例化model model=Logist_Regression() #训练 model.fit(X_train,y_train) #预测得分 print(model.score(X_test,y_test))
代码细节:
由于我们在梯度下降时需要去更新参数,而参数w往往会有很多个比如w=[w1,w2,w3,w4],用向量的方式去把他们储存起来,再去更新好比一个一个更新效率高很多,这也是矩阵并行的一个优势。
函数data_matrix起到的作呕用就是添加一列,这一列就是将1与偏置b相乘得到b,从而更新b。
#data_matrix的作用主要事为了添加一列,将b作为参数 def data_matrix(self, X): #data_mat列表:[[1.0, 6.8, 2.8], [1.0, 5.4, 3.4], [1.0, 5.0, 3.4],....] data_mat = [] for d in X: #*d的用法 data_mat.append([1.0, *d]) return data_mat
注:矩阵的shape(3,1)和(3,)是不同的概念。前者秩rank为2,后者rank为1。
矩阵维度理解
transpose用法:
import numpy as np a=np.array([[1,2,3]]) print(a) print(a.shape) b=np.transpose(a) print(b.shape) print(b)
输出:
[[1 2 3]] (1, 3) (3, 1) [[1] [2] [3]]总结
1.参数与数据进行内积时需要保持维度符合矩阵乘法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)