首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逻辑回归返回矩阵

逻辑回归返回矩阵
EN

Stack Overflow用户
提问于 2020-09-28 12:53:33
回答 1查看 222关注 0票数 0

我用Numpy创建了一个Logistic回归算法。问题是,当我计算它时,权重是一个矩阵而不是向量,所以它不会抛出任何错误,但是当我试图预测一些输入而不是值时,我得到了一个矩阵(输入*权重矩阵)。

我现在的权重应该是一个标量,但不知何故添加一个新的维度修复了我得到的许多错误,如果你能看一下代码并有任何想法,那就太好了。

代码语言:javascript
复制
import pandas as pd
import numpy as np

dataset = pd.read_csv('dataset.csv')
dataset = dataset.dropna(axis=0)

y = np.array(dataset['Survived']).reshape(-1,1)
X = np.array(dataset['Age']).reshape(-1,1)

class LogisticRegression:
    def __init__(self, lr=0.01, num_iter=100000, fit_intercept=False, verbose=True):
        self.lr = lr
        self.num_iter = num_iter
        self.fit_intercept = fit_intercept
        self.verbose = verbose
    
    def add_intercept(self, X):
        intercept = np.ones((X.shape[0], 1))
        return intercept, np.concatenate((intercept, X), axis=1)
    
    def __sigmoid(self, z):
        return 1 / (1 + np.exp(-z))
        
    def __loss(self, h, y):
        return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
    
    def fit(self, X, y):
        if self.fit_intercept:
            _,X = self.add_intercept(X)
        
        # weights initialization
        # Here, using np.zeros(X.shape[1]) will be correct but doesn't seem to work (different shapes)
        self.theta = np.zeros([X.shape[1], X.shape[0]])
        
        for i in range(self.num_iter):
            z = np.dot(X, self.theta)
            h = self.__sigmoid(z)
            gradient = np.dot(X.T, (h - y)) / y.size
            self.theta -= self.lr * gradient
            
            if(self.verbose == True and i % 10000 == 0):
                z = np.dot(X, self.theta)
                h = self.__sigmoid(z)
                print(f'loss: {self.__loss(h, y)} \t')
    
    def predict_prob(self, X):
        if self.fit_intercept:
            _,X = self.add_intercept(X)
    
        return self.__sigmoid(np.dot(X, self.theta))
    
    def predict(self, X, threshold):
        return self.predict_prob(X) >= threshold

model = LogisticRegression(lr=0.1, num_iter=3000)
model.fit(X, y)

pred = model.predict(X[12], y[12])

intercept,_ = model.add_intercept(X)
yhat = intercept + model.theta * X
# yhat is the regression line from the model
EN

回答 1

Stack Overflow用户

发布于 2020-09-28 13:19:49

我运行了你的代码,X, y如下:

代码语言:javascript
复制
X = np.arange(10)
y = 4 * X + np.random.normal(size=X.shape)

它似乎运行得很好(也就是没有错误)。考虑跳过当前正在进行的整形,除非您希望以后处理更高的维度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64096127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档