Giter VIP home page Giter VIP logo

lihang-code's People

Contributors

alphadl avatar fengdu78 avatar mintisma avatar qianguyizhe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lihang-code's Issues

About Ch5 DT

The following code that creat a pdf:
tree_pic = export_graphviz(clf, out_file="mytree.pdf")
with open('mytree.pdf') as f:
dot_graph = f.read()

However, I can not open that, I wonder is there anything wrong?

第三章

def init(self, k=1):
self.k = k
self.kdtree = None

# 构建kd tree
def _fit(self, X, depth=0):
    try:
        k = self.k
    except IndexError as e:
        return None
    # 这里可以展开,通过方差选择axis
    axis = depth % k

维度k取1,坐标轴始终是零!

Perceptron 随机梯度下降问题

for d in range(len(X_train)): X = X_train[d] y = y_train[d] if y * self.sign(X, self.w, self.b) <= 0: self.w = self.w + self.l_rate*np.dot(y, X) self.b = self.b + self.l_rate*y wrong_count += 1 if wrong_count == 0: is_wrong = True
这样写是梯度下降,应该不是随机梯度下降,以下是修改后的随机梯度下降,请参考,如有误,还请指出:
for d in range(len(X_train)): x = X_train[d] y = y_train[d] if y * self.sign(x, self.w, self.b) <= 0: wrong_index_list.append(d) if len(wrong_index_list) == 0: break else: index = random.randint(0, len(wrong_index_list) - 1) w_index = wrong_index_list[index] self.w = self.w + self.l_rate*np.dot(y_train[w_index], X_train[w_index]) self.b = self.b + self.l_rate*y_train[w_index]

Chap 16. PCA 中SVD解法中参数的问题

numpy.linalg.svd(A) 中, 如果用多元随机变量的协方差的无偏样本对协方差矩阵C= Cov(X^T,X) = X^T*X/(n-1) 进行 SVD, A应该是中心化的X, 即
$$X = USV^h$$
$$C = VS U^h USV/(n-1) = V S^2 V^h $$

所以, 应该用 np.linalg.svd(X), 其中 X 做了中心化。实例中做标准化再 SVD 是用相关系数矩阵为标准做PCA。

相关资源参考: PCA 和 SVD 关系

第8章提升方法代码中G(x)函数的实现存在问题(同#11)

在第8章提升方法中,进行了二分类AdaBoost的实现,其中在G(x)函数中,根据当前阈值v得到的error与现有error的比较来决定是否更新最小误差error、分类器输出compare_array以及最好的阈值best_v,但是却没有对弱分类器的类型direct(“positive”或“nagetive”)进行更新。

原代码:
if weight_error < error:
error = weight_error
compare_array = _compare_array
best_v = v
return best_v, direct, error, compare_array

修正代码:
f_direct = "positive" #定义f_direct,为最终的direct
...
...
...
if weight_error < error:
error = weight_error
compare_array = _compare_array
best_v = v
f_direct = direct #对f_direct进行更新
return best_v, f_direct, error, compare_array

svm模型

您好,我直接运行svm代码,输出的score很低,只有0.5,而且多次运行存在score还不同,大部分结果都是很低

em算法实现的一个错误

def pmf(i, pro_A, pro_B, por_C):
    pro_1 = pro_A * math.pow(pro_B, data[i]) * math.pow(
        (1 - pro_B), 1 - data[i])
    pro_2 = pro_A* math.pow(pro_C, data[i]) * math.pow(
        (1 - pro_C), 1 - data[i])
    return pro_1 / (pro_1 + pro_2)

第四行是不是应该改成
pro_2 = (1-pro_A)* math.pow(pro_C, data[i]) * math.pow(
(1 - pro_C), 1 - data[i])

关于KNN中predict函数的疑问

您好,在此函数统计阶段,最后排序是对yi的标签出现的次数排序,但是单独拿出来代码好像是对yi标签的排序。求解答

问题

第3章k近邻法中In[10]第34行的n=10,这句话有用到吗?

第18章概率潜在语义分析模型代码有误

        # update P(w|z)
        for zi in range(self.K):
            sum2 = np.zeros((n_w))
            for wi in range(n_w):
                for di in range(n_d):
                    sum2[wi] = sum2[wi] + X[di, wi] * p_z_dw[di, wi, zi]
            sum1 = np.sum(sum2)
            if sum1 == 0:
                sum1 = 1
                for wi in range(n_w):
                    p_w_z[zi, wi] = sum2[wi] / sum1

是不是应改为

       # update P(w|z)
        for zi in range(self.K):
            sum2 = np.zeros((n_w))
            for wi in range(n_w):
                for di in range(n_d):
                    sum2[wi] = sum2[wi] + X[di, wi] * p_z_dw[di, wi, zi]
            sum1 = np.sum(sum2)
            if sum1 == 0:
                sum1 = 1
            for wi in range(n_w):
                p_w_z[zi, wi] = sum2[wi] / sum1

knn分类器

您好,我在执行您下面这段代码时觉得有点困惑
`def predict(self, X):
# 取出n个点
knn_list = []
for i in range(self.n):
dist = np.linalg.norm(X - self.X_train[i], ord=self.p)
knn_list.append((dist, self.y_train[i]))

    for i in range(self.n, len(self.X_train)):
        max_index = knn_list.index(max(knn_list, key=lambda x: x[0]))
        dist = np.linalg.norm(X - self.X_train[i], ord=self.p)
        if knn_list[max_index][0] > dist:
            knn_list[max_index] = (dist, self.y_train[i])
            
    # 统计
    knn = [k[-1] for k in knn_list]
    count_pairs = Counter(knn)
    max_count = sorted(count_pairs, key=lambda x:x)[-1]
    return max_count`

在max_count这一行,对count_pairs进行排序然后选择最大的那个作为标签;
您这边的key是不是有点问题,直接对dict排序会对键排序吧,这样如何能选择到value最大的呢?
我是这样写的max_count = sorted(count_pairs.items(), key=lambda x: x[1])[-1][0],不知道我理解的对不对

Adaboost代码有问题

在_G函数中
关于direct的保存,不能保证最终返回的direct 是错误最低的direct

SVM

训练后,alpha参数没更新,还是全1

第2章 感知机 scikit-learn实例

请问为什么clf = Perceptron(fit_intercept=False, max_iter=1000, shuffle=False)这里的fit_intercept要设置为false呢,这样不就没有截距了吗

内容咨询

有个问题想问下。我看您的代码还有文档内容和别人写的一模一样。所以您这个项目最多只是一个整理集合吧。有自己的内容吗?

SVM误差更新问题

更新参数

        self.alpha[i1] = alpha1_new
        self.alpha[i2] = alpha2_new
        self.b = b_new
        
        self.E[i1] = self._E(i1)
        self.E[i2] = self._E(i2)

想请教一下这边b更新后,除了index为i1和i2的其他的Ei为什么不需要更新。

谢谢。

_G 函数中 direct 的更新问题

def _G(self, features, labels, weights):
            ...
            if weight_error_positive < weight_error_nagetive:
                weight_error = weight_error_positive
                _compare_array = compare_array_positive
                direct = 'positive' 修改为 _direct = 'positive'
                
            else:
                weight_error = weight_error_nagetive
                _compare_array = compare_array_nagetive
                direct = 'nagetive' 修改为 _direct = 'positive'

            # print('v:{} error:{}'.format(v, weight_error))
            if weight_error < error:
                error = weight_error
                compare_array = _compare_array
                best_v = v
                加上 direct = _direct

就是direct也得像误差一样处理吧?否则后续非最优阈值对应的direct也可能改变已得结果

pagerank的代码感觉有问题

A.data /= rsums[ri]
这句话好像不太对
因为A.data返回的顺序并不是按行的顺序展开的
这就导致了错位的情况

第02章感知机有一处笔误

文档路径:lihang-code/第02章 感知机/2.Perceptron.ipynb

“随即梯度下降法 Stochastic Gradient Descent”

随即应该是随机吧?

决策树没有写后剪枝吗

sklearn库没有后剪枝操作,粗略看了下您的代码发现也没有,希望能加上借鉴一下。自己写的代码质量有点垃圾

第4章 朴素贝叶斯算法实现中的先验概率问题

您好,我对贝叶斯算法实现中的先验概率有些疑惑
`

计算概率

def calculate_probabilities(self, input_data):
    # summaries:{0.0: [(5.0, 0.37),(3.42, 0.40)], 1.0: [(5.8, 0.449),(2.7, 0.27)]}
    # input_data:[1.1, 2.2]
    probabilities = {}
    for label, value in self.model.items():
        probabilities[label] = 1 #probability[label]=1???
        for i in range(len(value)):
            mean, stdev = value[i]
            probabilities[label] *= self.gaussian_probability(input_data[i], mean, stdev) 
    return probabilities

`

为什么这里的probabilities[label]可以直接赋值为1呢,这样所有的类的先验概率是不是都一样了,为什么不根据样本计算这里的probabilities[label]呢
谢谢解答

第七章SVM

很奇怪,把下载的jupyter notebook直接运行(在vscode上,所有代码都执行了),分类成功率只有0.5左右,python版本为3.7.2。我把曲线画出来,基本就是 所有点都划分为一类了。 请问,能判断一下原因吗?

吐槽

话说当我将你的.ipynb中代码写成.py文件时,发现代码中变量的作用域很是不规范,不知道是不是我个人习惯的原因

第五章分类决策树代码问题

第五章,在分类决策树的train()函数里

sub_train_df = train_data.loc[train_data[max_feature_name] ==
                                          f].drop([max_feature_name], axis=1)

这里把当前最大特征那一行给drop掉了,导致下面通过index索引特征时会出现错误

# class Node
def predict(self, features):
        if self.root is True:
            return self.label
        return self.tree[features[self.feature]].predict(features)

建议可以直接把DTree类中的predict()函数的参数改成Dataframe格式,这样不再需要通过当先特征的下标来索引,而是直接通过特征来索引

# class DTree
def predict(self, X):
        m,n = np.shape(X)
        pred_res = []
        for i in range(m):
            temp = X.iloc[i,:]
            pred_res.append(self.tree.predict(temp))
        return pred_res

# class Node
def predict(self, test):
        if self.root is True:
            return self.label
        return self.tree[test[self.feature_name]].predict(test)

第7章 SVM

对eta有如下代码限制:
if eta <= 0:
# print('eta <= 0')
continue
不是很明白为什么限制<0,改成==0后也能正常运行,跑出过一两次0.9+
但由于大多数情况下score评分接近0.5,所以也不知道是否真的正确

最小二乘法的代码是不是有问题

def residuals_func_regularization(p, x, y): ret = fit_func(p, x) - y ret = np.append(ret, np.sqrt(0.5*regularization*np.square(p))) # L2范数作为正则化项 return ret

是不是应该改成
def residual_func_regularization(p, x, y): ret = fit_function(p, x) - y ret = np.append(ret / np.sqrt(p.size), np.sqrt(0.5 * regularization * np.square(p))) return ret

L2 范数 前面的是不是要处以N

关于第一章的:L2regularization

你好,作者,请问下第一张关于L2 reg的代码,您为什么使用的是L2: 0.5 * regularization * np.square(p)
而没有对平方求和?望得到您的答复,此致!

knn的 predict的优化

手动实现向量化的norm,应该通用性更好一些, 是否可行,请指正:
def predict_leon(self, X):
dist = np.power(X - self.X_train, self.p).sum(axis=1)
dist = np.power(dist, 1 / self.p)
knn = self.y_train[np.argsort(dist)[:self.n]]

    # 统计
    count_pairs = Counter(knn)
    max_count = sorted(count_pairs.items(), key=lambda x: x[1])[-1][0]
    return max_count

第10章隐形马尔可夫模型注释错误及维特比算法实现错误

在研读第10章隐形马尔可夫模型代码的时候,发现出现两个问题:

1.注释错误:
代码中的:N = len(Q) # 状态序列的大小
由定义可知Q应是所有可能状态的集合,而不是状态序列,状态序列为I
因此应更改为:N = len(Q) #可能存在的状态数量
以免误解

2.维特比算法实现中的错误:
在维特比算法实现的过程中多次用到argmax函数,由于其返回的是索引,因此应+1才能和正常的下标值相符合。原代码中在计算时未+1,但在输出时却加了1,导致算法计算的delta、psis参数部分正确、部分错误,最终预测的状态序列也是错误的。
原代码
psis[i][t] = np.argmax(np.multiply([delta[t-1] for delta in deltas], [a[i] for a in A])) #未+1
...
I[0][M-1] = np.argmax([delta[M-1] for delta in deltas]) #未+1
print('i%d=argmax[deltaT(i)]=%d' % (M, I[0][M-1]+1)) #输出时手动+1
for t in range(M-2, -1, -1):
I[0][t] = psis[int(I[0][t+1])][t+1] #因之前未+1,因此此处直接当索引使用了
print('i%d=psis%d(i%d)=%d' % (t+1, t+2, t+2, I[0][t]+1)) #输出时手动+1
print(I) #最终输出错误

建议在计算产生索引时统一+1,以生成符合实际的下标值;而在使用索引时再-1来避免超限
更改代码:
psis[i][t] = np.argmax(np.multiply([delta[t-1] for delta in deltas], [a[i] for a in A])) + 1 #索引值要+1
...
I[0][M-1] = np.argmax([delta[M-1] for delta in deltas]) + 1 #索引值要+1
print('i%d=argmax[deltaT(i)]=%d' % (M, I[0][M-1])) #直接输出
for t in range(M-2, -1, -1):
I[0][t] = psis[int(I[0][t+1]) - 1][t+1] #用做索引,因此-1
print('i%d=psis%d(i%d)=%d' % (t+1, t+2, t+2, I[0][t])) #直接输出
print("状态序列I:", I)

此时所有参数及最终结果均正确,且与书本中的结果一致。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.