1

このコードは自分でコンパイルする関数 "standRegres"を定義して線形回帰を計算するように設計されています。私たちはsklearnやstatsモデルの関数でもできるが、ここでは自分で関数を構築しようとする。しかし、残念ながら、私はエラーに直面し、それを克服できません。だから、私はここであなたの援助を求める。Python 3:回帰関数を構築するときに "ndarray is contiguous"と一致しました

コード全体が最後の行まで問題なく実行されます。最後の行を実行すると、 "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が連続していません"というエラーメッセージが表示されます。

私はそれを解決するために乾いているが、どのようにわからない。私たちを手伝ってくれますか?それは非常に感謝しています!

+0

"C連続"とか、 "Fortran連続"とは言いますか? –

+0

@aryamccarthy「連続していない」と言うだけです。なぜそれがCかFortranかどうかは分からなかった。そして、私はまた、いくつかの男が質問をしていたときに、 "Cではない連続"の問題に会った参照してくださいstackoverflow。 –

答えて

0

問題は、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]) 
+0

素晴らしい!どうもありがとうございます。私は今、@ 配列とnumpy.linalg.invの使い方を知っています。そして、申し訳ありませんが私の評判が15より低いのであなたの答えをupvoteする権利がありませんが、私はあなたの助けに感謝します。そして、私はもう1つの質問をすることができますか?この回帰の結果を「行列([ - 0.36651405]、[0.41641913])」のような行列にしたいのですが、どうすればよいですか?ありがとうございました。 –

+0

申し訳ありませんが、私はupvote、それは "評判が15未満の人によって投票が記録されているが、公開されたポストスコアを変更しないでください" –

+0

心配しないで、男。私の評判は今8です。もう1つの質問をしてもう一度答えを受け取ったら、私は投票できます。私はあなたの答えを戻しアップアップすることを約束します。どうもありがとうございます! –

関連する問題