邏輯回歸梯度下降法
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
from sklearn import preprocessing
# 數(shù)據(jù)是否需要標(biāo)準(zhǔn)化
# 數(shù)據(jù)標(biāo)準(zhǔn)化有利于梯度下降法的優(yōu)化
scale = False
data = np.genfromtxt('LR-testSet.csv' ,delimiter=',')
x_data = data[: ,:-1]
y_data = data[: ,-1]
def plot():
x0 = []
x1 = []
y0 = []
y1 = []
# 切分不同類(lèi)別的數(shù)據(jù)
for i in range(len(x_data)):
if y_data[i] == 0:
x0.append(x_data[i ,0])
y0.append(x_data[i ,1])
else:
x1.append(x_data[i ,0])
y1.append(x_data[i ,1])
# 畫(huà)圖
scatter0 = plt.scatter(x0 ,y0 ,c='b' ,marker='o')
scatter1 = plt.scatter(x1 ,y1 ,c='r' ,marker='x')
# 畫(huà)圖例
plt.legend(handles = [scatter0 ,scatter1] ,labels = ['label0' ,'label1'] ,loc = 'best')
plot()
plt.show()
# 數(shù)據(jù)處理,添加偏置項(xiàng)
x_data = data[: ,:-1]
y_data = data[: ,-1 ,np.newaxis]
print(x_data)
print(y_data)
print(np.mat(x_data).shape)
print(np.mat(y_data).shape)
# 給樣本添加偏置項(xiàng)
X_data = np.concatenate((np.ones((100 ,1)) ,x_data) ,axis=1)
print(X_data.shape)
def sigmoid(x):
return 1.0 / (1 + np.exp(-x))
def cost(xMat ,yMat ,ws):
left = np.multiply(yMat ,np.log(sigmoid(xMat*ws)))
# multiply按位相乘
right = np.multiply(1 - yMat ,np.log(1 - sigmoid(xMat*ws)))
return np.sum(left + right) / -(len(xMat))
def gradAscent(xArr ,yArr):
if scale == True:
xArr = preprocessing.scale(xArr)
xMat = np.mat(xArr)
yMat = np.mat(yArr)
lr = 0.001
epochs = 10000
costList = []
# 計(jì)算數(shù)據(jù)行列數(shù)
# 行代表數(shù)據(jù)個(gè)數(shù),列代表權(quán)值個(gè)數(shù)
m ,n = np.shape(xMat)
# 初始化權(quán)值
ws = np.mat(np.ones((n ,1)))
for i in range(epochs + 1):
# xMat和weights矩陣相乘
h = sigmoid(xMat * ws)
# 計(jì)算誤差
ws_grad = xMat.T * (h - yMat) / m
ws = ws - lr * ws_grad
if i % 50 == 0:
costList.append(cost(xMat ,yMat ,ws))
return ws,costList
# 訓(xùn)練模型,得到權(quán)值和cost值的變化
ws,costList = gradAscent(X_data ,y_data)
print(ws)
if scale == False:
# 畫(huà)圖決策邊界
plot()
x_test = [[-4] ,[3]]
y_test = (-ws[0] - x_test * ws[1])/ws[2]
plt.plot(x_test ,y_test ,'k')
plt.show()
# 畫(huà)圖loss值的變化
x = np.linspace(0 ,10000 ,201)
plt.plot(x ,costList ,c='r')
plt.title('Train')
plt.xlabel('Epochs')
plt.ylabel('Cost')
plt.show()
# 預(yù)測(cè)
def predict(x_data ,ws):
if scale == True:
x_data = preprocessing.scale(x_data)
xMat = np.mat(x_data)
ws = np.mat(ws)
return [1 if x >= 0.5 else 0 for x in sigmoid(xMat * ws)]
predictions = predict(X_data ,ws)
print(classification_report(y_data ,predictions))
sklearn邏輯回歸梯度下降法
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
from sklearn import preprocessing
from sklearn import linear_model
scale = False
data = np.genfromtxt('LR-testSet.csv' ,delimiter=',')
x_data = data[: ,:-1]
y_data = data[: ,-1]
def plot():
x0 = []
x1 = []
y0 = []
y1 = []
# 切分不同類(lèi)別的數(shù)據(jù)
for i in range(len(x_data)):
if y_data[i] == 0:
x0.append(x_data[i ,0])
y0.append(x_data[i ,1])
else:
x1.append(x_data[i ,0])
y1.append(x_data[i ,1])
# 畫(huà)圖
scatter0 = plt.scatter(x0 ,y0 ,c='b' ,marker='o')
scatter1 = plt.scatter(x1 ,y1 ,c='r' ,marker='x')
# 畫(huà)圖例
plt.legend(handles = [scatter0 ,scatter1] ,labels = ['label0' ,'label1'] ,loc = 'best')
plot()
plt.show()
logistic = linear_model.LogisticRegression()
logistic.fit(x_data ,y_data)
if scale == False:
plot()
x_test = np.array([[-4] ,[3]])
y_test = (-logistic.intercept_ - x_test * logistic.coef_[0][0]) / logistic.coef_[0][1]
plt.plot(x_test ,y_test ,'k')
plt.show()
predictions = logistic.predict(x_data)
print(classification_report(y_data ,predictions))
邏輯回歸非線性問(wèn)題梯度下降法
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
from sklearn import preprocessing
from sklearn.preprocessing import PolynomialFeatures
scale = False
data = np.genfromtxt('LR-testSet2.txt' ,delimiter=',')
x_data = data[: ,:-1]
y_data = data[: ,-1 ,np.newaxis]
print(y_data)
def plot():
x0 = []
x1 = []
y0 = []
y1 = []
# 切分不同類(lèi)別的數(shù)據(jù)
for i in range(len(x_data)):
if y_data[i] == 0:
x0.append(x_data[i ,0])
y0.append(x_data[i ,1])
else:
x1.append(x_data[i ,0])
y1.append(x_data[i ,1])
# 畫(huà)圖
scatter0 = plt.scatter(x0 ,y0 ,c='b' ,marker='o')
scatter1 = plt.scatter(x1 ,y1 ,c='r' ,marker='x')
# 畫(huà)圖例
plt.legend(handles = [scatter0 ,scatter1] ,labels = ['label0' ,'label1'] ,loc = 'best')
plot()
plt.show()
# 定義多項(xiàng)式回歸伍绳,degree的值可以調(diào)節(jié)多項(xiàng)式的特征
poly_reg= PolynomialFeatures(degree=3)
# 特征處理
x_poly = poly_reg.fit_transform(x_data)
def sigmoid(x):
return 1.0 / (1 + np.exp(-x))
def cost(xMat ,yMat ,ws):
left = np.multiply(yMat ,np.log(sigmoid(xMat*ws)))
right = np.multiply(1 - yMat ,np.log(1 - sigmoid(xMat*ws)))
return np.sum(left + right) / -(len(xMat))
def gradAscent(xArr ,yArr):
if scale == True:
xArr = preprocessing.scale(xArr)
xMat = np.mat(xArr)
yMat = np.mat(yArr)
lr = 0.03
epochs = 50000
costList = []
# 計(jì)算數(shù)據(jù)行列數(shù)
# 行代表數(shù)據(jù)個(gè)數(shù),列代表權(quán)值個(gè)數(shù)
m, n = np.shape(xMat)
# 初始化權(quán)值
ws = np.mat(np.ones((n, 1)))
for i in range(epochs + 1):
# xMat和weights矩陣相乘
h = sigmoid(xMat * ws)
# 計(jì)算誤差
ws_grad = xMat.T * (h - yMat) / m
ws = ws - lr * ws_grad
if i % 50 == 0:
costList.append(cost(xMat, yMat, ws))
return ws, costList
# 訓(xùn)練模型乍桂,得到權(quán)值和cost值的變化
ws ,costList = gradAscent(x_poly ,y_data)
print(ws)
# 基本完成
# 獲取數(shù)據(jù)值所在的范圍
x_min ,x_max = x_data[: ,0].min() ,x_data[: ,0].max() + 1
y_min ,y_max = x_data[: ,1].min() ,x_data[: ,1].max() + 1
# 生成網(wǎng)絡(luò)矩陣
xx ,yy = np.meshgrid(np.arange(x_min ,x_max ,0.02) ,
np.arange(y_min ,y_max ,0.02))
z = sigmoid(poly_reg.fit_transform(np.c_[xx.ravel() ,yy.ravel()]).dot(np.array(ws)))
# ravel與flatten類(lèi)似冲杀,多維數(shù)據(jù)轉(zhuǎn)一維效床,flatten不會(huì)改變數(shù)據(jù)原始數(shù)據(jù),ravel會(huì)改變?cè)紨?shù)據(jù)
for i in range(len(z)):
if z[i] > 0.5:
z[i] = 1
else:
z[i] = 0
z = z.reshape(xx.shape)
# 等高線圖
cs = plt.contour(xx ,yy ,z)
plot()
plt.show()
# 預(yù)測(cè)
def predict(x_data ,ws):
if scale == True:
x_data = preprocessing.scale(x_data)
xMat = np.mat(x_data)
ws = np.mat(ws)
return [1 if x >= 0.5 else 0 for x in sigmoid(xMat * ws)]
predictions = predict(x_poly ,ws)
print(classification_report(y_data ,predictions))

sklearn邏輯回歸非線性
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.datasets import make_gaussian_quantiles
from sklearn.preprocessing import PolynomialFeatures
# 生成2維正態(tài)分布漠趁,生成的數(shù)據(jù)按分位數(shù)分為兩類(lèi)扁凛,500個(gè)樣本,2個(gè)樣本特征
# 可以生成兩類(lèi)或多類(lèi)數(shù)據(jù)
x_data ,y_data = make_gaussian_quantiles(n_samples=500 ,n_features=2 ,n_classes=2)
plt.scatter(x_data[: ,0] ,x_data[: ,1] ,c = y_data)
plt.show()
# 定義多項(xiàng)式回歸闯传,degree的值可以調(diào)節(jié)多項(xiàng)式的特征
poly_reg = PolynomialFeatures(degree=5)
# 特征處理
x_poly = poly_reg.fit_transform(x_data)
logistic = linear_model.LogisticRegression()
logistic.fit(x_poly ,y_data)
# 獲取數(shù)據(jù)值所在的范圍
x_min ,x_max = x_data[: ,0].min() ,x_data[: ,0].max() + 1
y_min ,y_max = x_data[: ,1].min() ,x_data[: ,1].max() + 1
# 生成網(wǎng)絡(luò)矩陣
xx ,yy = np.meshgrid(np.arange(x_min ,x_max ,0.02) ,
np.arange(y_min ,y_max ,0.02))
z = logistic.predict(poly_reg.fit_transform(np.c_[xx.ravel() ,yy.ravel()]))
z = z.reshape(xx.shape)
# 等高線圖
cs = plt.contourf(xx ,yy ,z)
# 樣本點(diǎn)數(shù)圖
plt.scatter(x_data[: ,0] ,x_data[: ,1] ,c = y_data)
plt.show()
print('score' ,logistic.score(x_poly ,y_data))
KNN算法
import matplotlib.pyplot as plt
import numpy as np
import operator
# 已知分類(lèi)的數(shù)據(jù)
x1 = np.array([3 ,2 ,1])
y1 = np.array([104 ,100 ,81])
x2 = np.array([101 ,99 ,98])
y2 = np.array([10 ,5 ,2])
scatter1 = plt.scatter(x1 ,y1 ,c = 'r')
scatter2 = plt.scatter(x2 ,y2 ,c = 'b')
# 未知數(shù)據(jù)
x = np.array([18])
y = np.array([90])
scatter3 = plt.scatter(x ,y ,c = 'k')
# 畫(huà)圖例
plt.legend(handles = [scatter1 ,scatter2 ,scatter3] ,labels = ['labelA' ,'labelB' ,'X'] ,loc = 'best')
plt.show()
# 已知分類(lèi)的數(shù)據(jù)
x_data = np.array([[3,104],
[2,100],
[1,81],
[101,10],
[99,5],
[81,2]])
y_data = np.array(['A','A','A','B','B','B'])
x_test = np.array([18,90])
# 計(jì)算樣本數(shù)量
x_data_size = x_data.shape[0]
x_data_size
# 復(fù)制x_test
np.tile(x_test ,(x_data_size ,1))
# 計(jì)算x_test與每一個(gè)樣本的差值
diffMat = np.tile(x_test ,(x_data_size ,1)) - x_data
diffMat
# 計(jì)算差值的平方
sqDiffMat = diffMat**2
sqDiffMat
# 求和
sqDistances = sqDiffMat.sum(axis = 1)
sqDistances
#開(kāi)方
distances = sqDistances**0.5
distances
# 從小到大排序
sortedDistances = distances.argsort()
classCount = {}
# 設(shè)置k
k = 5
for i in range(k):
#獲取標(biāo)簽
votelabel = y_data[sortedDistances[i]]
# 統(tǒng)計(jì)標(biāo)簽數(shù)量
classCount[votelabel] = classCount.get(votelabel ,0) + 1
classCount
# 根據(jù)operator.itemgetter(1)-第1個(gè)值對(duì)classCount排序谨朝,然后再取倒序
sortedClassCount = sorted(classCount.items() ,key=operator.itemgetter(1) ,reverse=True)
sortedClassCount
# 獲取數(shù)量最多的標(biāo)簽
knnclass = sortedClassCount[0][0]
knnclass
圖片:
QQ截圖20200409163053.png
KNN鳶尾花
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix
import operator
import random
# 鳶尾花,數(shù)據(jù)屬性:萼片長(zhǎng)度(sepal length)甥绿,萼片寬度字币,花瓣長(zhǎng)度(petal length),花瓣寬度
# 類(lèi)別:Iris setosa,lris versicolor,Iris virginica
def knn(x_test ,x_data ,y_data ,k):
#計(jì)算樣本數(shù)量
x_data_size = x_data.shape[0]
# 復(fù)制x_test
np.tile(x_test ,(x_data_size ,1))
# 計(jì)算x_test與每一個(gè)樣本的差值
diffMat = np.tile(x_test ,(x_data_size ,1)) - x_data
# 計(jì)算差值的平方
sqDiffMat = diffMat**2
# 求和
sqDistances = sqDiffMat.sum(axis=1)
# 開(kāi)方
distances = sqDistances**0.5
# 從小到大排序
sortedDistances = distances.argsort()
classCount = {}
for i in range(k):
# 獲取標(biāo)簽
votelabel = y_data[sortedDistances[i]]
# 統(tǒng)計(jì)標(biāo)簽數(shù)量
classCount[votelabel] = classCount.get(votelabel, 0) + 1
# 根據(jù)operator.itemgetter(1)-第1個(gè)值對(duì)classCount排序共缕,然后再取倒序
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
# 獲取數(shù)量最多的標(biāo)簽
return sortedClassCount[0][0]
# 載入數(shù)據(jù)
iris = datasets.load_iris()
# 打亂數(shù)據(jù)
data_size = iris.data.shape[0]
index = [i for i in range(data_size)]
random.shuffle(index)
iris.data = iris.data[index]
iris.target = iris.target[index]
# 切分?jǐn)?shù)據(jù)集
test_size = 40
x_train = iris.data[test_size:]
x_test = iris.data[:test_size]
y_train = iris.target[test_size:]
y_test = iris.target[:test_size]
predictions = []
for i in range(x_test.shape[0]):
predictions.append(knn(x_test[i] ,x_train ,y_train ,5))
print(classification_report(y_test ,predictions))
QQ截圖20200409163319.png