2012-01-23 6 views
1

선형 변수를 여러 변수 (실제로는 2)로 구현하려고합니다. ML- 클래스 스탠포드의 데이터를 사용하고 있습니다. 단일 변수의 경우 제대로 작동합니다. 동일한 코드 이 여러 번 작동해야하지만 그렇지 않습니다. 데이터에여러 변수가있는 선형 회귀 - 파이썬 - 구현 문제

LINK :

http://s3.amazonaws.com/mlclass-resources/exercises/mlclass-ex1.zip

기능 정규화 : 나는 대신 NumPy와/SciPy를 사용하는 코드에서 평균과 표준 편차를 구현 한

''' This is for the regression with multiple variables problem . You have to normalize features before doing anything. Lets get started''' 
from __future__ import division 
import os,sys 
from math import * 

def mean(f,col): 
    #This is to find the mean of a feature 
    sigma = 0 
    count = 0 
    data = open(f,'r') 
    for line in data: 
     points = line.split(",") 
     sigma = sigma + float(points[col].strip("\n")) 
     count+=1 
    data.close() 
    return sigma/count 
def size(f): 
    count = 0 
    data = open(f,'r') 

    for line in data: 
     count +=1 
    data.close() 
    return count 
def standard_dev(f,col): 
    #Calculate the standard_dev . Formula : Sqrt (Sigma (x - x') ** (x-x'))/N) 
    data = open(f,'r') 
    sigma = 0 
    mean = 0 
    if(col==0): 
     mean = mean_area 
    else: 
     mean = mean_bedroom 
    for line in data: 
     points = line.split(",") 
     sigma = sigma + (float(points[col].strip("\n")) - mean) ** 2 
    data.close() 
    return sqrt(sigma/SIZE) 

def substitute(f,fnew): 
    ''' Take the old file. 
     1. Subtract the mean values from each feature 
     2. Scale it by dividing with the SD 
    ''' 
    data = open(f,'r') 
    data_new = open(fnew,'w') 
    for line in data: 
     points = line.split(",") 
     new_area = (float(points[0]) - mean_area)/sd_area 
     new_bedroom = (float(points[1].strip("\n")) - mean_bedroom)/sd_bedroom 
     data_new.write("1,"+str(new_area)+ ","+str(new_bedroom)+","+str(points[2].strip("\n"))+"\n") 
    data.close() 
    data_new.close() 
global mean_area 
global mean_bedroom 
mean_bedroom = mean(sys.argv[1],1) 
mean_area = mean(sys.argv[1],0) 
print 'Mean number of bedrooms',mean_bedroom 
print 'Mean area',mean_area 
global SIZE 
SIZE = size(sys.argv[1]) 
global sd_area 
global sd_bedroom 
sd_area = standard_dev(sys.argv[1],0) 
sd_bedroom=standard_dev(sys.argv[1],1) 
substitute(sys.argv[1],sys.argv[2]) 

. 파일에 값을 저장 한 후 스냅 샷은 다음과 같습니다

X1 X2 X3 COST OF HOUSE

1,0.131415422021,-0.226093367578,399900 
1,-0.509640697591,-0.226093367578,329900 
1,0.507908698618,-0.226093367578,369000 
1,-0.743677058719,-1.5543919021,232000 
1,1.27107074578,1.10220516694,539900 
1,-0.0199450506651,1.10220516694,299900 
1,-0.593588522778,-0.226093367578,314900 
1,-0.729685754521,-0.226093367578,198999 
1,-0.789466781548,-0.226093367578,212000 
1,-0.644465992588,-0.226093367578,242500 

나는 매개 변수를 찾아 그것을 회귀를 실행합니다. 그 코드는 다음과 같습니다 :

''' The plan is to rewrite and this time, calculate cost each time to ensure its reducing. Also make it enough to handle multiple variables ''' 
from __future__ import division 
import os,sys 

def computecost(X,Y,theta): 
    #X is the feature vector, Y is the predicted variable 
    h_theta=calculatehTheta(X,theta) 
    delta = (h_theta - Y) * (h_theta - Y) 
    return (1/194) * delta 



def allCost(f,no_features): 
    theta=[0,0] 
    sigma=0 
    data = open(f,'r') 
    for line in data: 
     X=[] 
     Y=0 
     points=line.split(",") 
     for i in range(no_features): 
      X.append(float(points[i])) 
     Y=float(points[no_features].strip("\n")) 
     sigma=sigma+computecost(X,Y,theta) 
    return sigma 

def calculatehTheta(points,theta): 
    #This takes a file which has (1,feature1,feature2,so ... on) 
    #print 'Points are',points 
    sigma = 0 
    for i in range(len(theta)): 

     sigma = sigma + theta[i] * float(points[i]) 
    return sigma 



def gradient_Descent(f,no_iters,no_features,theta): 
    ''' Calculate (h(x) - y) * xj(i) . And then subtract it from thetaj . Continue for 1500 iterations and you will have your answer''' 


    X=[] 
    Y=0 
    sigma=0 
    alpha=0.01 
    for i in range(no_iters): 
     for j in range(len(theta)): 
      data = open(f,'r') 
      for line in data: 
       points=line.split(",") 
       for i in range(no_features): 
        X.append(float(points[i])) 
       Y=float(points[no_features].strip("\n")) 
       h_theta = calculatehTheta(points,theta) 
       delta = h_theta - Y 
       sigma = sigma + delta * float(points[j]) 
      data.close() 
      theta[j] = theta[j] - (alpha/97) * sigma 

      sigma = 0 
    print theta 

print allCost(sys.argv[1],2) 
print gradient_Descent(sys.argv[1],1500,2,[0,0,0]) 

은 그것은 매개 변수로 다음을 인쇄 :

[-3.8697149722857996e-14, 0.02030369056348706, 0.979706406501678]

이 세 가지가 끔찍하게 잘못 :(정확한 같은 일이 하나의 변수와 함께 작동합니다.

감사합니다!

답변

2

글로벌 변수와는 quadruply 중첩 루프가있다. 나를 걱정 데이터를 여러 번 파일에 읽고 쓰는 일.

데이터가 너무 커서 메모리에 잘 맞지 않습니까?

csv 모듈을 파일 처리에 사용하지 않는 이유는 무엇입니까?

왜 숫자 부분에 Numpy을 사용하지 않으시겠습니까?

는 데이터 항목, 당신은 당신의 데이터를 행 정상화 할 수 있습니다 가정 바퀴

를 재발견하고, 최소 제곱 두 줄에 적합하지 마십시오 언급을

normData = (data-data.mean(axis = 0))/data.std(axis = 0) 
c = numpy.dot(numpy.linalg.pinv(normData),prices) 

답글 원래 포스터에서 :

좋아, 그럼 내가 줄 수있는 유일한 조언은 작은 조각으로, 그래서 무슨 일이 일어나는지 더 쉽게 볼 수 있습니다. 작은 부품을 온전하게 점검하는 것이 더 쉽습니다.

아마도 문제가 아니지만 그 쿼드 러플 루프에서 두 개의 루프에 대한 인덱스로 i을 사용하고 있습니다. 그것은 작은 범위로 잘라 냄으로써 피할 수있는 문제입니다.

나는 명시 적으로 중첩 된 루프를 작성했거나 글로벌 변수를 선언 한 이후로 수년이 지난 것으로 생각합니다.

+0

데이터가 실제로 작습니다. NumPy를 사용하지 않고 처음부터 구현하고 NumPy를 사용하고 싶지 않았습니다. 그러므로. 데이터 항목은 infact 행입니다. 마찬가지로, 파일의 행 – crazyaboutliv

+0

고마워요, 난 그냥 몇 가지 NumPy 배우고 그것을 대신 :) 2 라인은 4 루프에 비해 매우 차갑다 : D 조 – crazyaboutliv