城市氣候與海洋的關係研究 :python
導入包 :算法
import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt %matplotlib inline from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認字體 mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示爲方塊的問題
導入數據 :api
ferrara1 = pd.read_csv('./ferrara_150715.csv') ferrara2 = pd.read_csv('./ferrara_250715.csv') ferrara3 = pd.read_csv('./ferrara_270615.csv') ferrara=pd.concat([ferrara1,ferrara2,ferrara3],ignore_index=True) # ignore_index=True 表示的是忽略顯式的行索引 ...
刪除沒用的列 :app
# 循環刪除每一個表的'Unnamed: 0'列 city_list = [ferrara,torino,mantova,milano,ravenna,asti,bologna,piacenza,cesena,faenza] for city in city_list: city.drop(labels='Unnamed: 0',axis=1,inplace=True) # 加入inplace=True就會改寫源數據
部分數據 :dom
temp | humidity | pressure | description | dt | wind_speed | wind_deg | city | day | dist | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 29.40 | 83 | 1015 | moderate rain | 1436863177 | 3.62 | 94.001 | Faenza | 2015-07-14 10:39:37 | 37 |
1 | 30.12 | 78 | 1015 | moderate rain | 1436866759 | 3.10 | 80.000 | Faenza | 2015-07-14 11:39:19 | 37 |
顯示最高溫度於離海遠近的關係(觀察多個城市):機器學習
max_temp = [] #10個城市的最高溫度 cities_dist = [] #10個城市距離海洋的距離 for city in city_list: max_temp.append(city['temp'].max()) cities_dist.append(city['dist'].max())
生成散點圖 :學習
plt.scatter(cities_dist,max_temp,c='rbyg') # c='rbyg'表示顏色 plt.xlabel('距離') plt.ylabel('最高溫度') plt.title('距離和最高溫度之間的關係圖') # 基於當前的關係模式將某一個未知最高溫度的城市的最高溫度進行預測
提取樣本數據(特徵數據,目標數據)測試
feature = np.array(cities_dist) #特徵數據 feature = feature.reshape(-1, 1) #二維形式的特徵數據 target = np.array(max_temp) #目標數據
訓練模型調用的方法是fit(X,y),y任意形式(維度)的目標數據,X表示的必須是二維的特徵數據字體
選擇一個模型對象進行實例化人工智能
from sklearn.linear_model import LinearRegression linner = LinearRegression()
訓練模型
linner.fit(feature,target) # X,y X必須是二維的特徵數據
使用相關的評價指標來評價模型
linner.score(feature,target)
實現預測
linner.predict([[222],[333]])
畫出迴歸曲線 :
x = np.linspace(0,350,num=100) y = linner.predict(x.reshape(-1,1)) plt.scatter(cities_dist,max_temp,c='rbyg') plt.xlabel('距離') plt.ylabel('最高溫度') plt.title('距離和最高溫度之間的關係圖') plt.scatter(x,y)
簡單地說,K-近鄰算法採用測量不一樣特徵值之間的距離方法進行分類。 - 優勢:精度高(計算距離)、對異常值不敏感(單純根據距離進行分類,會忽略特殊狀況)、無數據輸入假定(不會對數據預先進行斷定)。 - 缺點:時間複雜度高、空間複雜度高。 - 適用數據範圍:數值型和標稱型。
用於分類 :
導包,機器學習的算法KNN、數據藍蝴蝶
import sklearn.datasets as datasets datasets.load_iris() # datasets提供了不一樣的樣本數據,根據不一樣的樣本數據訓練出來,就將會有不一樣的功能
預測年收入是否大於50K美圓 :
讀取adult.txt文件,最後一列是年收入,並使用KNN算法訓練模型,而後使用模型預測一我的的年收入是否大於50
# 讀取數據 import pandas as pd import numpy as np data = pd.read_csv('../data/adults.txt') data.head()
部分數據展現
age | workclass | final_weight | education | education_num | marital_status | occupation | relationship | race | sex | capital_gain | capital_loss | hours_per_week | native_country | salary | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 39 | State-gov | 77516 | Bachelors | 13 | Never-married | Adm-clerical | Not-in-family | White | Male | 2174 | 0 | 40 | United-States | <=50K |
1 | 50 | Self-emp-not-inc | 83311 | Bachelors | 13 | Married-civ-spouse | Exec-managerial | Husband | White | Male | 0 | 0 | 13 | United-States | <=50K |
獲取年齡、教育程度、職位、每週工做時間做爲機器學習數據
獲取薪水做爲對應結果
feature = data[['age','education_num','occupation','hours_per_week']] target = data['salary']
knn中特徵數據是須要參與運算的,因此要保證特徵數據必須爲數值型的數據
feature.head(2)
age | education_num | occupation | hours_per_week | |
---|---|---|---|---|
0 | 39 | 13 | Adm-clerical | 40 |
1 | 50 | 13 | Exec-managerial | 13 |
數據轉換,將String類型數據轉換爲int (occupation轉換成數字)
# map方法,進行數據轉換 dic = {} occ_arr = feature['occupation'].unique() for i in range(occ_arr.size): dic[occ_arr[i]] = i feature['occupation'] = feature['occupation'].map(dic)
切片:訓練數據和預測數據
#訓練數據 x_train = feature[:32500] y_train = target[:32500] #測試數據 x_test = feature[32500:] y_test = target[32500:]
生成算法
from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=10) # n_neighbors調整精度用的K knn.fit(x_train,y_train) knn.score(x_test,y_test)
第二步:預測數據
print('真實的分類結果:',np.array(y_test)) print('模型的分類結果:',knn.predict(x_test))
導包
import numpy as np import matplotlib .pyplot as plt import pandas as pd from sklearn.neighbors import KNeighborsClassifier
加載數據
#./data/6/6_66.bmp feature = [] target = [] for i in range(10): #i表示的文件夾的名稱 for j in range(1,501): img_path = './data/'+str(i)+'/'+str(i)+'_'+str(j)+'.bmp' img_arr = plt.imread(img_path) feature.append(img_arr) target.append(i)
提取樣本數據
feature = np.array(feature) #必須保證是二維 target = np.array(target) feature.shape # (5000, 28, 28) 目前的特徵是3維
特徵處理:將三維的特徵變造成二維
feature = feature.reshape((5000,-1)) feature.shape # (5000, 784)
對樣本數據進行拆分
#對樣本數據進行打亂 # 利用random進行隨機打亂且固定隨機因子,使數據保持對應關係 np.random.seed(10) np.random.shuffle(feature) np.random.seed(10) np.random.shuffle(target) #拆分 x_train = feature[:4950] y_train = target[:4950] x_test = feature[4950:] y_test = target[4950:]
實例化模型對象,而後對其進行訓練
knn = KNeighborsClassifier(n_neighbors=5) knn.fit(x_train,y_train) knn.score(x_test,y_test)
測試數據
print('真實的分類結果:',y_test) print('模型的分類結果:',knn.predict(x_test))
保存模型
from sklearn.externals import joblib joblib.dump(knn,'./knn.m')
使用模型識別外部的數字圖片
讀取模型
knn = joblib.load('./knn.m') knn
讀取須要識別的圖片
img_arr = plt.imread('./數字.jpg') plt.imshow(img_arr)
img_arr.shape # (241, 257, 3) 三維
裁切圖片
eight_img = img_arr[180:235,90:130,:] plt.imshow(eight_img) feature[0].shape # (784,)
模型能夠識別的圖片的維度是取決於樣本數據的
降維
eight_img.shape # (55, 40, 3) eight_img = eight_img.mean(axis=2) eight_img.shape # (55, 40)
對降維以後的圖片的像素進行等比例壓縮
import scipy.ndimage as ndimage eight_img = ndimage.zoom(eight_img,zoom=(28/55,28/40)) eight_img.shape # (28, 28)
eight_img = eight_img.reshape(1,-1) eight_img.shape # (1,784)
識別
knn.predict(eight_img) # array([8])