Python 3:Met" ndarray不是连续的"构建回归函数时

时间:2017-05-17 18:26:05

标签: python-3.x multidimensional-array linear-regression contiguous

此代码用于通过定义函数来计算线性回归" standRegres"由我们自己编译。虽然我们可以通过sklearn或statsmodels中的函数来完成lm,但这里我们只是尝试自己构造函数。但不幸的是,我面对错误而无法征服它。所以,我在这里请求你的帮助。

整个代码在最后一行之前运行没有任何问题。如果我运行最后一行,则会出现错误消息:" ValueError:ndarray不连续"。

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不连续"。

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

1 个答案:

答案 0 :(得分:1)

您的问题源于使用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])

<?php
define('READ_LEN', 4096);

if(files_identical('demo.mp4', 'demo1.mp4'))
    echo 'files identical';
else
    echo 'files not identical';

//   pass two file names
//   returns TRUE if files are the same, FALSE otherwise
function files_identical($fn1, $fn2) {
    if(filetype($fn1) !== filetype($fn2))
        return FALSE;

    if(filesize($fn1) !== filesize($fn2))
        return FALSE;

    if(!$fp1 = fopen($fn1, 'rb'))
        return FALSE;

    if(!$fp2 = fopen($fn2, 'rb')) {
        fclose($fp1);
        return FALSE;
    }

    $same = TRUE;
    while (!feof($fp1) and !feof($fp2))
        if(fread($fp1, READ_LEN) !== fread($fp2, READ_LEN)) {
            $same = FALSE;
            break;
        }

    if(feof($fp1) !== feof($fp2))
        $same = FALSE;

    fclose($fp1);
    fclose($fp2);

    return $same;
}
?>