输出空值,线性回归计算
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'C:\Users\Xpc\Desktop\weixin2222 change40.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
low_hsv = np.array([0, 0, 221])
high_hsv = np.array([180, 30, 255])
mask = cv2.inRange(hsv, lowerb=low_hsv, upperb=high_hsv)
list_y = []
list_x = []
for i in range(len(mask)):
xmax = []
for j in range(len(mask[i])):
if mask[i][j] == 0:
list_x.append(j)
list_y.append(len(mask)-i)
plt.plot(list_x, list_y, 'o', color='r')
plt.show()
x_array=np.array(list_x)
x_array=x_array/400
y_array=np.array(list_y)
y_array=y_array*0.2/400
z40=np.stack((x_array,y_array),axis=0).T
z0=[]
for i in range(0,z40.shape[0],30):
z1=z40[i,:]
z0.append(z1)
z0=np.array(z0)
x_array=z0[:,0]
y_array=z0[:,1]
print(x_array)
print(y_array)
list_x1=[]
for i in range(0,len(x_array)):
list_x1.append(40)
x1_array=np.array(list_x1)
list_x0=[]
for i in range(0,len(x_array)):
list_x0.append(1)
x0=np.array(list_x0)
x1=x_array
x2=x1_array
x3=x1*x2
x4=x1*x1
x5=x2*x2
label40=y_array
z40=np.stack((x0,x1,x2,x3,x4,x5),axis=0).T
rescombine = z40
labels= y_array
data=rescombine
np.seterr(divide='ignore',invalid='ignore')
class LinearRegression:
def __init__(self,data,labels):
self.data = data
self.labels = labels
num_features = len(data[0])
self.theta = np.zeros((num_features,1))
def train(self,alpha,num_iterations = 500):
cost_history = self.gradient_descent(alpha,num_iterations)
return self.theta,cost_history
def gradient_descent(self,alpha,num_iterations):
cost_history= []
for _ in range(num_iterations):
self.gradient_step(alpha)
cost_history.append(self.cost_function(self.data,self.labels))
return cost_history
def gradient_step(self,alpha):
num_examples = data.shape[0]
prediction = LinearRegression.hypothesis(self.data,self.theta)
delta = prediction - self.labels
theta = self.theta
theta = theta - alpha*(1/num_examples)*(np.dot(delta.T,self.data)).T
self.theta = theta
def cost_function(self,data,labels):
self.m = len(labels)
delta = LinearRegression.hypothesis(data,self.theta) - labels
cost = (1/2)*np.dot(delta.T,delta)/self.m
return cost[0][0]
def hypothesis(data,theta):
predictions = np.dot(data,theta)
return predictions
x_train = rescombine
y_train = labels
num_iterations = 500
learning_rate = 0.01
linear_regression = LinearRegression(x_train, y_train)
(theta, cost_history) = linear_regression.train(learning_rate, num_iterations)
print (theta, cost_history)
print(len( cost_history))
[0.3025 0.315 0.3275 0.3425 0.36 0.365 0.3775 0.395 0.41 0.4325
0.4475 0.46 0.4825 0.4925 0.5075 0.52 0.5375 0.5625 0.995 0.5825
0.9825 0.6 0.945 0.95 0.955 0.9525 0.63 0.6475 0.6475 0.655
0.8975 0.86 0.8125 0.685 0.805 0.71 0.785 0.7475 0.8225]
[0.1365 0.1305 0.125 0.121 0.1175 0.114 0.111 0.1065 0.103 0.0985
0.0945 0.092 0.0895 0.087 0.0845 0.082 0.0795 0.0775 0.0755 0.074
0.0735 0.0725 0.072 0.0715 0.071 0.0705 0.0695 0.069 0.0685 0.068
0.068 0.0675 0.067 0.0665 0.0665 0.066 0.066 0.0655 0.0655]
[[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan]
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan]
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan]
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan]
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan]
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan]] [6115546.293053937, 4014534661896851.5, 2.635330971147491e+24, 1.729956249576308e+33, 1.1356253382264945e+42, 7.454783374654096e+50, 4.893673405509658e+59, 3.2124393421296037e+68, 2.1087975579333355e+77, 1.3843147423906104e+86, 9.087298582980243e+94, 5.965333822395535e+103, 3.915928071216269e+112, 2.5706009278759203e+121, 1.687464378870506e+130, 1.1077316588031153e+139, 7.27167603227295e+147, 4.7734730607470265e+156, 3.1335341344346484e+165, 2.0570004369377248e+174, 1.3503126553064964e+183, 8.864092755348704e+191, 5.818810929946509e+200, 3.819743494677929e+209, 2.5074608095693e+218, 1.6460162103256778e+227, 1.080523114983515e+236, 7.093066244971383e+244, 4.656225124468534e+253, 3.0565670277085482e+262, 2.006475577346884e+271, 1.3171457409549063e+280, 8.646369397676056e+288, 5.675886990825303e+297, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]
500
很懵
正常运算
梯度优化的时候训练参数值没发计算,加个数据归一化处理。
我没按你的来,按自己的理解实现了一下,然后分别试了1000、10000、100000轮的效果
import numpy as np
import matplotlib.pyplot as plt
import cv2
class LinearRegression:
def __init__(self,data,labels):
self.data = data
self.labels = labels
self.features = np.zeros((1,self.data.shape[1]))
def train(self,learning_rate, num_iterations):
for i in range(num_iterations):
self.step_gradient(learning_rate)
# loss = self.loss_fuction()
# print(f'第{i}轮loss={loss}, features={self.features}')
return self.features
def step_gradient(self, learning_rate):
N = float(len(self.labels))
err_current = np.sum(self.features*self.data,axis=1) - self.labels
features_gradient = np.array([sum([x**i*err for x,err in zip(self.data[:,i],err_current)])*(2/N) for i in range(self.features.shape[1])])
self.features = self.features - (learning_rate* features_gradient)
def loss_fuction(self):
totalError = sum([(y-(np.sum(self.features*x,axis=1)))**2 for x,y in zip(self.data,self.labels)])
return totalError / float(len(self.labels))
def draw(self,num_iterations):
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = self.data[:,1]
sl = [s[0] for s in sorted(enumerate(x), key=lambda a:a[1])]
y = [sum(x*self.features[0]) for x in self.data]
sort_y = [y[i] for i in sl]
sort_labels = [self.labels[i] for i in sl]
x.sort()
plt.scatter(x,sort_labels,label='source')
plt.plot(x, sort_y,color='r',label='predict')
plt.xlabel('X')
plt.ylabel('Y')
plt.title(str(num_iterations)+'轮')
plt.legend()
plt.show()
if __name__ == '__main__':
img = cv2.imread('line.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
low_hsv = np.array([0, 0, 221])
high_hsv = np.array([180, 30, 255])
mask = cv2.inRange(hsv, lowerb=low_hsv, upperb=high_hsv)
list_y = []
list_x = []
for i in range(0,len(mask),5):
xmax = []
for j in range(0,len(mask[i]),5):
if mask[i][j] == 0:
list_x.append(j)
list_y.append(i)
list_x = [x/100 for x in list_x]
list_y = [y/100 for y in list_y]
list_x = [[1,x,x**2] for x in list_x]
learning_rate = 0.001
num_iterations = 1000
lr = LinearRegression(np.array(list_x),np.array(list_y))
lr.train(learning_rate,num_iterations)
lr.draw(num_iterations)