2020-06-13-python/numpy/linearRegressionBasic

Record

Posted by Jocelyn on June 13, 2020

2020-06-13-recording.

Note: pycharm安装各种包缓慢,应该manage repositories 换成清华源(https://pypi.tuna.tsinghua.edu.cn/simple/),另外需要多点击刷新按钮

python basic

# -*- coding: UTF-8 -*-
#添加这句话的原因是 python默认的编码方式是ASCII,而ASCII无法支持中文编码,所以要让python的编码方式是UTF-8

#元组(tuples)是python中可以保存数据但是不能替换值的对象,因此,元组不可变,列表是可变的
#创建元组
tuple_x=(3.0,"hello")
print (tuple_x)

#添加元素到元组
tuple_x=tuple_x+(5.6,)
print (tuple_x)

#字典(directories)是包含键值对的python对象,有些类似C++中的map
#创建字典
goku={"name":"Goku",
      "eye_color":"brown"}
#改变键的值
goku["eye_color"]="green"
#添加新的键值对
goku["age"]=24
#字典的长度
len(goku)
print (len(goku))#=3,表示的是有几个键值对

#if语句,有些类似Matlab的语句,但也不同,
# 注意1.在每个条件 if  elif else后面都有:
# 2.注意缩进
x = 4
if x<1:
    score = "low"
elif x<=4:
    score = "medium"
else:
    score = "high"

#循环语句 for循环或者while循环
#for循环,
# 注意1.在for循环语句后面的:
# 2.注意缩进,只要一直都认为在for循环内
# 3.在print上和C++的print有些类似,但是python的print调用了format,另外""中的{0} {1}表示序号
# 4.range(3)表示 0 1 2
x=1
for i in range(3):
    x+=1
    print ("i={0},x={1}".format(i,x))

x=1
for i in [0, 1, 2]:
    x+=1
#while循环
x=3
while x>0:
    x-=1

#函数
#创建函数
def add_two(x):
    x+=2
    return x

#调用函数
# 注意:会有个实参给形参赋值的过程
score=0
score = add_two(x = score)

#类是python面向对象编程的基础部分
#创建类
# 注意1.每个函数后面都有:
# 2.每个函数的参数列表中都有self
# 3.加下划线的函数,是会自动执行的函数,比如__str__会自动去打印类的信息
class Pets(object):
    #类的初始化
    def __init__(self,species,color,name):
        self.species = species
        self.color = color
        self.name = name
    #用于打印
    def __str__(self):
        return "{0} {1} named {2}.".format(self.color,self.species,self.name)
    #实例函数
    def change_name(self,new_name):
        self.name = new_name
#创建类的对象
# 注意 在创建对象的时候,最后可以有,也可以没有
my_dog = Pets(species="dog",color="orange",name="Guniness")
print (my_dog)
print (my_dog.name)
my_dog.change_name(new_name="Charlie")

NumPy Basic

# -*- coding: UTF-8 -*-
# #使用NumPy包进行数值分析,基础知识
import numpy as np
#使得多次生成的随机数相同
np.random.seed(seed=1234)
#标量(scalars)
x = np.array(6)#scalar
print ("x:",x)
print ("x ndim: ",x.ndim)#为0 表示一个标量
print ("x shape: ",x.shape)#表示是NxM的矩阵,表示的是这个维度,结果为:()
print ("x size: ",x.size)#该array中元素的个数
print ("x dtype: ",x.dtype)#表示这个标量的数据类型
#一维数组(array)
x = np.array([1.3,2.2,1.7])
print ("x:",x)
print ("x ndim: ",x.ndim)#为1 表示一个一维数组
print ("x shape: ",x.shape)#结果为:(3,)
print ("x size: ",x.size)#结果为:3
print ("x dtype: ",x.dtype)#表示这个标量的数据类型
#二维数组
x = np.array([[1,2,3],[4,5,6],[7,8,9]])
print ("x:\n",x)
print ("x ndim: ",x.ndim)#为2 表示一个二维数组
print ("x shape: ",x.shape)#结果为:(3,3)
print ("x size: ",x.size)#结果为:9
#三维数组
x = np.array([[[1,2,3],[4,5,6],[7,8,9]]])
print ("x:\n",x)
print ("x ndim: ",x.ndim)#为3 表示一个三维数组
print ("x shape: ",x.shape)#结果为:(1,3,3)
print ("x size: ",x.size)#结果为:9
print ("x dtype: ",x.dtype)#表示这个标量的数据类型

#函数
np.zeros((2,2))#2x2的空矩阵
np.ones((2,2))#2x2的全1矩阵
np.eye((2))#2x2的单位阵
np.random.random((2,2))#2x2的随机矩阵

#索引
x = np.array([1,2,3])
print ("x[0]: ",x[0])
#切片
x = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
x[:,1]#表示第二列
x[0,:]#表示第零行
x[:3,1:3]#表示 0 1 2行,1 2 列 #注意不包含最后一个
print(len(x))#=3
#整数数组索引
rows_to_get = np.arange(len(x))#所以arange(3)应该是给定了一个范围0~2,np.arange(3)得到了一个一维数组,元素的范围从0~2
print (rows_to_get)#[0 1 2]
cols_to_get=np.array([0,2,1])#直接使用[0,2,1]来初始化一个数组
#具体解释:
#x的样子:
#[[1 2 3 4]
# [5 6 7 8]
# [9 10 11 12]]
#rows_to_get:[0 1 2]
#cols_to_get:[0 2 1]
#rows_to_get和cols_to_get结合去看,构成要去找x的(0,0)元素,(1,2)元素,(2,1)元素
#所以呈现到x[rows_to_get,cols_to_get]的结果为:[1 7 10]

#布尔数组索引
x = np.array([[1,2],[3,4],[5,6]])
print ("x:\n",x)
print ("x > 2:\n",x>2)
print ("x[x>2]\n",x[x>2])
#结果为:
#x:
#[[1 2]
# [3 4]
# [5 6]]

#x>2:
#[[False False]
# [True True]
# [True True]]

#又构成了一个一维数组
#x[x>2]:
#[3 4 5 6]

#数学基础
#加减乘除
x = np.array([[1,2],[3,4]],dtype=np.float64)
y = np.array([[1,2],[3,4]],dtype=np.float64)
np.add(x,y)
np.subtract(x,y)
np.multiply(x,y)
#点积
a = np.array([[1,2,3],[4,5,6]],dtype=np.float64)
b = np.array([[7,8],[9,10],[11,12]],dtype=np.float64)
# print (a)
# print (b)
# print (a.shape)
# print (b.shape)

A = np.array([[1,2,3],[4,5,6],[7,8,9]])
B = np.array([[9,8,7],[6,5,4],[3,2,1]])
print (A)
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

print (B)
# [[9 8 7]
#  [6 5 4]
#  [3 2 1]]
C = np.arange(1,10).reshape(3,3)#这个顺序说明,numpy中会按照行优先来排列得到的数组
print (C)
D = np.dot(A,B)#其实为矩阵相乘
print(D)#可以详见图片中的解释
# [[ 30  24  18]
#  [ 84  69  54]
#  [138 114  90]]
E = np.dot(B,A)
print(E)#与D不同  两个矩阵相乘 AxB和 BxA不同

#跨维度求和
x = np.array([[1,2],[3,4]])
np.sum(x)#将所有元素相加
np.sum(x,axis=0)#逐列将元素相加,结果为:[4,6]
np.sum(x,axis=1)#逐行将元素相加,结果为:[3,7]

#转置
x.T

x = np.array([[1,2],[3,4]])
print(len(x))#2,最外层的[]中有几个元素

z = np.array([5,6,7])
print(len(z))#3,最外层的[]中有几个元素

z = np.array([[1,2],[3,4],[5,6],[7,8]])
print(len(z))#4,最外层的[]中有几个元素

z = np.array([[1,2,3,4],[3,4,5,6],[5,6,7,8],[7,8,9,10]])
print(len(z))#4,最外层的[]中有几个元素
#从这里向上,可以看为最外面的[]是个容器,里面是多个元素,每个元素都是用[]将多个值包含起来

z = np.array([[[1,2,3,4,5]]])
print(len(z))#1,最外层的[]中有几个元素
print(z.shape)#(1,1,5)
print (z.ndim)#3

z = np.array([[[1,2,3,4,5],[6,7,8,9]]])#其实这个时候,最外层的[]是多余的
print(len(z))#1,最外层的[]中有几个元素
print(z.shape)#(1,2)
print (z.ndim)#2

z = np.array([[[1,2,3,4,5],[6,7,8,9]],[[1,2,3,4,5],[6,7,8,9]]])#其实这个时候,最外层的[]是多余的
print(len(z))#2,最外层的[]中有几个元素
print(z.shape)#(2,2),
print (z.ndim)#2 这个有点不一样
print(z)#结果如下
# [[list([1, 2, 3, 4, 5]) list([6, 7, 8, 9])]
#  [list([1, 2, 3, 4, 5]) list([6, 7, 8, 9])]]

#关于len() 应该是最外层[]中有多少个元素
#关于shape() 应该找的是最中间,将整个数据进行均分的分布方式
#关于ndim() 排除最后一种list的情况,基本上看最左侧的[的个数,是几就代表ndim是多少

#numpy数组高级知识

#np.tile重复精度
#tile瓷砖的意思,铺瓷砖的感觉
x = np.array([[1,2],[3,4]])
y = np.array([5,6])
addent = np.tile(y,(len(x),1))
#详解可以参考链接:https://www.jianshu.com/p/9519f1984c70

#广播
x = np.array([[1,2],[3,4]])
y = np.array([[5,6],[5,6]])
z = x+y
print (z)

w = np.array([5,6])
s = x+w
print(x)
#z=s,这就是所说的广播,实际过程是将w变成了y的样子,在各个元素逐个相加

#删除维度
x = np.array([[[1,2,1]],[[2,2,3]]])#其实中间有一个括号是多余的
x.shape#(2,1,3)
y = np.squeeze(x,1)#删除维度1
y.shape#(2,3)
print(y)
# [[1 2 1]
#  [2 2 3]]

#添加维度
x = np.array([[1,2,1],[2,2,3]])
x.shape#(2,3)
y = np.expand_dims(x,1)
y.shape#(2,1,3)
print(y)
# [[[1 2 1]]
#
#  [[2 2 3]]]



linearRegressionLearn

# -*- coding: UTF-8 -*-
#线性回归

#数据 创建一些假数据
from argparse import Namespace
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
#参数
args = Namespace(
    seed = 1234,
    data_file = "sample_data.csv",
    num_samples=100,
    train_size = 0.75,
    test_size = 0.25,
    num_epochs = 100,
)
#设置随机种子来保证实验结果的可重复性
np.random.seed(args.seed)

#生成数据
def generate_data(num_samples):
    X = np.array(range(num_samples))
    y = 3.65*X+10
    return X,y
#生成随机数据
X,y = generate_data(args.num_samples)
data = np.vstack([X,y]).T
df = pd.DataFrame(data,columns=['X','y'])
df.head()
#画散点图
plt.title("Generated data")
plt.scatter(x=df["X"],y=df["y"])
plt.show()

#Scikit-learn 实现方法
#LinearRegression类在scikit中使用的是正规方程法来做的拟合
#这时候在scikit-learn中使用的是SGDRegressor类来拟合数据,因为后面会使用到

#调包
from sklearn.linear_model.stochastic_gradient import SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

#划分数据到训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(
    df["X"].values.reshape(-1,1),df["y"],test_size=args.test_size,
    random_state=args.seed
)
print ("X_train:", X_train.shape)
print ("y_train:", y_train.shape)
print ("X_test:", X_test.shape)
print ("y_test:", y_test.shape)