#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 25 09:56:43 2017
@author: vicky
"""
#导入数值计算库
import numpy as np
from numpy import linalg as la
#导入机器学习linear_model库
from sklearn import linear_model
#导入科学计算库
import pandas as pd
#导入图表库
import matplotlib.pyplot as plt
import math
#输入xtrain,ytrain,xtest
xtrain=xpart;
ytrain=math.log(ypart);
xtest=xall;
#pca
(n,p)=np.shape(xtrain)
Xsta=(xtrain-np.tile(np.mean(xtrain,axis=0),(n,1)))/np.tile(np.std(xtrain,axis=0),(n,1));#标准化样本数据 X
U,D,V=la.svd(Xsta)#SVD分解
D=np.asmatrix(D).T
lam=np.multiply(D,D)/(n-1) #特征根
W=V.T/np.tile(np.sum(abs(V.T),axis=0),(p,1)) #标准化的特征向量
f=lam/sum(lam)#方差贡献率=特征值/所有特征值总和
F=np.cumsum(lam)/sum(lam)#累计方差贡献率=前i个特征值总和/所有特征值总和
Index=np.where(F[0,:]>0.85)#取累计方差贡献达到85%的q个主成分
q=np.array(Index)[1,0]+1 #主成分个数
Xpc=np.dot(xtrain,W) #降维后的xpc矩阵=标准化后的特征向量*原x矩阵
pc=Xpc[:,0:q]#主成分矩阵=降维后x矩阵的前q列
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
l=LinearRegression.fit(pc,ytrain) #回归
b1=l.intercept_#线性回归模型的截距
b2=l.coef_#线性回归模型的斜率
b=np.column_stack((b1,b2))#回归系数
nihedu=l.score(pc,ytrain)#R值
r=l.residues_
#[b, bint,r,rint,stats]=regress(ytrain,[ones(n,1),pc]);#多元线性回归拟合
#nihedu=stats(1)#拟合度r方
#wucha=mean(abs(r)./ytrain)#省人均消费误差
(m,p)=np.shape(xtest)#导入xcity市数据
pcc=np.dot(xtest,W[:,0:q])#xcity主成分矩阵
ytest=np.dot(np.hstack((np.ones((m,1)),pcc)),b)
# wuchacity=mean(abs(ytesttrue-ytest)./yctrue)%市人均消费误差