1

此代码旨在通过定义一个我们自己编译的函数“standRegres”来计算线性回归。虽然我们可以通过sklearn或statsmodels中的函数来做lm,但这里我们只是尝试自己构造函数。但不幸的是,我面对错误并且无法克服它。所以,我在这里请求你的帮助。

整个代码运行没有任何问题,直到最后一行。如果我运行最后一行,则会出现一条错误消息:“ValueError: ndarray is not contiguous”。

import os

import pandas as pd
import numpy as np
import pylab as pl
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris
# load data
iris = load_iris()
# Define a DataFrame
df = pd.DataFrame(iris.data, columns = iris.feature_names)
# take a look
df.head()
#len(df)


# rename the column name 
df.columns = ['sepal_length','sepal_width','petal_length','petal_width']


X = df[['petal_length']]
y = df['petal_width']


from numpy import *
#########################
# Define function to do matrix calculation
def standRegres(xArr,yArr):
    xMat = mat(xArr); yMat = mat(yArr).T
    xTx = xMat.T * xMat
    if linalg.det(xTx) == 0.0:
        print ("this matrix is singular, cannot do inverse!")
        return NA
    else :
        ws = xTx.I * (xMat.T * yMat)
        return ws

# test
x0 = np.ones((150,1))
x0 = pd.DataFrame(x0)
X0 = pd.concat([x0,X],axis  = 1)

# test
standRegres(X0,y)

此代码在最后一行之前运行没有任何问题。如果我运行最后一行,则会出现一条错误消息:“ValueError: ndarray is not contiguous”。

我干了解决它,但不知道如何。你可以帮帮我吗?非常感谢!

4

1 回答 1

1

您的问题源于使用该mat功能。坚持array

为了使用array,您需要使用@符号进行矩阵乘法,而不是*。最后,你有一行写着xTx.I,但该函数没有为通用数组定义,所以我们可以使用numpy.linalg.inv.

def standRegres(xArr,yArr):
    xMat = array(xArr); yMat = array(yArr).T
    xTx = xMat.T @ xMat
    if linalg.det(xTx) == 0.0:
        print ("this matrix is singular, cannot do inverse!")
        return NA
    else :
        ws = linalg.inv(xTx) @ (xMat.T @ yMat)
        return ws

# test
x0 = np.ones((150,1))
x0 = pd.DataFrame(x0)
X0 = pd.concat([x0,X],axis  = 1)

# test
standRegres(X0,y)
# Output: array([-0.36651405,  0.41641913])
于 2017-05-17T18:41:38.037 回答