晚上在用貝葉斯分析器處理資料時,冒出“Input X must be non-negative”這樣的提示,意思是訓練集的特征向量組成的矩陣必須是非負矩陣,這幾天也剛好在看數值分析的内容,在python上有數值分析的内容,主要是Numpy和SymPy這兩個庫。
資料和子產品導入代碼如下:
import pandas as pd
import numpy as np
from sklearn.naive_bayes import MultinomialNB
data=pd.read_csv('column.2C.csv')
data_x=data[['V1','V2','V3','V4','V5','V6']]
y=data[['V7']]
拟合模型代碼:
clf=MultinomialNB()
clf.fit(data_x,y)
直接報出這樣的錯誤, Input X must be non-negative
檢查矩陣的相關性:
data.corr()
#得到
V1 V2 V3 V4 V5 V6
V1 1.000000 0.629225 0.718142 0.815120 -0.247644 0.639611
V2 0.629225 1.000000 0.434326 0.062655 0.035142 0.399474
V3 0.718142 0.434326 1.000000 0.598453 -0.083829 0.532955
V4 0.815120 0.062655 0.598453 1.000000 -0.344200 0.523602
V5 -0.247644 0.035142 -0.083829 -0.344200 1.000000 -0.029515
V6 0.639611 0.399474 0.532955 0.523602 -0.029515 1.000000
看似也沒有多大問題
那麼我們檢查一下矩陣的條件數
c=np.linalg.cond(data_x,p=None)
print c
49730.566337
非常的不理想,說明存在共線性,上文我們交代了條件數在1附近是理想的,有文獻表明超過15就說明存在共線性。
我們進一步計算行列式
np.linalg.inv(data_x)
得到如下的警告:
Last 2 dimensions of the array must be square
直接用原始資料的組成的矩陣,不是一個方陣,是以會報錯
max(a.shape[-2:]) != min(a.shape[-2:])
我們無法求出原始資料的行列式。
是以也無法求逆 特征值
最後,給出幾個矩陣求解過程中的常用指令
np.linalg.matrix_rank(data_x) #矩陣的秩
np.linalg.inv (data_x)# 求逆矩陣
np.linalg.eigvals(data_x) # 求特征值
np.linalg.eig(data_x) #特征向量
np.linalg.svd(data_x) #singular value decomposition 奇異值分解
附上資料集來源:
http://archive.ics.uci.edu/ml/datasets/Vertebral+Column