PYTHON

记录

每日dedede。菜鸟一枚 默默记录再学习过程中遇到的问题和学到的方法 希望没有人看的到。

PYTHON

语法记录

  • 取交集 list0 = list(set(list1).intersection(set(list2)))
  • 取并集 list0 = list(set(list1).union(set(list2)))
  • 论文中的log 通常指以2为底 math.log(x,2)
  • 写txt文件:
    f= open(’…/test.txt’, ‘a+’, encoding=‘utf-8’)
    f.write(str(test).‘test’)
  • 写dict文件:
    test_dict = {}
    test_dict[i]=j
    with open(‘data/test_dict.json’, ‘w’) as f: #不转换成ascii json字符串首缩进
    f.write(json.dumps(test_dict, ensure_ascii=False, indent=2))
  • 读dict文件:
    import json
    with open(“data/test_dict.json”, ‘r’) as f:
    test_dict = json.load(f)
  • 遍历dict文件的key
    for i in test_dict:
    print(“key:”,i)
  • 读xlsx文件:
    from openpyxl import load_workbook
    workbook = load_workbook(‘data/test.xlsx’) # 找到需要xlsx文件的位置
    booksheet = workbook.active # 获取当前活跃的sheet,默认是第一个sheet
    rows = booksheet.rows
    i = 0
    for _ in rows:
    i = i+1
    cell_data_1 = booksheet.cell(row=i, column=1).value # 获取第i行1 列的数据

yield函数教程

带yield的函数是一个生成器,而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器并不会从foo函数的开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。
例子:

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))

结果:

starting...
4
********************
res: None
4

1.程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g(相当于一个对象)

2.直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环

3.程序遇到yield关键字,然后把yield想想成return,return了一个4之后,程序停止,并没有执行赋值给res操作,此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print的结果,第二个是return出的结果)是执行print(next(g))的结果,

4.程序执行print("*"20),输出20个

5.又开始执行下面的print(next(g)),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行res的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候res赋值是None,所以接着下面的输出就是res:None,

6.程序会继续在while里执行,又一次碰到yield,这个时候同样return 出4,然后程序停止,print函数输出的4就是这次return出的4.

enumerate() 函数

用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
print(list(enumerate(seasons)))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

print(list(enumerate(seasons, start=1)))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

Pytorch

torch.cat Tensor 拼接

A=torch.ones(2,3)    #2x3的张量(矩阵)                                     
# tensor([[ 1.,  1.,  1.],
#         [ 1.,  1.,  1.]])
B=2*torch.ones(2,3)  #2x3的张量(矩阵)                                    
# tensor([[ 2.,  2.,  2.],
#         [ 2.,  2.,  2.]])
#按维数 0(行)拼接 A 和 B
C=torch.cat((A,B),0# tensor([[ 1.,  1.,  1.],
#          [ 1.,  1.,  1.],
#          [ 2.,  2.,  2.],
#          [ 2.,  2.,  2.]])
#按维数1(列)拼接 A 和 B
C=torch.cat((A,B),1)
tensor([[ 1.,  1.,  1.,  2.,  2.,  2.],
         [ 1.,  1.,  1.,  2.,  2.,  2.]])

t.shape,t.size()

返回Tensor t 的维度

torch.unsqueeze(x,1); torch.squeeze(x,0)

torch.squeeze() 这个函数主要对数据的维度进行压缩,,去掉维数为1的的维度
torch.unsqueeze()这个函数主要是对数据维度进行扩充。给指定位置加上维数为一的维度


.todense() .toarray()

toarray返回一个ndarray; todense返回一个矩阵

一、Numpy

创建数组

运算的所用的数据结构叫做叫做数组,与list相比没有‘,’作为分割符号

import numpy as np
data = np.array([1,2,3,4,5])
print(data)
#二维数组
data_2 = np.array([
		[1,2,3],
		[4,5,6]
	])
print(data_2 )
#全零数组
data_2dim = np.zeros((2,3))
#全一数组
data_3dim = np.ones((1,2,3))
print(data_2dim )
print(data_3dim )
#连续赋值[0 1 2 3 4 5 6 7 8 9]
data_a = np.arange(10)
print(data_a)

读取数据

1.索引:
1维数组:在数组名的后面用中括号[]括号中填写所查询数组的编码。比如:data[1]
n维数组:

  • 用列表表示所查询数的坐标值,如data_2dim[1,0]
  • 第二种:把多维数组看成一位数组套娃,依次取值,如data_2dim[1][0]

2.切片:

  • 对于1维数组:在数组名后加上中括号[],在括号中填写切片的范围,m:n用冒号作为分隔符,表示的意义是m≤index<n,如:data[2:4];
  • 对于n维数组:把多维数组看成一位数组套娃,依次取值,要注意的是,多维数组的切片往往还是多维数组,如果需要得到具体某一个元素,则在切片之后还要进行索引操作。
import numpy as np
data = np.array([0,1,2,3,4,5])
print(data[1]) #1
print(data[2:4]) #[2 3]

data_2dim = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(data_2dim[1,0]) #4
print(data_2dim[1][0]) #4
print(data_2dim[1:4]) #[[4 5 6] [7 8 9 ] [10 11 12]]
print(data_2dim[1:4][1:3][1][2]) #12

ndarray数组的参数

我们在描述一个多维数组的时候,经常会用到两个参数:维度(dimension)和形状(shape)

print(data.ndim)# 维度 2
print(data.shape)# 形状 (343*4

axis关键词表示对于numpy数组(矩阵)中的跨行/跨列计算

  • axis取0的时候,是跨行计算,相当于是压扁矩阵(这里可以想象成把一个圆圆的气球压扁了)
  • axis取1的时候,是跨列计算
np_dat = np.arange(12).reshape(3,4)
print(np_dat)
print(np_dat.sum(axis=0))
print(np_dat.sum(axis=1))
[[ 0  1  2  3]
[ 4  5  6  7]
[ 8  9 10 11]]

[12 15 18 21]
[ 6 22 38]

数组的操作

转置(transposition)和改造(reshape)

  • 转置是把原来的行列互换
  • 改造是把矩阵的长宽变成另外一对数值
import numpy as np
data = np.arange(10)
t_data = data.T #转置
rs_data = data.reshape((2,5))
trs_data = rs_data.T
print(data)
print(t_data)

print(rs_data)
print(trs_data)
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]

[[0 1 2 3 4]
 [5 6 7 8 9]]
[[0 5]
 [1 6]
 [2 7]
 [3 8]
 [4 9]]

数组的运算

1.一元运算
对一列元素进行运算:sqrt_data = np.sqrt(data_list)

2.二元运算
对一列元素和另外一列元素进行二元运算:sum_data = np.add(data1,data2)

3.统计学运算(聚合函数)
对一个数组进行运算:mean_data = np.mean(data)

数据的读取

把数据存放在txt中存储,在python中可以通过np.genfromtxt()方法读取数据然后进行后续的处理

data = np.genfromtxt('sars_data.txt',delimiter='/n')

二、sklearn

带有一些规范化的数据库
内置一些函数可以进行基本的数据分析

数据处理

##数据切分
from sklearn.model_selection import train_test_split
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3) 

特征工程

1.特征选择

方差选择法

#计算各个特征的方差,然后根据阈值,选择方差大于threshold阈值的特征。
from sklearn.feature_selection import VarianceThreshold
VarianceThreshold(threshold=3).fit_transform(iris.data)

卡方检验

#检验特征对标签的相关性,选择其中K个与标签最相关的特征。
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

2.特征提取
文本特征提取:

Sklearn.feature_extraction.text.CountVectorizer(stop_words[])
#stop_words:停用词指的是指定的词不在做为文本特征提取的处理对象

3.特征预处理

归一化

from sklearn.preprocessing import Normalizer
Normalizer().fit_transform(iris.data)

标准化

#将正态分布特征值转化为标准正态分布(需要用到协方差分析进行降维)
from sklearn.preprocessing import StandardScaler
StandardScaler().fit_transform(iris.data)
#(X-X_mean)/X_std 
from sklearn import preprocessing
X_scale = preprocessing.scale(X)

区间缩放

#返回值为缩放到[0, 1]区间的数据)(不涉及距离度量、协方差计算、不符合正太分布的时候)
from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(iris.data)

机器学习算法

1.实例化一个estimator类
2.estimator调用fit()方法,对送入的x_train,y_train值进行训练
3.模型评估:y_predict=estimator.(x_test)
      y_predict==y_test
KNN

import numpy as np
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier() # 引入模型
knn.fit(train_X, train_y) # fit 训练
pred = knn.predict(test_X) # pred 预测步骤
#打印
print(np.array(test_y))
print(np.array(pred))

SVM

from sklearn.svm import SVC
clf = SVC()
clf.fit(train_X, train_y)
print(clf.score(test_X, test_y)) 

决策树

classi=DecisionTreeClassifier()
classi.fit(train_x,train_y)
classi.score(test_x,test_y)

线性回归

from sklearn.linear_model import LogisticRegression
clf = LinearRegression(fit_intercept=True)
clf.fit(train_X, train_y)
print(clf.score(test_X, test_y)) 

逻辑回归

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(solver="liblinear",penalty="l2"C=1.0)
clf.fit(train_X, train_y)
print(clf.score(test_X, test_y)) 

K-means

from sklearn.cluster import KMeans
kmean  = KMeans(n_clusters=2, random_state=0)
kmean..fit(X)

评分函数

交叉验证(cross_validation)
指将原数据集切分成n等分,每一份做一次得分,求得平均值作为当前模型的准确度或者误差。

from sklearn.model_selection import cross_val_score
scores = cross_val_score(knn, X, y, cv=5, scoring="accuracy")
print(scores.mean()) 

降维

主成分分析法(PCA)

from sklearn.decomposition import PCA
#n_components为主成分数目
PCA(n_components=2).fit_transform(iris.data)

线性判别分析法(LDA)

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
#n_components为降维后的维数
LDA(n_components=2).fit_transform(iris.data, iris.target)

参数调优

为KNN选k(1-31)

k_score = []
k = range(1,31)
for n in k:
    knn = KNeighborsClassifier(n_neighbors=n)#引入模型
    scores = cross_val_score(knn, X, y, cv=5, scoring="accuracy") # 交叉验证(分类)
    # loss = -cross_val_score(knn, X, y, cv=5, scoring="mean_squared_error") # 回归
    k_score.append(scores.mean())
plt.plot(k, k_score)
plt.xlabel("Value for KNN")
plt.ylabel("Cross-validation accuracy")
plt.show() 

模型保存

import pickle
with open('save/clf.pickle', 'wb') as f:
    pickle.dump(knn, f)
with open('save/clf.pickle', 'wb') as f:
	knn = pickle.load(f)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值