文章目錄
S
有時pip很慢,因爲是國外的網站,就用清華鏡像
pip install pip -U # 升級到最新的版本
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 配置pip從清華下載
np.reshape[-1] 可以先把三維數組變成1維對數據做處理 再reshape回原維度
不管reshape什麼樣的數據,順序一直不會變
round(a,1) # 保留一位小數
str(a).zfile(2) # 字符串補全到2位,比如a=1,結果爲01
arr.T 等同於 np.transpose(arr)
np.set_printoptions(suppress=True) # numpy非科學計數顯示
c=np.hstack((a,b)) 橫向拼接,等同於column_stack
c=np.vstack((a,b)) 縱向拼接
b.sort(key=lambda x:x[-18:-4]) 自定義排序,以lambda裏面的來排
data = np.delete(np.array(table),-1,axis=1) # 數據集去掉最後一列
pr = [((i if i > 0 else 0) if i<2000 else 2000) for i in pr] # 吧大於1w的爲1w,小於0的爲0
random.shuffle(datas) # 打亂樣本集,防止數據分佈對模型結果的影響(批量訓練過擬合)
dataset = np.where((dataset == missValue), 2323, dataset) # 無效值替換爲2323
z=np.where(dataset==2323) # 得到下標的列表
替換列表中值的一種寫法
data=np.array([[3,4],[5,6],[7,8]])
data[:,1][data[:,1]==6]=65535
print(data)
a=[2,3,5,6]
a[a==2]=23
print(a)
由於在Python2 中的默認編碼爲ASCII,但是在Python3中的默認編碼爲UTF-8。
所以在使用np.load(det.npy)的時候會出現錯誤提示:
you may need to pass the encoding= option to numpy.load
當遇到這種情況的時候,用np.load(det.npy,encoding=“latin1”)就可以了
table=pd.read_csv(‘data.csv’).fillna(method=‘bfill’)
# 空值填充,pad / ffill是用前面行/列的值填充, backfill / bfill表示用後面行/列的值填充
os.path.sep # 目錄分隔符
os.path.splitext(a) # 切分後綴
os.path.splitext(a) # 切分目錄和文件
# 二維數組,數據都從str變成float
res = [list(map(float, i)) for i in res]
res = np.array(res)
# 二維數組,數據(溫度)都-273.1
res = [list(map(lambda x: x - 273.1, i)) for i in res]
files = glob.glob(r"/COM/data/*.soi") # 返回所有匹配的文件路徑+文件名列表,加上r讓字符串不轉義
M
print(1) 等同於 sys.stdout.write(1)
# 把打印重定向文件
f=open('outfile.log',"a+")
sys.stdout=f # 之後的print都輸入到了文件裏
print('in outfile')
import os
print(os.getpid()) # 獲取本程序進程id
print(os.kill(os.getpid(), 9)) # kill -9 pid,可能等同於exit()
print(111)
# 鎖可以使程序同步,不會發生髒讀誤讀
import threading
lock = threading.Lock()
lock.acquire() # 獲得鎖標記
lock.release() # 釋放鎖
traceback異常
import traceback
try:
a=0/0
except Exception as e:
print('err ',e) # division by zero
traceback.print_exc() # 紅字打印錯誤,但程序繼續運行
print(traceback.format_exc()) # 白字打印錯誤,可定向到log
print(1)
psutil系統監控
import psutil # 監測文件系統的變化
# 獲得系統的CPU、內存、磁盤使用率
cpu = psutil.cpu_percent(3)
mem = psutil.virtual_memory().percent
disc = psutil.disk_usage('E:/').percent
hashlib加密
# 數據加密,常用來做暗文判斷,防盜
import hashlib
md5 = hashlib.md5('23'.encode('utf-8')) # 括號裏可加可不加,加入字符串使解密更復雜
md5.update("1".encode('utf-8'))
print(md5.hexdigest())
# md5是128 bit字節,sha1是160 bit字節,一個字符是4字節
sha1=hashlib.sha1()
sha1.update("1".encode('utf-8'))
print(sha1.hexdigest())
psycopg2連接DB
# 連接postgre數據庫
import psycopg2 as pg
def doDB(sql):
conn = pg.connect(database="satview_app", user="postgres", password="postgres", host="172.10.10.10",
port="5432")
cur = conn.cursor()
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
# 一次性多條插入
sql = "insert into acmr values "
for i in datas:
sql += "('%s','%s',%s,%s,%s,%s)," % tuple(i)
sql = sql[:-1]
doDB(sql)
# 從數據庫獲取數據
conn=pg.connect(database="satview_app", user="postgres", password="postgres", host="172.10.10.10", port="5432")
cur=conn.cursor()
cur.execute("select * from acmr ")
res=cur.fetchall() # 或fetchone()
cur.close()
conn.close()
獲取數據庫中最近得時間
SELECT curtime from zr_wind ORDER BY curtime desc LIMIT 1
和新數據作比較做操作
postgre數據庫字段順序是tuple存儲,順序不能變,不像mysql
PostgreSQL的物理存儲,在PG中,數據是tuple組織的,每個tuple都是固定的storage layout,即字段存儲的物理順序是固定的
解析不同格式文件
# 解析dat
f = open('xxx.dat', "rb+")
data = f.read()
d1 = struct.unpack('24775200f', data) # 24775200=len(data)/4,二進制轉化爲浮點數
print(len(d1),type(d1),type(d1[1])) # 24775200 , tuple , float
d1=np.array(d1)
odata = d1.reshape((62, 555,720)) # 24775200 = 555*720*62
# 讀取nc
from netCDF4 import Dataset
ncfile=Dataset('Radar48.nc')
keys =list( ncfile.variables.keys() )
attvalue = ncfile.variables[keys[0]]
# 讀取Excel
import xlrd
# 加載Excel
xlsbook = xlrd.open_workbook(xlsfile)
# 打開Sheet1
location = xlsbook.sheet_by_name(u'Sheet1')
# 取得第一和第二列全部的值
lon = location.col_values(0,0,location.nrows)
lat = location.col_values(1,0,location.nrows)
num = location.col_values(2,0,location.nrows)
# 解析xml
from xml.dom.minidom import parse
def parses(xmlfile):
x=parse(xmlfile)
root=x.documentElement
a=root.getElementsByTagName('JobCmdLine')
for i in range(len(a)):
t=a[i].getAttribute('Value')
# 讀寫csv
# 寫
import csv
with open('data.csv', 'w', newline='') as csv_file:
csv_writer = csv.writer(csv_file)
csv_writer.writerow(['year','mon','day','xxx'])
for data in datas:
csv_writer.writerow(data)
# 讀
import pandas as pd
table = pd.read_csv('datavis.csv')
data = np.array(table)
print(table.columns) # 表頭
# 讀取hdf
import h5py
f=h5py.File('E:\Surface.hdf','r')
print(f)
print(f.keys())
a=list(f.keys()) # 每個通道
for i in a:
print(i)
data=list(f[i])
print(len(data))
data=np.array(data)
print(data.shape)
L
線程
在UNIX平臺上,當某個進程終結之後,該進程需要被其父進程調用wait,否則進程成爲殭屍進程(Zombie)。所以,有必要對每個Process對象調用join()方法 (實際上等同於wait)。對於多線程來說,由於只有一個進程,所以不存在此必要性。
multiprocessing提供了threading包中沒有的IPC(比如Pipe和Queue),效率上更高。
我們可以從下面的程序中看到Thread對象和Process對象在使用上的相似性與結果上的不同。各個線程和進
程都做一件事:打印PID。但問題是,所有的任務在打印的時候都會向同一個標準輸出(stdout)輸出。這樣輸出的字符會混合在一起,無法閱讀。使用Lock同步,在一個任務輸出完成之後,再允許另一個任務輸出,可以避免多個任務同時向終端輸出
import os
import threading
import multiprocessing
# Main
print('Main:', os.getpid())
# worker function
def worker(sign, lock):
lock.acquire()
print(sign, os.getpid())
lock.release()
# Multi-thread
record = []
lock = threading.Lock()
# Multi-process
record = []
lock = multiprocessing.Lock()
if __name__ == '__main__':
for i in range(5):
thread = threading.Thread(target=worker, args=('thread', lock))
thread.start()
record.append(thread)
for thread in record:
thread.join()
for i in range(5):
process = multiprocessing.Process(target=worker, args=('process', lock))
process.start()
record.append(process)
for process in record:
process.join()
畫圖
可能有些運行不了,只是記錄pylab畫各種圖的方法
曲線擬合
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
x = np.arange(15, 66, 5)
print(x,type(x))
y = np.array([0.751694694, 1.510593775
, 4.207583892, 8.670868118, 20.7398795
, 19.37581188, 25.0455539, 34.07165373
, 39.12968784, 27.60011882, 9.815811524])
def func(x,a,b):
return a*np.exp(b/x)
popt, pcov = curve_fit(func, x, y)
a=popt[0]#popt裏面是擬合係數,讀者可以自己help其用法
b=popt[1]
yvals=func(x,a,b)
plot1=plt.plot(x, y, '*',label='original values')
plot2=plt.plot(x, yvals, 'r',label='curve_fit values')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend(loc=4)#指定legend的位置,讀者可以自己help它的用法
plt.title('curve_fit')
plt.show()
plt.savefig('p2.png')
多項式擬合
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10, 61, 5)
y = np.array([0.227769477338322,
0.283520351840111,
0.468174341740669,
1.04241943278196,
3.16516445953794,
12.2406974733659,
8.49918202494270,
10.8766298540945,
14.1689240413731,
19.9027296869527,
19.2269581524847])
z1 = np.polyfit(x, y, 3)#用3次多項式擬合
p1 = np.poly1d(z1)
print(p1) #在屏幕上打印擬合多項式
yvals=p1(x)#也可以使用yvals=np.polyval(z1,x)
plot1=plt.plot(x, y, '*',label='original values')
plot2=plt.plot(x, yvals, 'r',label='polyfit values')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend(loc=4)
plt.title('polyfitting') # 多項式擬合
plt.show()
插值誤差分析畫圖
import matplotlib.pyplot as plt
def handle(a,b):
me,mae,rmse,rmsse,rs=[],[],[],[],[]
for i in a[:,1]:
# print(len(i))
me.append(ME(i,data))
mae.append(MAE(i,data))
rmse.append(RMSE(i,data))
rmsse.append(RMSSE(i,data))
rs.append(Rsqrt(i,data))
print(len(me),len(mae),len(rmse),len(rmsse),len(rs))
x = a[:, 0] # 數據說明,比如D= func=
y=[i*2 for i in range(-10,10)] # y軸標註範圍 參照誤差的量級做修改
plt.figure()
plt.title(b)
plt.grid(axis='x',linestyle='--')
plt.scatter(x,me,s=10,marker='s')
plt.scatter(x,mae,s=10,marker='v')
plt.scatter(x,rmse,s=10,marker='o')
# plt.xticks(x)
plt.xticks([i for i in range(10)]) # x軸標準
plt.yticks(y)
plt.xlabel('估測方法') # x軸說明
plt.ylabel('誤差(m/s)')
plt.plot(x,me,color='b',label='ME')
plt.plot(x,mae,color='r',label='MAE')
plt.plot(x,rmse,color='g',label='RMSE')
plt.legend() # loc=
plt.show()
# 關於RMSSE和R的圖
# from mpl_toolkits.axes_grid1 import host_subplot
# import mpl_toolkits.axisartist as AA
# host=host_subplot(111,axes_class=AA.Axes)
# plt.subplots_adjust(right=0.75)
# host=plt.subplot(111)
# p1=plt.twinx()
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.set_title(b)
ax.plot(x, rmsse, color='b', label='RMSSE')
ax2=ax.twinx()
ax2.plot(x, rs, color='r', label='$R^2$')
ax.grid(axis='x',linestyle='--')
ax.set_xlabel('估測方法')
# ax.set_xticks(i for i in range(10))
ax.set_ylabel('RMSSE')
ax2.set_ylabel('$R^2$')
ax.scatter(x, rmsse, s=10, marker='s')
ax2.scatter(x, rs, s=10, marker='v')
# yy = [i * 0.2 for i in range(0, 10)] # y軸標註範圍
# yyy = [i * 0.05 for i in range(0, 5)] # y軸標註範圍
# ax.set_ylim(0.5,1.5)
ax.set_ylim(1,2) # for rbf
# ax.set_xlim(3,22)
ax2.set_ylim(0,0.25)
plt.legend(loc='best')
plt.show()
handle(rbf,'rbf')
EOF分析畫圖
from pylab import *
p1=np.load('E:\EOFsss\p1.npy')
p2=np.load('E:\EOFsss\p2.npy')
p3=np.load('E:\EOFsss\p3.npy')
p4=np.load('E:\EOFsss\p4.npy')
# xticks(range(1999,2019,4))
# yticks(range(-100,100,50))
figure(1,figsize=(10,5))
ax=subplot(2,2,1)
sca(ax)
title('p1')
# xticks(range(1999,2019,4))
yticks(range(-100,101,50))
ylim(-150,150)
bar(range(1999,2019,1),p1*40)
ax1=subplot(2,2,2)
sca(ax1)
title('p2')
# xticks(range(1999,2019,4))
yticks(range(-100,101,50))
ylim(-150,150)
bar(range(1999,2019,1),p2*40)
ax2=subplot(2,2,3)
sca(ax2)
title('p3')
# xticks(range(1999,2019,4))
yticks(range(-100,101,50))
ylim(-150,150)
bar(range(1999,2019,1),p3*40)
ax3=subplot(2,2,4)
sca(ax3)
title('p4')
# xticks(range(1999,2019,3))
yticks(range(-100,101,50))
ylim(-150,150)
bar(range(1999,2019,1),p4*40)
show()
AI預測結果畫圖
from pylab import *
figure(figsize=(7, 9))
subplot(2, 1, 1)
title(timec[t])
# yticks([i for i in range(0,10001,500)])
# ylim([0,10001])
plot(xx, pr, label='pred')
plot(xx, yr, label='real')
legend()
subplot(2, 1, 2)
K = classerr.count(-1) / OutputSize * 100
title(K)
yticks([i for i in range(-10, 10, 1)])
plot(xx, classerr, label='classerr')
plot(xx, disterr, label='disterr')
legend()
print('K = ', K)
show()
本人出的面試題
1、用python實現計算特徵X和Y之間的相關係數的方法
2、寫一個方法:求列表主元素,對應元素個數大於列表長度的一半即爲主元素,沒有則爲None
Eg:[1,1,1,2,2,2,2],輸出2
3、實現一個自定義排序
比如:a=[ ‘z_RES23’,‘p_RES93’,‘x_RES21’,‘z_RES23’,‘d_RES04’,‘z_RES13’ ]
通過最後兩位從小到大排序
4、寫一個快速排序
5、寫一個二分查找
6、一行代碼實現1-100之和
7、假設你在卷積神經網絡的第一層中有 5 個卷積核,每個卷積核尺寸爲 7×7,具有零填充且步幅爲 1。該層的輸入圖片的維度是 224×224×3。那麼該層輸出的維度是多少?
8、向量 X=[1,2,3,4,-9,0] 的 L1 、L2範數爲
9、過擬合和欠擬合的解決方法
10、機器學習訓練時,Mini-Batch 的大小優選爲2的冪,如 256 或 512。它背後的原因是什麼?
答案
python
1、
用python實現 計算特徵 X 和 Y 之間的相關係數的方法
def R(x, y):
xm = np.mean(x)
ym = np.mean(y)
mem = sum((x - xm) * (y - ym))
den = np.sqrt( sum((x - xm) ** 2) * sum((y - ym) ** 2) )
return mem / den
#2、
求列表 l1 和 l2 的差集
list(set(l1).difference(set(l2)))
3、
寫一個方法:求列表主元素,對應元素個數大於列表長度的一半即爲主元素,沒有則爲None
Eg:[1,1,1,2,2,2,2],輸出2
def main():
a=[1,1,1,2,2,2,2]
for i in set(a):
if a.count(i)>len(a)/2:
return i
return None
4、
20個人圍成一圈(編號1-20),從1開始依次報數,以7爲一個循環,報數爲3的倍數退出,問最後剩哪兩人
human=[i for i in range(1,21)]
human1=human.copy()
con=1
while len(human)!=2:
for i in human:
if con%3==0:human1.remove(i)
con+=1
if con==8:con=1
human=human1.copy()
print(human)
print('last = ',human)
# 結果,【13,15】
5、
對一個列表位置反轉,a=[1,2,3,4,5,6,4]
a[::-1] 或 a.reverse()
6*、
實現一個自定義排序
比如:a=[ ‘z_RES23’,‘p_RES93’,‘x_RES21’,‘z_RES23’,‘d_RES04’,‘z_RES13’ ]
通過最後兩位從小到大排序
b.sort(key=lambda x:x[-2:])
#7、
10個臺階,小明每次只能上1個或2個臺階,一共有多少種走法
動態規劃
def do(n):
if n==2:return 2
elif n==1:return 1
else:return do(n-1)+do(n-2)
print(do(10))
8、
寫一個快速排序
qs=lambda a:( (qs([i for i in a[1:] if i<=a[0]]))+[a[0]]+(qs([i for i in a[1:] if i > a[0]])) ) if len(a)>1 else a
(如果分解的只剩一個元素,就輸出,從小到大的list拼接)
a=[3,5,7,9,2]
print(qs(a))
9、
寫一個二分查找
def query(key,l,beg,end):
if beg>=end:
return
mid=int((beg+end)/2)
if l[mid]>key:
return query(key,l,beg,mid)
elif l[mid]<key:
return query(key,l,mid,end)
else:
return mid
result=query(key,l,0,len(l)-1)
時間複雜度O(logn)
或
int binarySearch(int l,int r,int number) //循環{
int mid = (l+r)/2;
while(l<=r){
if(t[mid]<number)
l = mid+1;
else if(t[mid]>number)
r = mid-1;
else if(t[mid] == number )
return mid;
mid = (r+l)/2; }
return -1;
10*、
實現斐波那契數列
用生成器yield
def fun(z):
x1,x2=0,1
for i in range(z):
yield x1
x1,x2=x2,x1+x2
for i in fun(int(input('輸入一個數n,你將得到斐波那契數列前n項\n'))):
print(i,end=' ')
#11、
給定一個字符串,找出不含有重複字符的最長字串的長度
滑動窗口法
def do(s):
a=0
d={}
start=0
for i in range(len(s)):
if s[i] in d and start<=d[s[i]]:
start=d[s[i]]+1
a=max(i-start+1,a)
d[s[i]]=i
return a,s[start:start+a] # 最長值和串
a,b=do('asddfgh')
print(a,b)
12、
一行代碼實現1-100之和
sum(range(1,101))
13*、
最大回文子串,Eg: in ‘abccbac’ out: ‘abccba’
a='abccbac'
def do(a):
lens,start=0,0
for i in range(len(a)):
if i-lens>=1 and a[i-lens-1:i+1]==a[i-lens-1:i+1][::-1]:
start=i-lens-1
lens+=2
continue
if i-lens>=0 and a[i-lens:i+1]==a[i-lens:i+1][::-1]:
start=i-lens
lens+=1
return start,lens,a[start:start+lens]
print(do(a))
14、
有一個二維數組data,裏面的元素全部是數字,但是都是str類型,一行代碼全部轉成float類型
res = np.array( [list(map(float, i)) for i in res] )
AI
1、
BP和CNN的區別
BP每層單元都是全連接的,而CNN他是連接到卷積核
卷積網絡其實就是在全連接網絡的基礎上,把全連接改爲部分連接,然後再利用權值共享的技巧大量減少網絡需要修改的權值數量
2、
假設你在卷積神經網絡的第一層中有 5 個卷積核,每個卷積核尺寸爲 7×7,具有零填充且步幅爲 1。該層的輸入圖片的維度是 224×224×3。那麼該層輸出的維度是多少?
答案:218 x 218 x 5
解析:一般地,如果原始圖片尺寸爲 nxn,filter 尺寸爲 fxf,則卷積後的圖片尺寸爲 (n-f+1)x(n-f+1),注意 f 一般爲奇數。
若考慮存在填充和步幅,用 s 表示 stride 長度,p 表示 padding 長度,如果原始圖片尺寸爲 nxn,filter 尺寸爲 fxf,則卷積後的圖片尺寸爲:out=(in+2*p-f)/s+1
此例中, n=224,p=0,f=7,s=1,因此,該層輸出的尺寸爲 218x218。
輸出的第三個維度由濾波器的個數決定,即爲 5
3*、
機器學習訓練時,Mini-Batch 的大小優選爲2個的冪,如 256 或 512。它背後的原因是什麼?
Mini-Batch 設爲 2 的 冪,是爲了符合 CPU、GPU 的內存要求,利於並行化處理
4、
向量 X=[1,2,3,4,-9,0] 的 L1 、L2範數爲
19,√111
L0 範數表示向量中所有非零元素的個數;L1 範數指的是向量中各元素的絕對值之和,又稱“稀疏矩陣算子”;L2 範數指的是向量中各元素的平方和再求平方根
5、
CNN中池化層的作用
1、pooling是在卷積網絡(CNN)中一般在卷積層(conv)之後使用的特徵提取層,使用pooling技術將卷積層後得到的小鄰域內的特徵點整合得到新的特徵。一方面防止無用參數增加時間複雜度,一方面增加了特徵的整合度。
2、pooling是用更高層的抽象表示圖像特徵,至於pooling爲什麼可以這樣做,是因爲:我們之所以決定使用卷積後的特徵是因爲圖像具有一種“靜態性”的屬性,這也就意味着在一個圖像區域有用的特徵極有可能在另一個區域同樣適用。因此,爲了描述大的圖像,一個很自然的想法就是對不同位置的特徵進行聚合統計。這個均值或者最大值就是一種聚合統計的方法。
3、做窗口滑動卷積的時候,卷積值就代表了整個窗口的特徵。因爲滑動的窗口間有大量重疊區域,出來的卷積值有冗餘,進行最大pooling或者平均pooling就是減少冗餘。減少冗餘的同時,pooling也丟掉了局部位置信息,所以局部有微小形變,結果也是一樣的。就像圖片上的字母A,局部出現微小變化,也能夠被識別成A。而加上椒鹽噪音,就是字母A上有很多小洞,同樣的能夠被識別出來。而平移不變性,就是一個特徵,無論出現在圖片的那個位置,都會識別出來。所以平移不變性不是pooling帶來的,而是層層的權重共享帶來的
6*、
對於分類問題常用的評價指標是精準度、召回率、F1值,他們的定義
TP——將正類預測爲正類數
FN——將正類預測爲負類數
FP——將負類預測爲正類數
TN——將負類預測爲負類數
精準率定義爲:P = TP / (TP + FP)
召回率定義爲:R = TP / (TP + FN)
F1值定義爲: F1 = 2PR / (P + R)
7、
講講激活函數sigmoid、tanh、relu、softmax
sigmoid(1/1+e-z,一般用在簡單二分類輸出層)
tanh(ez-e-z/ez+e-z,一般用在隱藏單元,tanh的輸出爲(-1,1),因此它將數據集中在一起,使得下一層的學習變得更加簡單,一般用在RNN)
relu(x>0:x,常用在模型訓練層)
leaky ReLU(x<0:0.01x)
softmax(z/sum(z),一般用於CNN輸出層)
如果用sigmoid就是二分分類問題,如果用softmax就是多分類,如果用tanh的話常常是RNN,CNN常用relu(非負時梯度恆爲1,收斂維持穩定,如果用leaky帶泄露的,就是負數時梯度不爲0,可以防止梯度消失)
8、過擬合和欠擬合的解決方法
降低過擬合方法
數據擴充(圖像變換.Gan生成.MT生成等)
降低模型複雜度(神經網絡減少層數.神經元個數.決策樹剪枝等)
權值約束(L1L2等)
集成學習(dropout、RF、GBDT等)
提前終止
降低欠擬合方法
加入新特徵(因子分解機FM、Deep-Crossing、自編碼器)
增加模型複雜度(神經網絡增加層數.神經元個數)
減少或去掉正則化(添加正則化項是爲了限制模型的學習能力,減小正則化項的係數則可以放寬這個限制;模型通常更傾向於更大的權重,更大的權重可以使模型更好的擬合數據)
9、
講講PCA
PCA(Principal Component Analysis),即主成分分析方法,是一種使用最廣泛的數據降維算法。
PCA的主要思想是將n維特徵映射到k維上,這k維是全新的正交特徵也被稱爲主成分,是在原有n維特徵的基礎上重新構造出來的k維特徵。PCA的工作就是從原始的空間中順序地找一組相互正交的座標軸,新的座標軸的選擇與數據本身是密切相關的。其中,第一個新座標軸選擇是原始數據中方差最大的方向,第二個新座標軸選取是與第一個座標軸正交的平面中使得方差最大的,第三個軸是與第1,2個軸正交的平面中方差最大的。依次類推,可以得到n個這樣的座標軸。
通過這種方式獲得的新的座標軸,我們發現,大部分方差都包含在前面k個座標軸中,後面的座標軸所含的方差幾乎爲0。於是,我們可以忽略餘下的座標軸,只保留前面k個含有絕大部分方差的座標軸。事實上,這相當於只保留包含絕大部分方差的維度特徵,而忽略包含方差幾乎爲0的特徵維度,實現對數據特徵的降維處理
10、
講一個你最常用的機器學習算法,定義、特點、優缺點、應用場景等
(開放,不看對錯)
11、
簡述LSTM
LSTM(Long Short-Term Memory)是長短期記憶網絡,是一種時間遞歸神經網絡,適合於處理和預測時間序列中間隔和延遲相對較長的重要事件。
LSTM 已經在科技領域有了多種應用。基於 LSTM 的系統可以學習翻譯語言、控制機器人、圖像分析、文檔摘要、語音識別圖像識別、手寫識別、控制聊天機器人、預測疾病、點擊率和股票、合成音樂等等任務。
LSTM區別於RNN的地方,主要就在於它在算法中加入了一個判斷信息有用與否的"處理器",這個處理器作用的結構被稱爲cell。
一個cell當中被放置了三扇門,分別叫做輸入門、遺忘門和輸出門。一個信息進入LSTM的網絡當中,可以根據規則來判斷是否有用。只有符合算法認證的信息纔會留下,不符的信息則通過遺忘門被遺忘。
目前已經證明,LSTM是解決長序依賴問題的有效技術,並且這種技術的普適性非常高,導致帶來的可能性變化非常多。各研究者根據LSTM紛紛提出了自己的變量版本,這就讓LSTM可以處理千變萬化的垂直問題。